Fix table list on designer, allow strange table and database names
[phpmyadmin.git] / js / designer / move.js
blobeb9d76bb5335e41580ec80a35a0d607afbe1228a
1 /* vim: set expandtab sw=4 ts=4 sts=4: */
2 /**
3  * @package PhpMyAdmin-Designer
4  */
5 var _change = 0; // variable to track any change in designer layout.
6 var _staying = 0; //  variable to check if the user stayed after seeing the confirmation prompt.
7 var show_relation_lines = true;
8 var always_show_text = false;
10 AJAX.registerTeardown('designer/move.js', function () {
11     $(document).off('fullscreenchange');
12     $('#selflink').show();
13 });
15 AJAX.registerOnload('designer/move.js', function () {
16     $('#page_content').css({ 'margin-left': '3px' });
17     $(document).on('fullscreenchange', function () {
18         if (! $.fn.fullScreen()) {
19             $('#page_content').removeClass('content_fullscreen')
20                 .css({ 'width': 'auto', 'height': 'auto' });
21             var $img = $('#toggleFullscreen').find('img');
22             var $span = $img.siblings('span');
23             $span.text($span.data('enter'));
24             $img.attr('src', $img.data('enter'))
25                 .attr('title', $span.data('enter'));
26         }
27     });
29     $('#selflink').hide();
30 });
32 function make_zero () {   // Function called if the user stays after seeing the confirmation prompt.
33     _staying = 0;
36 function MarkSaved () {
37     _change = 0;
38     $('#saved_state').text('');
41 function MarkUnsaved () {
42     _change = 1;
43     $('#saved_state').text('*');
46 var dx;
47 var dy;
48 var dy2;
49 var cur_click = null;
50 // update in Main()
51 var sm_x = 2;
52 var sm_y = 2;
53 var sm_s           = 0;
54 var sm_add         = 10;
55 var s_left         = 0;
56 var s_right        = 0;
57 var ON_relation    = 0;
58 var ON_grid        = 0;
59 var ON_display_field = 0;
60 // relation_style: 0 - angular 1 - direct
61 var ON_angular_direct = 1;
62 var click_field    = 0;
63 var link_relation  = '';
64 var id_hint;
65 var canvas_width   = 0;
66 var canvas_height  = 0;
67 var osn_tab_width  = 0;
68 var osn_tab_height = 0;
69 var height_field   = 7;
70 var Glob_X;
71 var Glob_Y;
72 var timeoutID;
73 var layer_menu_cur_click = 0;
74 var step = 10;
75 var old_class;
76 var from_array = [];
77 var downer;
78 var menu_moved = false;
79 var grid_size = 10;
81 // ------------------------------------------------------------------------------
82 // ------------------------------------------------------------------------------
83 // ------------------------------------------------------------------------------
86 // window.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP);
87 // ---CROSS
89 var isIE = document.all && !window.opera;
91 if (isIE) {
92     window.onscroll = General_scroll;
93     document.onselectstart = function () {
94         return false;
95     };
98 // document.onmouseup = function (){General_scroll_end();}
99 function MouseDown (e) {
100     Glob_X = dx = isIE ? e.clientX + document.body.scrollLeft : e.pageX;
101     Glob_Y = dy = isIE ? e.clientY + document.body.scrollTop : e.pageY;
103     if (e.target.tagName === 'SPAN') {
104         cur_click = e.target.parentNode.parentNode.parentNode.parentNode;
105     } else if (e.target.className === 'tab_zag_2') {
106         cur_click = e.target.parentNode.parentNode.parentNode;
107     } else if (e.target.className === 'icon') {
108         layer_menu_cur_click = 1;
109     } else if (e.target.className === 'M_butt') {
110         return false;
111     }
113     if (cur_click !== null) {
114         document.getElementById('canvas').style.display = 'none';
115         cur_click.style.zIndex = 2;
116     }
119 function MouseMove (e) {
120     if (e.preventDefault) {
121         e.preventDefault();
122     }
124     var new_dx = isIE ? e.clientX + document.body.scrollLeft : e.pageX;
125     var new_dy = isIE ? e.clientY + document.body.scrollTop : e.pageY;
127     var delta_x = Glob_X - new_dx;
128     var delta_y = Glob_Y - new_dy;
130     Glob_X = new_dx;
131     Glob_Y = new_dy;
133     if (cur_click !== null) {
134         MarkUnsaved();
136         var $cur_click = $(cur_click);
138         var cur_x = parseFloat($cur_click.attr('data-left') || $cur_click.css('left'));
139         var cur_y = parseFloat($cur_click.attr('data-top') || $cur_click.css('top'));
141         var new_x = cur_x - delta_x;
142         var new_y = cur_y - delta_y;
144         dx = new_dx;
145         dy = new_dy;
147         $cur_click.attr('data-left', new_x);
148         $cur_click.attr('data-top', new_y);
150         if (ON_grid) {
151             new_x = parseInt(new_x / grid_size) * grid_size;
152             new_y = parseInt(new_y / grid_size) * grid_size;
153         }
155         $cur_click.css('left', new_x + 'px');
156         $cur_click.css('top', new_y + 'px');
157     } else if (layer_menu_cur_click) {
158         dx = new_dx;
159         dy = new_dy;
160         if (menu_moved) {
161             delta_x = -delta_x;
162         }
163         var $layer_menu = $('#layer_menu');
164         var new_width = $layer_menu.width() + delta_x;
165         if (new_width < 150) {
166             new_width = 150;
167         } else {
168             dx = e.pageX;
169         }
170         $layer_menu.width(new_width);
171     }
173     if (ON_relation || ON_display_field) {
174         document.getElementById('designer_hint').style.left = (Glob_X + 20) + 'px';
175         document.getElementById('designer_hint').style.top  = (Glob_Y + 20) + 'px';
176     }
179 function MouseUp (e) {
180     if (cur_click !== null) {
181         document.getElementById('canvas').style.display = 'inline-block';
182         Re_load();
183         cur_click.style.zIndex = 1;
184         cur_click = null;
185     }
186     layer_menu_cur_click = 0;
187     // window.releaseEvents(Event.MOUSEMOVE);
189 // ------------------------------------------------------------------------------
190 // ------------------------------------------------------------------------------
191 // ------------------------------------------------------------------------------
194 // function ToInt(s)
195 // {
196 //    return s.substring(0,s.length-2)*1; //re = /(\d+)\w*/; newstr = str.replace(re, "$1");
197 // }
199 function Canvas_pos () {
200     canvas_width  = document.getElementById('canvas').width  = osn_tab_width  - 3;
201     canvas_height = document.getElementById('canvas').height = osn_tab_height - 3;
203     if (isIE) {
204         document.getElementById('canvas').style.width  = ((osn_tab_width  - 3) ? (osn_tab_width  - 3) : 0) + 'px';
205         document.getElementById('canvas').style.height = ((osn_tab_height - 3) ? (osn_tab_height - 3) : 0) + 'px';
206     }
209 function Osn_tab_pos () {
210     osn_tab_width  = parseInt(document.getElementById('osn_tab').style.width, 10);
211     osn_tab_height = parseInt(document.getElementById('osn_tab').style.height, 10);
214 function setDefaultValuesFromSavedState () {
215     if ($('#angular_direct_button').attr('class') === 'M_butt') {
216         ON_angular_direct = 0;
217     } else {
218         ON_angular_direct = 1;
219     }
220     Angular_direct();
222     if ($('#grid_button').attr('class') === 'M_butt') {
223         ON_grid = 1;
224     } else {
225         ON_grid = 0;
226     }
227     Grid();
229     var $relLineInvert = $('#relLineInvert');
230     if ($relLineInvert.attr('class') === 'M_butt') {
231         show_relation_lines = false;
232         $relLineInvert.attr('class', 'M_butt');
233     } else {
234         show_relation_lines = true;
235         $relLineInvert.attr('class', 'M_butt_Selected_down');
236     }
237     Relation_lines_invert();
239     if ($('#pin_Text').attr('class') === 'M_butt_Selected_down') {
240         always_show_text = true;
241         Show_text();
242     } else {
243         always_show_text = false;
244     }
246     var $key_SB_all = $('#key_SB_all');
247     if ($key_SB_all.attr('class') === 'M_butt_Selected_down') {
248         $key_SB_all.click();
249         $key_SB_all.toggleClass('M_butt_Selected_down');
250         $key_SB_all.toggleClass('M_butt');
251     }
253     var $key_Left_Right = $('#key_Left_Right');
254     if ($key_Left_Right.attr('class') === 'M_butt_Selected_down') {
255         $key_Left_Right.click();
256     }
259 function Main () {
260     // ---CROSS
262     document.getElementById('layer_menu').style.top = -1000 + 'px'; // fast scroll
263     // sm_x += document.getElementById('osn_tab').offsetLeft;
264     // sm_y += document.getElementById('osn_tab').offsetTop;
265     Osn_tab_pos();
266     Canvas_pos();
267     Small_tab_refresh();
268     Re_load();
269     setDefaultValuesFromSavedState();
270     id_hint = document.getElementById('designer_hint');
271     if (isIE) {
272         General_scroll();
273     }
277 // -------------------------------- new -----------------------------------------
278 function Rezize_osn_tab () {
279     var max_X = 0;
280     var max_Y = 0;
281     for (var key in j_tabs) {
282         var k_x = parseInt(document.getElementById(key).style.left, 10) + document.getElementById(key).offsetWidth;
283         var k_y = parseInt(document.getElementById(key).style.top, 10) + document.getElementById(key).offsetHeight;
284         max_X = max_X < k_x ? k_x : max_X;
285         max_Y = max_Y < k_y ? k_y : max_Y;
286     }
288     osn_tab_width  = max_X + 50;
289     osn_tab_height = max_Y + 50;
290     Canvas_pos();
291     document.getElementById('osn_tab').style.width = osn_tab_width + 'px';
292     document.getElementById('osn_tab').style.height = osn_tab_height + 'px';
294 // ------------------------------------------------------------------------------
297  * refreshes display, must be called after state changes
298  */
299 function Re_load () {
300     Rezize_osn_tab();
301     var n;
302     var x1;
303     var x2;
304     var a = [];
305     var K;
306     var key;
307     var key2;
308     var key3;
309     Clear();
310     for (K in contr) {
311         for (key in contr[K]) {
312             // contr name
313             for (key2 in contr[K][key]) {
314                 // table name
315                 for (key3 in contr[K][key][key2]) {
316                     // field name
317                     if (!document.getElementById('check_vis_' + key2).checked ||
318                         !document.getElementById('check_vis_' + contr[K][key][key2][key3][0]).checked) {
319                         // if hide
320                         continue;
321                     }
322                     var x1_left  = document.getElementById(key2).offsetLeft + 1;
323                     var x1_right = x1_left + document.getElementById(key2).offsetWidth;
324                     var x2_left  = document.getElementById(contr[K][key][key2][key3][0]).offsetLeft;
325                     var x2_right = x2_left + document.getElementById(contr[K][key][key2][key3][0]).offsetWidth;
326                     a[0] = Math.abs(x1_left - x2_left);
327                     a[1] = Math.abs(x1_left - x2_right);
328                     a[2] = Math.abs(x1_right - x2_left);
329                     a[3] = Math.abs(x1_right - x2_right);
330                     n = s_left = s_right = 0;
331                     for (var i = 1; i < 4; i++) {
332                         if (a[n] > a[i]) {
333                             n = i;
334                         }
335                     }
336                     if (n === 1) {
337                         x1 = x1_left - sm_s;
338                         x2 = x2_right + sm_s;
339                         if (x1 < x2) {
340                             n = 0;
341                         }
342                     }
343                     if (n === 2) {
344                         x1 = x1_right + sm_s;
345                         x2 = x2_left - sm_s;
346                         if (x1 > x2) {
347                             n = 0;
348                         }
349                     }
350                     if (n === 3) {
351                         x1 = x1_right + sm_s;
352                         x2 = x2_right + sm_s;
353                         s_right = 1;
354                     }
355                     if (n === 0) {
356                         x1 = x1_left - sm_s;
357                         x2 = x2_left - sm_s;
358                         s_left = 1;
359                     }
361                     var row_offset_top = 0;
362                     var tab_hide_button = document.getElementById('id_hide_tbody_' + key2);
364                     if (tab_hide_button.innerHTML === 'v') {
365                         var fromColumn = document.getElementById(key2 + '.' + key3);
366                         if (fromColumn) {
367                             row_offset_top = fromColumn.offsetTop;
368                         } else {
369                             continue;
370                         }
371                     }
373                     var y1 = document.getElementById(key2).offsetTop +
374                         row_offset_top +
375                         height_field;
378                     row_offset_top = 0;
379                     tab_hide_button = document.getElementById('id_hide_tbody_' + contr[K][key][key2][key3][0]);
380                     if (tab_hide_button.innerHTML === 'v') {
381                         var toColumn = document.getElementById(contr[K][key][key2][key3][0] +
382                             '.' + contr[K][key][key2][key3][1]);
383                         if (toColumn) {
384                             row_offset_top = toColumn.offsetTop;
385                         } else {
386                             continue;
387                         }
388                     }
390                     var y2 =
391                         document.getElementById(contr[K][key][key2][key3][0]).offsetTop +
392                         row_offset_top +
393                         height_field;
395                     var osn_tab = document.getElementById('osn_tab');
397                     Line0(
398                         x1 + osn_tab.offsetLeft,
399                         y1 - osn_tab.offsetTop,
400                         x2 + osn_tab.offsetLeft,
401                         y2 - osn_tab.offsetTop,
402                         getColorByTarget(contr[K][key][key2][key3][0] + '.' + contr[K][key][key2][key3][1])
403                     );
404                 }
405             }
406         }
407     }
411  * draws a line from x1:y1 to x2:y2 with color
412  */
413 function Line (x1, y1, x2, y2, color_line) {
414     var canvas = document.getElementById('canvas');
415     var ctx    = canvas.getContext('2d');
416     ctx.strokeStyle = color_line;
417     ctx.lineWidth = 1;
418     ctx.beginPath();
419     ctx.moveTo(x1, y1);
420     ctx.lineTo(x2, y2);
421     ctx.stroke();
425  * draws a relation/constraint line, whether angular or not
426  */
427 function Line0 (x1, y1, x2, y2, color_line) {
428     if (! show_relation_lines) {
429         return;
430     }
431     Circle(x1, y1, 3, 3, color_line);
432     Rect(x2 - 1, y2 - 2, 4, 4, color_line);
434     if (ON_angular_direct) {
435         Line2(x1, y1, x2, y2, color_line);
436     } else {
437         Line3(x1, y1, x2, y2, color_line);
438     }
442  * draws a angular relation/constraint line
443  */
444 function Line2 (x1, y1, x2, y2, color_line) {
445     var x1_ = x1;
446     var x2_ = x2;
448     if (s_right) {
449         x1_ += sm_add;
450         x2_ += sm_add;
451     } else if (s_left) {
452         x1_ -= sm_add;
453         x2_ -= sm_add;
454     } else if (x1 < x2) {
455         x1_ += sm_add;
456         x2_ -= sm_add;
457     } else {
458         x1_ -= sm_add;
459         x2_ += sm_add;
460     }
462     Line(x1, y1, x1_, y1, color_line);
463     Line(x2, y2, x2_, y2, color_line);
464     Line(x1_, y1, x2_, y2, color_line);
468  * draws a relation/constraint line
469  */
470 function Line3 (x1, y1, x2, y2, color_line) {
471     var x1_ = x1;
472     var x2_ = x2;
474     if (s_right) {
475         if (x1 < x2) {
476             x1_ += x2 - x1 + sm_add;
477             x2_ += sm_add;
478         } else {
479             x2_ += x1 - x2 + sm_add;
480             x1_ += sm_add;
481         }
483         Line(x1, y1, x1_, y1, color_line);
484         Line(x2, y2, x2_, y2, color_line);
485         Line(x1_, y1, x2_, y2, color_line);
486         return;
487     }
488     if (s_left) {
489         if (x1 < x2) {
490             x2_ -= x2 - x1 + sm_add;
491             x1_ -= sm_add;
492         } else {
493             x1_ -= x1 - x2 + sm_add;
494             x2_ -= sm_add;
495         }
497         Line(x1, y1, x1_, y1, color_line);
498         Line(x2, y2, x2_, y2, color_line);
499         Line(x1_, y1, x2_, y2, color_line);
500         return;
501     }
503     var x_s = (x1 + x2) / 2;
504     Line(x1, y1, x_s, y1, color_line);
505     Line(x_s, y2, x2, y2, color_line);
506     Line(x_s, y1, x_s, y2, color_line);
509 function Circle (x, y, r, w, color) {
510     var ctx = document.getElementById('canvas').getContext('2d');
511     ctx.beginPath();
512     ctx.moveTo(x, y);
513     ctx.lineWidth = w;
514     ctx.strokeStyle = color;
515     ctx.arc(x, y, r, 0, 2 * Math.PI, true);
516     ctx.stroke();
519 function Clear () {
520     var canvas = document.getElementById('canvas');
521     var ctx    = canvas.getContext('2d');
522     ctx.clearRect(0, 0, canvas_width, canvas_height);
525 function Rect (x1, y1, w, h, color) {
526     var ctx = document.getElementById('canvas').getContext('2d');
527     ctx.fillStyle = color;
528     ctx.fillRect(x1, y1, w, h);
530 // --------------------------- FULLSCREEN -------------------------------------
531 function Toggle_fullscreen () {
532     var value_sent = '';
533     var $img = $('#toggleFullscreen').find('img');
534     var $span = $img.siblings('span');
535     var $content = $('#page_content');
536     if (! $content.fullScreen()) {
537         $img.attr('src', $img.data('exit'))
538             .attr('title', $span.data('exit'));
539         $span.text($span.data('exit'));
540         $content
541             .addClass('content_fullscreen')
542             .css({ 'width': screen.width - 5, 'height': screen.height - 5 });
543         value_sent = 'on';
544         $content.fullScreen(true);
545     } else {
546         $img.attr('src', $img.data('enter'))
547             .attr('title', $span.data('enter'));
548         $span.text($span.data('enter'));
549         $content.fullScreen(false);
550         value_sent = 'off';
551     }
552     saveValueInConfig('full_screen', value_sent);
555 function addTableToTablesList (index, table_dom) {
556     var db = $(table_dom).find('.small_tab_pref').attr('db');
557     var table = $(table_dom).find('.small_tab_pref').attr('table_name');
558     var db_encoded = $(table_dom).find('.small_tab_pref').attr('db_url');
559     var table_encoded = $(table_dom).find('.small_tab_pref').attr('table_name_url');
560     var $new_table_line = $('<tr>' +
561         '    <td title="' + PMA_messages.strStructure + '"' +
562         '        width="1px"' +
563         '        class="L_butt2_1">' +
564         '        <img alt=""' +
565         '            db="' + db_encoded + '"' +
566         '            table_name="' + table_encoded + '"' +
567         '            class="scroll_tab_struct"' +
568         '            src="' + pmaThemeImage + 'designer/exec.png"/>' +
569         '    </td>' +
570         '    <td width="1px">' +
571         '        <input class="scroll_tab_checkbox"' +
572         '            title="' + PMA_messages.strHide + '"' +
573         '            id="check_vis_' + db_encoded + '.' + table_encoded + '"' +
574         '            style="margin:0;"' +
575         '            type="checkbox"' +
576         '            value="' + db_encoded + '.' + table_encoded + '"' +
577         '            checked="checked"' +
578         '            />' +
579         '    </td>' +
580         '    <td class="designer_Tabs"' +
581         '        designer_url_table_name="' + db_encoded + '.' + table_encoded + '">' + db + '.' + table + '</td>' +
582         '</tr>');
583     $('#id_scroll_tab table').first().append($new_table_line);
584     $($new_table_line).find('.scroll_tab_struct').click(function () {
585         Start_tab_upd(db, table);
586     });
587     $($new_table_line).on('click', '.designer_Tabs2,.designer_Tabs', function () {
588         Select_tab($(this).attr('designer_url_table_name'));
589     });
590     $($new_table_line).find('.scroll_tab_checkbox').click(function () {
591         VisibleTab(this,$(this).val());
592     });
593     var $tables_counter = $('#tables_counter');
594     $tables_counter.text(parseInt($tables_counter.text(), 10) + 1);
597 function Add_Other_db_tables () {
598     var button_options = {};
599     button_options[PMA_messages.strGo] = function () {
600         var db = $('#add_table_from').val();
601         var table = $('#add_table').val();
603         // Check if table already imported or not.
604         var $table = $('[id="' + encodeURIComponent(db) + '.' + encodeURIComponent(table) + '"]');
605         if ($table.length !== 0) {
606             PMA_ajaxShowMessage(
607                 PMA_sprintf(PMA_messages.strTableAlreadyExists, db + '.' + table),
608                 undefined,
609                 'error'
610             );
611             return;
612         }
614         $.post('db_designer.php', {
615             'ajax_request' : true,
616             'dialog' : 'add_table',
617             'db' : db,
618             'table' : table,
619             'server': PMA_commonParams.get('server')
620         }, function (data) {
621             var $newTableDom = $(data.message);
622             $newTableDom.find('a').first().remove();
623             $('#container-form').append($newTableDom);
624             enableTableEvents(null, $newTableDom);
625             addTableToTablesList(null, $newTableDom);
626             var dbEncoded = $($newTableDom).find('.small_tab_pref').attr('db_url');
627             var tableEncoded = $($newTableDom).find('.small_tab_pref').attr('table_name_url');
628             j_tabs[dbEncoded + '.' + tableEncoded] = 1;
629             MarkUnsaved();
630         });
631         $(this).dialog('close');
632     };
633     button_options[PMA_messages.strCancel] = function () {
634         $(this).dialog('close');
635     };
637     var $select_db = $('<select id="add_table_from"></select>');
638     $select_db.append('<option value="">' + PMA_messages.strNone + '</option>');
640     var $select_table = $('<select id="add_table"></select>');
641     $select_table.append('<option value="">' + PMA_messages.strNone + '</option>');
643     $.post('sql.php', {
644         'ajax_request' : true,
645         'sql_query' : 'SHOW databases;',
646         'server': PMA_commonParams.get('server')
647     }, function (data) {
648         $(data.message).find('table.table_results.data.ajax').find('td.data').each(function () {
649             var val = $(this)[0].innerText;
650             $select_db.append($('<option></option>').val(val).text(val));
651         });
652     });
654     var $form = $('<form action="" class="ajax"></form>')
655         .append($select_db).append($select_table);
656     $('<div id="page_add_tables_dialog"></div>')
657         .append($form)
658         .dialog({
659             appendTo: '#page_content',
660             title: PMA_messages.strAddTables,
661             width: 500,
662             modal: true,
663             buttons: button_options,
664             close: function () {
665                 $(this).remove();
666             }
667         });
669     $('#add_table_from').change(function () {
670         if ($(this).val()) {
671             var db_name = $(this).val();
672             var sql_query = 'SHOW tables;';
673             $.post('sql.php', {
674                 'ajax_request' : true,
675                 'sql_query': sql_query,
676                 'db' : db_name,
677                 'server': PMA_commonParams.get('server')
678             }, function (data) {
679                 $select_table.html('');
680                 var rows = $(data.message).find('table.table_results.data.ajax').find('td.data');
681                 if (rows.length === 0) {
682                     $select_table.append('<option value="">' + PMA_messages.strNone + '</option>');
683                 }
684                 rows.each(function () {
685                     var val = $(this)[0].innerText;
686                     $select_table.append($('<option></option>').val(val).text(val));
687                 });
688             });
689         }
690     });
694 // ------------------------------ NEW ------------------------------------------
696 function New () {
697     Prompt_to_save_current_page(function () {
698         Load_page(-1);
699     });
702 // ------------------------------ SAVE ------------------------------------------
703 // (del?) no for pdf
704 function Save (url) {
705     for (var key in j_tabs) {
706         document.getElementById('t_x_' + key + '_').value = parseInt(document.getElementById(key).style.left, 10);
707         document.getElementById('t_y_' + key + '_').value = parseInt(document.getElementById(key).style.top, 10);
708         document.getElementById('t_v_' + key + '_').value = document.getElementById('id_tbody_' + key).style.display === 'none' ? 0 : 1;
709         document.getElementById('t_h_' + key + '_').value = document.getElementById('check_vis_' + key).checked ? 1 : 0;
710     }
711     document.form1.action = url;
712     $(document.form1).submit();
715 function Get_url_pos (forceString) {
716     if (designer_tables_enabled || forceString) {
717         var poststr = '';
718         var argsep = PMA_commonParams.get('arg_separator');
719         var i = 1;
720         for (var key in j_tabs) {
721             poststr += argsep + 't_x[' + i + ']=' + parseInt(document.getElementById(key).style.left, 10);
722             poststr += argsep + 't_y[' + i + ']=' + parseInt(document.getElementById(key).style.top, 10);
723             poststr += argsep + 't_v[' + i + ']=' + (document.getElementById('id_tbody_' + key).style.display === 'none' ? 0 : 1);
724             poststr += argsep + 't_h[' + i + ']=' + (document.getElementById('check_vis_' + key).checked ? 1 : 0);
725             poststr += argsep + 't_db[' + i + ']=' + $(document.getElementById(key)).attr('db_url');
726             poststr += argsep + 't_tbl[' + i + ']=' + $(document.getElementById(key)).attr('table_name_url');
727             i++;
728         }
729         return poststr;
730     } else {
731         var coords = [];
732         for (var key in j_tabs) {
733             if (document.getElementById('check_vis_' + key).checked) {
734                 var x = parseInt(document.getElementById(key).style.left, 10);
735                 var y = parseInt(document.getElementById(key).style.top, 10);
736                 var tbCoords = new TableCoordinate(
737                     $(document.getElementById(key)).attr('db_url'),
738                     $(document.getElementById(key)).attr('table_name_url'),
739                     -1, x, y);
740                 coords.push(tbCoords);
741             }
742         }
743         return coords;
744     }
747 function Save2 (callback) {
748     if (designer_tables_enabled) {
749         var argsep = PMA_commonParams.get('arg_separator');
750         var poststr = 'operation=savePage' + argsep + 'save_page=same' + argsep + 'ajax_request=true';
751         poststr += argsep + 'server=' + server + argsep + 'db=' + encodeURIComponent(db) + argsep + 'selected_page=' + selected_page;
752         poststr += Get_url_pos();
754         var $msgbox = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
755         $.post('db_designer.php', poststr, function (data) {
756             if (data.success === false) {
757                 PMA_ajaxShowMessage(data.error, false);
758             } else {
759                 PMA_ajaxRemoveMessage($msgbox);
760                 PMA_ajaxShowMessage(PMA_messages.strModificationSaved);
761                 MarkSaved();
762                 if (typeof callback !== 'undefined') {
763                     callback();
764                 }
765             }
766         });
767     } else {
768         var name = $('#page_name').html().trim();
769         Save_to_selected_page(db, selected_page, name, Get_url_pos(), function (page) {
770             MarkSaved();
771             if (typeof callback !== 'undefined') {
772                 callback();
773             }
774         });
775     }
779 function submitSaveDialogAndClose (callback) {
780     var $form = $('#save_page');
781     var name = $form.find('input[name="selected_value"]').val().trim();
782     if (name === '') {
783         PMA_ajaxShowMessage(PMA_messages.strEnterValidPageName, false);
784         return;
785     }
786     $('#page_save_dialog').dialog('close');
788     if (designer_tables_enabled) {
789         var $msgbox = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
790         PMA_prepareForAjaxRequest($form);
791         $.post($form.attr('action'), $form.serialize() + Get_url_pos(), function (data) {
792             if (data.success === false) {
793                 PMA_ajaxShowMessage(data.error, false);
794             } else {
795                 PMA_ajaxRemoveMessage($msgbox);
796                 MarkSaved();
797                 if (data.id) {
798                     selected_page = data.id;
799                 }
800                 $('#page_name').text(name);
801                 if (typeof callback !== 'undefined') {
802                     callback();
803                 }
804             }
805         });
806     } else {
807         Save_to_new_page(db, name, Get_url_pos(), function (page) {
808             MarkSaved();
809             if (page.pg_nr) {
810                 selected_page = page.pg_nr;
811             }
812             $('#page_name').text(page.page_descr);
813             if (typeof callback !== 'undefined') {
814                 callback();
815             }
816         });
817     }
820 function Save3 (callback) {
821     if (selected_page !== -1) {
822         Save2(callback);
823     } else {
824         var button_options = {};
825         button_options[PMA_messages.strGo] = function () {
826             var $form = $('#save_page');
827             $form.submit();
828         };
829         button_options[PMA_messages.strCancel] = function () {
830             $(this).dialog('close');
831         };
833         var $form = $('<form action="db_designer.php" method="post" name="save_page" id="save_page" class="ajax"></form>')
834             .append('<input type="hidden" name="server" value="' + server + '" />')
835             .append($('<input type="hidden" name="db" />').val(db))
836             .append('<input type="hidden" name="operation" value="savePage" />')
837             .append('<input type="hidden" name="save_page" value="new" />')
838             .append('<label for="selected_value">' + PMA_messages.strPageName +
839                 '</label>:<input type="text" name="selected_value" />');
840         $form.on('submit', function (e) {
841             e.preventDefault();
842             submitSaveDialogAndClose(callback);
843         });
844         $('<div id="page_save_dialog"></div>')
845             .append($form)
846             .dialog({
847                 appendTo: '#page_content',
848                 title: PMA_messages.strSavePage,
849                 width: 300,
850                 modal: true,
851                 buttons: button_options,
852                 close: function () {
853                     $(this).remove();
854                 }
855             });
856     }
859 // ------------------------------ EDIT PAGES ------------------------------------------
860 function Edit_pages () {
861     Prompt_to_save_current_page(function () {
862         var button_options = {};
863         button_options[PMA_messages.strGo] = function () {
864             var $form = $('#edit_delete_pages');
865             var selected = $form.find('select[name="selected_page"]').val();
866             if (selected === '0') {
867                 PMA_ajaxShowMessage(PMA_messages.strSelectPage, 2000);
868                 return;
869             }
870             $(this).dialog('close');
871             Load_page(selected);
872         };
873         button_options[PMA_messages.strCancel] = function () {
874             $(this).dialog('close');
875         };
877         var $msgbox = PMA_ajaxShowMessage();
878         $.post('db_designer.php', {
879             'ajax_request': true,
880             'server': server,
881             'db': db,
882             'dialog': 'edit'
883         }, function (data) {
884             if (data.success === false) {
885                 PMA_ajaxShowMessage(data.error, false);
886             } else {
887                 PMA_ajaxRemoveMessage($msgbox);
889                 if (! designer_tables_enabled) {
890                     Create_page_list(db, function (options) {
891                         $('#selected_page').append(options);
892                     });
893                 }
894                 $('<div id="page_edit_dialog"></div>')
895                     .append(data.message)
896                     .dialog({
897                         appendTo: '#page_content',
898                         title: PMA_messages.strOpenPage,
899                         width: 350,
900                         modal: true,
901                         buttons: button_options,
902                         close: function () {
903                             $(this).remove();
904                         }
905                     });
906             }
907         }); // end $.get()
908     });
911 // -----------------------------  DELETE PAGES ---------------------------------------
912 function Delete_pages () {
913     var button_options = {};
914     button_options[PMA_messages.strGo] = function () {
915         var $form = $('#edit_delete_pages');
916         var selected = $form.find('select[name="selected_page"]').val();
917         if (selected === '0') {
918             PMA_ajaxShowMessage(PMA_messages.strSelectPage, 2000);
919             return;
920         }
922         var $msgbox = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
923         var deleting_current_page = selected === selected_page;
924         PMA_prepareForAjaxRequest($form);
926         if (designer_tables_enabled) {
927             $.post($form.attr('action'), $form.serialize(), function (data) {
928                 if (data.success === false) {
929                     PMA_ajaxShowMessage(data.error, false);
930                 } else {
931                     PMA_ajaxRemoveMessage($msgbox);
932                     if (deleting_current_page) {
933                         Load_page(null);
934                     } else {
935                         PMA_ajaxShowMessage(PMA_messages.strSuccessfulPageDelete);
936                     }
937                 }
938             }); // end $.post()
939         } else {
940             Delete_page(selected, function (success) {
941                 if (! success) {
942                     PMA_ajaxShowMessage('Error', false);
943                 } else {
944                     PMA_ajaxRemoveMessage($msgbox);
945                     if (deleting_current_page) {
946                         Load_page(null);
947                     } else {
948                         PMA_ajaxShowMessage(PMA_messages.strSuccessfulPageDelete);
949                     }
950                 }
951             });
952         }
954         $(this).dialog('close');
955     };
956     button_options[PMA_messages.strCancel] = function () {
957         $(this).dialog('close');
958     };
960     var $msgbox = PMA_ajaxShowMessage();
961     $.post('db_designer.php', {
962         'ajax_request': true,
963         'server': server,
964         'db': db,
965         'dialog': 'delete'
966     }, function (data) {
967         if (data.success === false) {
968             PMA_ajaxShowMessage(data.error, false);
969         } else {
970             PMA_ajaxRemoveMessage($msgbox);
972             if (! designer_tables_enabled) {
973                 Create_page_list(db, function (options) {
974                     $('#selected_page').append(options);
975                 });
976             }
978             $('<div id="page_delete_dialog"></div>')
979                 .append(data.message)
980                 .dialog({
981                     appendTo: '#page_content',
982                     title: PMA_messages.strDeletePage,
983                     width: 350,
984                     modal: true,
985                     buttons: button_options,
986                     close: function () {
987                         $(this).remove();
988                     }
989                 });
990         }
991     }); // end $.get()
994 // ------------------------------ SAVE AS PAGES ---------------------------------------
995 function Save_as () {
996     var button_options = {};
997     button_options[PMA_messages.strGo] = function () {
998         var $form           = $('#save_as_pages');
999         var selected_value  = $form.find('input[name="selected_value"]').val().trim();
1000         var $selected_page  = $form.find('select[name="selected_page"]');
1001         var choice          = $form.find('input[name="save_page"]:checked').val();
1002         var name            = '';
1004         if (choice === 'same') {
1005             if ($selected_page.val() === '0') {
1006                 PMA_ajaxShowMessage(PMA_messages.strSelectPage, 2000);
1007                 return;
1008             }
1009             name = $selected_page.find('option:selected').text();
1010         } else if (choice === 'new') {
1011             if (selected_value === '') {
1012                 PMA_ajaxShowMessage(PMA_messages.strEnterValidPageName, 2000);
1013                 return;
1014             }
1015             name = selected_value;
1016         }
1018         var $msgbox = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
1019         if (designer_tables_enabled) {
1020             PMA_prepareForAjaxRequest($form);
1021             $.post($form.attr('action'), $form.serialize() + Get_url_pos(), function (data) {
1022                 if (data.success === false) {
1023                     PMA_ajaxShowMessage(data.error, false);
1024                 } else {
1025                     PMA_ajaxRemoveMessage($msgbox);
1026                     MarkSaved();
1027                     if (data.id) {
1028                         selected_page = data.id;
1029                     }
1030                     Load_page(selected_page);
1031                 }
1032             }); // end $.post()
1033         } else {
1034             if (choice === 'same') {
1035                 var selected_page_id = $selected_page.find('option:selected').val();
1036                 Save_to_selected_page(db, selected_page_id, name, Get_url_pos(), function (page) {
1037                     PMA_ajaxRemoveMessage($msgbox);
1038                     MarkSaved();
1039                     if (page.pg_nr) {
1040                         selected_page = page.pg_nr;
1041                     }
1042                     Load_page(selected_page);
1043                 });
1044             } else if (choice === 'new') {
1045                 Save_to_new_page(db, name, Get_url_pos(), function (page) {
1046                     PMA_ajaxRemoveMessage($msgbox);
1047                     MarkSaved();
1048                     if (page.pg_nr) {
1049                         selected_page = page.pg_nr;
1050                     }
1051                     Load_page(selected_page);
1052                 });
1053             }
1054         }
1056         $(this).dialog('close');
1057     };
1058     button_options[PMA_messages.strCancel] = function () {
1059         $(this).dialog('close');
1060     };
1062     var $msgbox = PMA_ajaxShowMessage();
1063     $.post('db_designer.php', {
1064         'ajax_request': true,
1065         'server': server,
1066         'db': db,
1067         'dialog': 'save_as'
1068     }, function (data) {
1069         if (data.success === false) {
1070             PMA_ajaxShowMessage(data.error, false);
1071         } else {
1072             PMA_ajaxRemoveMessage($msgbox);
1074             if (! designer_tables_enabled) {
1075                 Create_page_list(db, function (options) {
1076                     $('#selected_page').append(options);
1077                 });
1078             }
1080             $('<div id="page_save_as_dialog"></div>')
1081                 .append(data.message)
1082                 .dialog({
1083                     appendTo: '#page_content',
1084                     title: PMA_messages.strSavePageAs,
1085                     width: 450,
1086                     modal: true,
1087                     buttons: button_options,
1088                     close: function () {
1089                         $(this).remove();
1090                     }
1091                 });
1092             // select current page by default
1093             if (selected_page !== -1) {
1094                 $('select[name="selected_page"]').val(selected_page);
1095             }
1096         }
1097     }); // end $.get()
1100 function Prompt_to_save_current_page (callback) {
1101     if (_change === 1 || selected_page === -1) {
1102         var button_options = {};
1103         button_options[PMA_messages.strYes] = function () {
1104             $(this).dialog('close');
1105             Save3(callback);
1106         };
1107         button_options[PMA_messages.strNo] = function () {
1108             $(this).dialog('close');
1109             callback();
1110         };
1111         button_options[PMA_messages.strCancel] = function () {
1112             $(this).dialog('close');
1113         };
1114         $('<div id="prompt_save_dialog"></div>')
1115             .append('<div>' + PMA_messages.strLeavingPage + '</div>')
1116             .dialog({
1117                 appendTo: '#page_content',
1118                 title: PMA_messages.strSavePage,
1119                 width: 300,
1120                 modal: true,
1121                 buttons: button_options,
1122                 close: function () {
1123                     $(this).remove();
1124                 }
1125             });
1126     } else {
1127         callback();
1128     }
1131 // ------------------------------ EXPORT PAGES ---------------------------------------
1132 function Export_pages () {
1133     var button_options = {};
1134     button_options[PMA_messages.strGo] = function () {
1135         $('#id_export_pages').submit();
1136         $(this).dialog('close');
1137     };
1138     button_options[PMA_messages.strCancel] = function () {
1139         $(this).dialog('close');
1140     };
1141     var $msgbox = PMA_ajaxShowMessage();
1142     var argsep = PMA_commonParams.get('arg_separator');
1144     $.post('db_designer.php', {
1145         'ajax_request': true,
1146         'server': server,
1147         'db': db,
1148         'dialog': 'export',
1149         'selected_page': selected_page
1150     }, function (data) {
1151         if (data.success === false) {
1152             PMA_ajaxShowMessage(data.error, false);
1153         } else {
1154             PMA_ajaxRemoveMessage($msgbox);
1156             var $form = $(data.message);
1157             if (!designer_tables_enabled) {
1158                 $form.append('<input type="hidden" name="offline_export" value="true" />');
1159             }
1160             $.each(Get_url_pos(true).substring(1).split(argsep), function () {
1161                 var pair = this.split('=');
1162                 var input = $('<input type="hidden" />');
1163                 input.attr('name', pair[0]);
1164                 input.attr('value', pair[1]);
1165                 $form.append(input);
1166             });
1167             var $formatDropDown = $form.find('#plugins');
1168             $formatDropDown.change(function () {
1169                 var format = $formatDropDown.val();
1170                 $form.find('.format_specific_options').hide();
1171                 $form.find('#' + format + '_options').show();
1172             }).trigger('change');
1174             $('<div id="page_export_dialog"></div>')
1175                 .append($form)
1176                 .dialog({
1177                     appendTo: '#page_content',
1178                     title: PMA_messages.strExportRelationalSchema,
1179                     width: 550,
1180                     modal: true,
1181                     buttons: button_options,
1182                     close: function () {
1183                         $(this).remove();
1184                     }
1185                 });
1186         }
1187     }); // end $.get()
1188 }// end export pages
1190 function Load_page (page) {
1191     if (designer_tables_enabled) {
1192         var param_page = '';
1193         var argsep = PMA_commonParams.get('arg_separator');
1194         if (page !== null) {
1195             param_page = argsep + 'page=' + page;
1196         }
1197         $('<a href="db_designer.php?server=' + server + argsep + 'db=' + encodeURIComponent(db) + param_page + '"></a>')
1198             .appendTo($('#page_content'))
1199             .click();
1200     } else {
1201         if (page === null) {
1202             Show_tables_in_landing_page(db);
1203         } else if (page > -1) {
1204             Load_HTML_for_page(page);
1205         } else if (page === -1) {
1206             Show_new_page_tables(true);
1207         }
1208     }
1209     MarkSaved();
1212 function Grid () {
1213     var value_sent = '';
1214     if (!ON_grid) {
1215         ON_grid = 1;
1216         value_sent = 'on';
1217         document.getElementById('grid_button').className = 'M_butt_Selected_down';
1218     } else {
1219         document.getElementById('grid_button').className = 'M_butt';
1220         ON_grid = 0;
1221         value_sent = 'off';
1222     }
1223     saveValueInConfig('snap_to_grid', value_sent);
1226 function Angular_direct () {
1227     var value_sent = '';
1228     if (ON_angular_direct) {
1229         ON_angular_direct = 0;
1230         value_sent = 'angular';
1231         document.getElementById('angular_direct_button').className = 'M_butt_Selected_down';
1232     } else {
1233         ON_angular_direct = 1;
1234         value_sent = 'direct';
1235         document.getElementById('angular_direct_button').className = 'M_butt';
1236     }
1237     saveValueInConfig('angular_direct', value_sent);
1238     Re_load();
1241 function saveValueInConfig (index_sent, value_sent) {
1242     $.post('db_designer.php',
1243         { operation: 'save_setting_value', index: index_sent, ajax_request: true, server: server, value: value_sent },
1244         function (data) {
1245             if (data.success === false) {
1246                 PMA_ajaxShowMessage(data.error, false);
1247             }
1248         });
1251 // ++++++++++++++++++++++++++++++ RELATION ++++++++++++++++++++++++++++++++++++++
1252 function Start_relation () {
1253     if (ON_display_field) {
1254         return;
1255     }
1257     if (!ON_relation) {
1258         document.getElementById('foreign_relation').style.display = '';
1259         ON_relation = 1;
1260         document.getElementById('designer_hint').innerHTML = PMA_messages.strSelectReferencedKey;
1261         document.getElementById('designer_hint').style.display = 'block';
1262         document.getElementById('rel_button').className = 'M_butt_Selected_down';
1263     } else {
1264         document.getElementById('designer_hint').innerHTML = '';
1265         document.getElementById('designer_hint').style.display = 'none';
1266         document.getElementById('rel_button').className = 'M_butt';
1267         click_field = 0;
1268         ON_relation = 0;
1269     }
1272 // table field
1273 function Click_field (db, T, f, PK) {
1274     PK = parseInt(PK);
1275     var argsep = PMA_commonParams.get('arg_separator');
1276     if (ON_relation) {
1277         if (!click_field) {
1278             // .style.display=='none'        .style.display = 'none'
1279             if (!PK) {
1280                 alert(PMA_messages.strPleaseSelectPrimaryOrUniqueKey);
1281                 return;// 0;
1282             }// PK
1283             if (j_tabs[db + '.' + T] !== 1) {
1284                 document.getElementById('foreign_relation').style.display = 'none';
1285             }
1286             click_field = 1;
1287             link_relation = 'DB1=' + db + argsep + 'T1=' + T + argsep + 'F1=' + f;
1288             document.getElementById('designer_hint').innerHTML = PMA_messages.strSelectForeignKey;
1289         } else {
1290             Start_relation(); // hidden hint...
1291             if (j_tabs[db + '.' + T] !== 1 || !PK) {
1292                 document.getElementById('foreign_relation').style.display = 'none';
1293             }
1294             var left = Glob_X - (document.getElementById('layer_new_relation').offsetWidth >> 1);
1295             document.getElementById('layer_new_relation').style.left = left + 'px';
1296             var top = Glob_Y - document.getElementById('layer_new_relation').offsetHeight;
1297             document.getElementById('layer_new_relation').style.top  = top + 'px';
1298             document.getElementById('layer_new_relation').style.display = 'block';
1299             link_relation += argsep + 'DB2=' + db + argsep + 'T2=' + T + argsep + 'F2=' + f;
1300         }
1301     }
1303     if (ON_display_field) {
1304         // if is display field
1305         if (display_field[T] === f) {
1306             old_class = 'tab_field';
1307             delete display_field[T];
1308         } else {
1309             old_class = 'tab_field_3';
1310             if (display_field[T]) {
1311                 document.getElementById('id_tr_' + T + '.' + display_field[T]).className = 'tab_field';
1312                 delete display_field[T];
1313             }
1314             display_field[T] = f;
1315         }
1316         ON_display_field = 0;
1317         document.getElementById('designer_hint').innerHTML = '';
1318         document.getElementById('designer_hint').style.display = 'none';
1319         document.getElementById('display_field_button').className = 'M_butt';
1321         var $msgbox = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
1322         $.post('db_designer.php',
1323             { operation: 'setDisplayField', ajax_request: true, server: server, db: db, table: T, field: f },
1324             function (data) {
1325                 if (data.success === false) {
1326                     PMA_ajaxShowMessage(data.error, false);
1327                 } else {
1328                     PMA_ajaxRemoveMessage($msgbox);
1329                     PMA_ajaxShowMessage(PMA_messages.strModificationSaved);
1330                 }
1331             });
1332     }
1335 function New_relation () {
1336     document.getElementById('layer_new_relation').style.display = 'none';
1337     var argsep = PMA_commonParams.get('arg_separator');
1338     link_relation += argsep + 'server=' + server + argsep + 'db=' + db + argsep + 'db2=p';
1339     link_relation += argsep + 'on_delete=' + document.getElementById('on_delete').value + argsep + 'on_update=' + document.getElementById('on_update').value;
1340     link_relation += argsep + 'operation=addNewRelation' + argsep + 'ajax_request=true';
1342     var $msgbox = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
1343     $.post('db_designer.php', link_relation, function (data) {
1344         if (data.success === false) {
1345             PMA_ajaxShowMessage(data.error, false);
1346         } else {
1347             PMA_ajaxRemoveMessage($msgbox);
1348             Load_page(selected_page);
1349         }
1350     }); // end $.post()
1353 // -------------------------- create tables -------------------------------------
1355 function Start_table_new () {
1356     PMA_commonParams.set('table', '');
1357     PMA_commonActions.refreshMain('tbl_create.php');
1360 function Start_tab_upd (db, table) {
1361     PMA_commonParams.set('db', db);
1362     PMA_commonParams.set('table', table);
1363     PMA_commonActions.refreshMain('tbl_structure.php');
1365 // --------------------------- hide tables --------------------------------------
1367 // max/min all tables
1368 function Small_tab_all (id_this) {
1369     var icon = id_this.children[0];
1370     var value_sent = '';
1372     if (icon.alt === 'v') {
1373         $('.designer_tab .small_tab,.small_tab2').each(function(index, element) {
1374             if ($(element).text() === 'v') {
1375                 Small_tab($(element).attr('table_name'), 0);
1376             }
1377         });
1378         icon.alt = '>';
1379         icon.src = icon.dataset.right;
1380         value_sent = 'v';
1381     } else {
1382         $('.designer_tab .small_tab,.small_tab2').each(function(index, element) {
1383             if ($(element).text() !== 'v') {
1384                 Small_tab($(element).attr('table_name'), 0);
1385             }
1386         });
1387         icon.alt = 'v';
1388         icon.src = icon.dataset.down;
1389         value_sent = '>';
1390     }
1391     saveValueInConfig('small_big_all', value_sent);
1392     $('#key_SB_all').toggleClass('M_butt_Selected_down');
1393     $('#key_SB_all').toggleClass('M_butt');
1394     Re_load();
1397 // invert max/min all tables
1398 function Small_tab_invert () {
1399     $('.designer_tab .small_tab,.small_tab2').each(function(index, element) {
1400         Small_tab($(element).attr('table_name'), 0);
1401     });
1402     Re_load();
1405 function Relation_lines_invert () {
1406     show_relation_lines = ! show_relation_lines;
1407     saveValueInConfig('relation_lines', show_relation_lines);
1408     $('#relLineInvert').toggleClass('M_butt_Selected_down');
1409     $('#relLineInvert').toggleClass('M_butt');
1410     Re_load();
1413 function Small_tab_refresh () {
1414     for (var key in j_tabs) {
1415         if (document.getElementById('id_hide_tbody_' + key).innerHTML !== 'v') {
1416             Small_tab(key, 0);
1417         }
1418     }
1421 function Small_tab (t, re_load) {
1422     var id      = document.getElementById('id_tbody_' + t);
1423     var id_this = document.getElementById('id_hide_tbody_' + t);
1424     var id_t    = document.getElementById(t);
1425     if (id_this.innerHTML === 'v') {
1426         // ---CROSS
1427         id.style.display = 'none';
1428         id_this.innerHTML = '>';
1429     } else {
1430         id.style.display = '';
1431         id_this.innerHTML = 'v';
1432     }
1433     if (re_load) {
1434         Re_load();
1435     }
1437 // ------------------------------------------------------------------------------
1438 function Select_tab (t) {
1439     var id_zag = document.getElementById('id_zag_' + t);
1440     if (id_zag.className !== 'tab_zag_3') {
1441         document.getElementById('id_zag_' + t).className = 'tab_zag_2';
1442     } else {
1443         document.getElementById('id_zag_' + t).className = 'tab_zag';
1444     }
1445     // ----------
1446     var id_t = document.getElementById(t);
1447     window.scrollTo(parseInt(id_t.style.left, 10) - 300, parseInt(id_t.style.top, 10) - 300);
1448     setTimeout(
1449         function () {
1450             document.getElementById('id_zag_' + t).className = 'tab_zag';
1451         },
1452         800
1453     );
1455 // ------------------------------------------------------------------------------
1457 function Canvas_click (id, event) {
1458     var n = 0;
1459     var relation_name = 0;
1460     var selected = 0;
1461     var a = [];
1462     var Key0;
1463     var Key1;
1464     var Key2;
1465     var Key3;
1466     var Key;
1467     var x1;
1468     var x2;
1469     var K;
1470     var key;
1471     var key2;
1472     var key3;
1473     var Local_X = isIE ? event.clientX + document.body.scrollLeft : event.pageX;
1474     var Local_Y = isIE ? event.clientY + document.body.scrollTop : event.pageY;
1475     Local_X -= $('#osn_tab').offset().left;
1476     Local_Y -= $('#osn_tab').offset().top;
1477     Clear();
1478     for (K in contr) {
1479         for (key in contr[K]) {
1480             for (key2 in contr[K][key]) {
1481                 for (key3 in contr[K][key][key2]) {
1482                     if (! document.getElementById('check_vis_' + key2).checked ||
1483                         ! document.getElementById('check_vis_' + contr[K][key][key2][key3][0]).checked) {
1484                         continue; // if hide
1485                     }
1486                     var x1_left  = document.getElementById(key2).offsetLeft + 1;// document.getElementById(key2+"."+key3).offsetLeft;
1487                     var x1_right = x1_left + document.getElementById(key2).offsetWidth;
1488                     var x2_left  = document.getElementById(contr[K][key][key2][key3][0]).offsetLeft;// +document.getElementById(contr[K][key2][key3][0]+"."+contr[K][key2][key3][1]).offsetLeft
1489                     var x2_right = x2_left + document.getElementById(contr[K][key][key2][key3][0]).offsetWidth;
1490                     a[0] = Math.abs(x1_left - x2_left);
1491                     a[1] = Math.abs(x1_left - x2_right);
1492                     a[2] = Math.abs(x1_right - x2_left);
1493                     a[3] = Math.abs(x1_right - x2_right);
1494                     n = s_left = s_right = 0;
1495                     for (var i = 1; i < 4; i++) {
1496                         if (a[n] > a[i]) {
1497                             n = i;
1498                         }
1499                     }
1500                     if (n === 1) {
1501                         x1 = x1_left - sm_s;
1502                         x2 = x2_right + sm_s;
1503                         if (x1 < x2) {
1504                             n = 0;
1505                         }
1506                     }
1507                     if (n === 2) {
1508                         x1 = x1_right + sm_s;
1509                         x2 = x2_left - sm_s;
1510                         if (x1 > x2) {
1511                             n = 0;
1512                         }
1513                     }
1514                     if (n === 3) {
1515                         x1 = x1_right + sm_s;
1516                         x2 = x2_right + sm_s;
1517                         s_right = 1;
1518                     }
1519                     if (n === 0) {
1520                         x1 = x1_left - sm_s;
1521                         x2 = x2_left - sm_s;
1522                         s_left    = 1;
1523                     }
1525                     var y1 = document.getElementById(key2).offsetTop + document.getElementById(key2 + '.' + key3).offsetTop + height_field;
1526                     var y2 = document.getElementById(contr[K][key][key2][key3][0]).offsetTop +
1527                                      document.getElementById(contr[K][key][key2][key3][0] + '.' + contr[K][key][key2][key3][1]).offsetTop + height_field;
1529                     if (!selected && Local_X > x1 - 10 && Local_X < x1 + 10 && Local_Y > y1 - 7 && Local_Y < y1 + 7) {
1530                         Line0(
1531                             x1 + osn_tab.offsetLeft,
1532                             y1 - osn_tab.offsetTop,
1533                             x2 + osn_tab.offsetLeft,
1534                             y2 - osn_tab.offsetTop,
1535                             'rgba(255,0,0,1)');
1537                         selected = 1; // Rect(x1-sm_x,y1-sm_y,10,10,"rgba(0,255,0,1)");
1538                         relation_name = key; //
1539                         Key0 = contr[K][key][key2][key3][0];
1540                         Key1 = contr[K][key][key2][key3][1];
1541                         Key2 = key2;
1542                         Key3 = key3;
1543                         Key = K;
1544                     } else {
1545                         Line0(
1546                             x1 + osn_tab.offsetLeft,
1547                             y1 - osn_tab.offsetTop,
1548                             x2 + osn_tab.offsetLeft,
1549                             y2 - osn_tab.offsetTop,
1550                             getColorByTarget(contr[K][key][key2][key3][0] + '.' + contr[K][key][key2][key3][1])
1551                         );
1552                     }
1553                 }
1554             }
1555         }
1556     }
1557     if (selected) {
1558         // select relations
1559         var left = Glob_X - (document.getElementById('layer_upd_relation').offsetWidth >> 1);
1560         document.getElementById('layer_upd_relation').style.left = left + 'px';
1561         var top = Glob_Y - document.getElementById('layer_upd_relation').offsetHeight - 10;
1562         document.getElementById('layer_upd_relation').style.top = top + 'px';
1563         document.getElementById('layer_upd_relation').style.display = 'block';
1564         var argsep = PMA_commonParams.get('arg_separator');
1565         link_relation = 'T1=' + Key0 + argsep + 'F1=' + Key1 + argsep + 'T2=' + Key2 + argsep + 'F2=' + Key3 + argsep + 'K=' + Key;
1566     }
1569 function Upd_relation () {
1570     document.getElementById('layer_upd_relation').style.display = 'none';
1571     var argsep = PMA_commonParams.get('arg_separator');
1572     link_relation += argsep + 'server=' + server + argsep + 'db=' + db;
1573     link_relation += argsep + 'operation=removeRelation' + argsep + 'ajax_request=true';
1575     var $msgbox = PMA_ajaxShowMessage(PMA_messages.strProcessingRequest);
1576     $.post('db_designer.php', link_relation, function (data) {
1577         if (data.success === false) {
1578             PMA_ajaxShowMessage(data.error, false);
1579         } else {
1580             PMA_ajaxRemoveMessage($msgbox);
1581             Load_page(selected_page);
1582         }
1583     }); // end $.post()
1586 function VisibleTab (id, t_n) {
1587     if (id.checked) {
1588         document.getElementById(t_n).style.display = 'block';
1589     } else {
1590         document.getElementById(t_n).style.display = 'none';
1591     }
1592     Re_load();
1595 // max/min all tables
1596 function Hide_tab_all (id_this) {
1597     if (id_this.alt === 'v') {
1598         id_this.alt = '>';
1599         id_this.src = id_this.dataset.right;
1600     } else {
1601         id_this.alt = 'v';
1602         id_this.src = id_this.dataset.down;
1603     }
1604     var E = document.form1;
1605     for (var i = 0; i < E.elements.length; i++) {
1606         if (E.elements[i].type === 'checkbox' && E.elements[i].id.substring(0, 10) === 'check_vis_') {
1607             if (id_this.alt === 'v') {
1608                 E.elements[i].checked = true;
1609                 document.getElementById(E.elements[i].value).style.display = '';
1610             } else {
1611                 E.elements[i].checked = false;
1612                 document.getElementById(E.elements[i].value).style.display = 'none';
1613             }
1614         }
1615     }
1616     Re_load();
1619 function in_array_k (x, m) {
1620     var b = 0;
1621     for (var u in m) {
1622         if (x === u) {
1623             b = 1;
1624             break;
1625         }
1626     }
1627     return b;
1630 function No_have_constr (id_this) {
1631     var a = [];
1632     var K;
1633     var key;
1634     var key2;
1635     var key3;
1636     for (K in contr) {
1637         for (key in contr[K]) {
1638             // contr name
1639             for (key2 in contr[K][key]) {
1640                 // table name
1641                 for (key3 in contr[K][key][key2]) {
1642                     // field name
1643                     a[key2] = a[contr[K][key][key2][key3][0]] = 1; // exist constr
1644                 }
1645             }
1646         }
1647     }
1649     if (id_this.alt === 'v') {
1650         id_this.alt = '>';
1651         id_this.src = id_this.dataset.right;
1652     } else {
1653         id_this.alt = 'v';
1654         id_this.src = id_this.dataset.down;
1655     }
1656     var E = document.form1;
1657     for (var i = 0; i < E.elements.length; i++) {
1658         if (E.elements[i].type === 'checkbox' && E.elements[i].id.substring(0, 10) === 'check_vis_') {
1659             if (!in_array_k(E.elements[i].value, a)) {
1660                 if (id_this.alt === 'v') {
1661                     E.elements[i].checked = true;
1662                     document.getElementById(E.elements[i].value).style.display = '';
1663                 } else {
1664                     E.elements[i].checked = false;
1665                     document.getElementById(E.elements[i].value).style.display = 'none';
1666                 }
1667             }
1668         }
1669     }
1672 function General_scroll () {
1673     /*
1674     if (!document.getElementById('show_relation_olways').checked) {
1675         document.getElementById("canvas").style.display = 'none';
1676         clearTimeout(timeoutID);
1677         timeoutID = setTimeout(General_scroll_end, 500);
1678     }
1679     */
1680     // if (timeoutID)
1681     clearTimeout(timeoutID);
1682     timeoutID = setTimeout(
1683         function () {
1684             document.getElementById('top_menu').style.left = document.body.scrollLeft + 'px';
1685             document.getElementById('top_menu').style.top  = document.body.scrollTop + 'px';
1686         },
1687         200
1688     );
1691 // max/min all tables
1692 function Show_left_menu (id_this) {
1693     var icon = id_this.children[0];
1694     $('#key_Show_left_menu').toggleClass('M_butt_Selected_down');
1695     if (icon.alt === 'v') {
1696         document.getElementById('layer_menu').style.top = '0px';
1697         document.getElementById('layer_menu').style.display = 'block';
1698         icon.alt = '>';
1699         icon.src = icon.dataset.up;
1700         if (isIE) {
1701             General_scroll();
1702         }
1703     } else {
1704         document.getElementById('layer_menu').style.top = -1000 + 'px'; // fast scroll
1705         document.getElementById('layer_menu').style.display = 'none';
1706         icon.alt = 'v';
1707         icon.src = icon.dataset.down;
1708     }
1710 // ------------------------------------------------------------------------------
1711 function Side_menu_right (id_this) {
1712     $('#side_menu').toggleClass('right');
1713     $('#layer_menu').toggleClass('left');
1714     var icon = $(id_this.childNodes[0]);
1715     var current = icon.attr('src');
1716     icon.attr('src', icon.attr('data-right')).attr('data-right', current);
1718     icon = $(document.getElementById('layer_menu_sizer').childNodes[0])
1719         .toggleClass('floatleft')
1720         .toggleClass('floatright')
1721         .children();
1722     current = icon.attr('src');
1723     icon.attr('src', icon.attr('data-right'));
1724     icon.attr('data-right', current);
1725     menu_moved = !menu_moved;
1726     saveValueInConfig('side_menu', $('#side_menu').hasClass('right'));
1727     $('#key_Left_Right').toggleClass('M_butt_Selected_down');
1728     $('#key_Left_Right').toggleClass('M_butt');
1730 // ------------------------------------------------------------------------------
1731 function Show_text () {
1732     $('#side_menu').find('.hidable').show();
1734 function Hide_text () {
1735     if (!always_show_text) {
1736         $('#side_menu').find('.hidable').hide();
1737     }
1739 function Pin_text () {
1740     always_show_text = !always_show_text;
1741     $('#pin_Text').toggleClass('M_butt_Selected_down');
1742     $('#pin_Text').toggleClass('M_butt');
1743     saveValueInConfig('pin_text', always_show_text);
1745 // ------------------------------------------------------------------------------
1746 function Start_display_field () {
1747     if (ON_relation) {
1748         return;
1749     }
1750     if (!ON_display_field) {
1751         ON_display_field = 1;
1752         document.getElementById('designer_hint').innerHTML = PMA_messages.strChangeDisplay;
1753         document.getElementById('designer_hint').style.display = 'block';
1754         document.getElementById('display_field_button').className = 'M_butt_Selected_down';// '#FFEE99';gray #AAAAAA
1756         if (isIE) { // correct for IE
1757             document.getElementById('display_field_button').className = 'M_butt_Selected_down_IE';
1758         }
1759     } else {
1760         document.getElementById('designer_hint').innerHTML = '';
1761         document.getElementById('designer_hint').style.display = 'none';
1762         document.getElementById('display_field_button').className = 'M_butt';
1763         ON_display_field = 0;
1764     }
1766 // ------------------------------------------------------------------------------
1767 var TargetColors = [];
1768 function getColorByTarget (target) {
1769     var color = '';  // "rgba(0,100,150,1)";
1771     for (var a in TargetColors) {
1772         if (TargetColors[a][0] === target) {
1773             color = TargetColors[a][1];
1774             break;
1775         }
1776     }
1778     if (color.length === 0) {
1779         var i = TargetColors.length + 1;
1780         var d = i % 6;
1781         var j = (i - d) / 6;
1782         j = j % 4;
1783         j++;
1784         var color_case = [
1785             [1, 0, 0],
1786             [0, 1, 0],
1787             [0, 0, 1],
1788             [1, 1, 0],
1789             [1, 0, 1],
1790             [0, 1, 1]
1791         ];
1792         var a = color_case[d][0];
1793         var b = color_case[d][1];
1794         var c = color_case[d][2];
1795         var e = (1 - (j - 1) / 6);
1797         var r = Math.round(a * 200 * e);
1798         var g = Math.round(b * 200 * e);
1799         b = Math.round(c * 200 * e);
1800         color = 'rgba(' + r + ',' + g + ',' + b + ',1)';
1802         TargetColors.push([target, color]);
1803     }
1805     return color;
1808 function Click_option (id_this, column_name, table_name) {
1809     var left = Glob_X - (document.getElementById(id_this).offsetWidth >> 1);
1810     document.getElementById(id_this).style.left = left + 'px';
1811     // var top = Glob_Y - document.getElementById(id_this).offsetHeight - 10;
1812     document.getElementById(id_this).style.top  = (screen.height / 4) + 'px';
1813     document.getElementById(id_this).style.display = 'block';
1814     document.getElementById('option_col_name').innerHTML = '<strong>' + PMA_sprintf(PMA_messages.strAddOption, decodeURI(column_name)) + '</strong>';
1815     col_name = column_name;
1816     tab_name = table_name;
1819 function Close_option () {
1820     document.getElementById('designer_optionse').style.display = 'none';
1821     document.getElementById('rel_opt').value = '--';
1822     document.getElementById('Query').value = '';
1823     document.getElementById('new_name').value = '';
1824     document.getElementById('operator').value = '---';
1825     document.getElementById('groupby').checked = false;
1826     document.getElementById('h_rel_opt').value = '--';
1827     document.getElementById('h_operator').value = '---';
1828     document.getElementById('having').value = '';
1829     document.getElementById('orderby').value = '---';
1833 function Select_all (id_this, owner) {
1834     var parent = document.form1;
1835     downer = owner;
1836     var i;
1837     var k;
1838     var tab = [];
1839     for (i = 0; i < parent.elements.length; i++) {
1840         if (parent.elements[i].type === 'checkbox' && parent.elements[i].id.substring(0, (9 + id_this.length)) === 'select_' + id_this + '._') {
1841             if (document.getElementById('select_all_' + id_this).checked === true) {
1842                 parent.elements[i].checked = true;
1843                 parent.elements[i].disabled = true;
1844                 var temp = '`' + id_this.substring(owner.length + 1) + '`.*';
1845             } else {
1846                 parent.elements[i].checked = false;
1847                 parent.elements[i].disabled = false;
1848             }
1849         }
1850     }
1851     if (document.getElementById('select_all_' + id_this).checked === true) {
1852         select_field.push('`' + id_this.substring(owner.length + 1) + '`.*');
1853         tab = id_this.split('.');
1854         from_array.push(tab[1]);
1855     } else {
1856         for (i = 0; i < select_field.length; i++) {
1857             if (select_field[i] === ('`' + id_this.substring(owner.length + 1) + '`.*')) {
1858                 select_field.splice(i, 1);
1859             }
1860         }
1861         for (k = 0; k < from_array.length; k++) {
1862             if (from_array[k] === id_this) {
1863                 from_array.splice(k, 1);
1864                 break;
1865             }
1866         }
1867     }
1868     Re_load();
1871 function Table_onover (id_this, val, buil) {
1872     buil = parseInt(buil);
1873     if (!val) {
1874         document.getElementById('id_zag_' + id_this).className = 'tab_zag_2';
1875         if (buil) {
1876             document.getElementById('id_zag_' + id_this + '_2').className = 'tab_zag_2';
1877         }
1878     } else {
1879         document.getElementById('id_zag_' + id_this).className = 'tab_zag';
1880         if (buil) {
1881             document.getElementById('id_zag_' + id_this + '_2').className = 'tab_zag';
1882         }
1883     }
1886 /* This function stores selected column information in select_field[]
1887  * In case column is checked it add else it deletes
1889  */
1890 function store_column (id_this, owner, col) {
1891     var i;
1892     var k;
1893     if (document.getElementById('select_' + owner + '.' + id_this + '._' + col).checked === true) {
1894         select_field.push('`' + id_this + '`.`' + col + '`');
1895         from_array.push(id_this);
1896     } else {
1897         for (i = 0; i < select_field.length; i++) {
1898             if (select_field[i] === ('`' + id_this + '`.`' + col + '`')) {
1899                 select_field.splice(i, 1);
1900                 break;
1901             }
1902         }
1903         for (k = 0; k < from_array.length; k++) {
1904             if (from_array[k] === id_this) {
1905                 from_array.splice(k, 1);
1906                 break;
1907             }
1908         }
1909     }
1913  * This function builds object and adds them to history_array
1914  * first it does a few checks on each object, then makes an object(where,rename,groupby,aggregate,orderby)
1915  * then a new history object is made and finally all these history objects are added to history_array[]
1919 function add_object () {
1920     var p;
1921     var where_obj;
1922     var rel = document.getElementById('rel_opt');
1923     var sum = 0;
1924     var init = history_array.length;
1925     if (rel.value !== '--') {
1926         if (document.getElementById('Query').value === '') {
1927             PMA_ajaxShowMessage(PMA_sprintf(PMA_messages.strQueryEmpty));
1928             return;
1929         }
1930         p = document.getElementById('Query');
1931         where_obj = new where(rel.value, p.value);// make where object
1932         history_array.push(new history_obj(col_name, where_obj, tab_name, h_tabs[downer + '.' + tab_name], 'Where'));
1933         sum = sum + 1;
1934     }
1935     if (document.getElementById('new_name').value !== '') {
1936         var rename_obj = new rename(document.getElementById('new_name').value);// make Rename object
1937         history_array.push(new history_obj(col_name, rename_obj, tab_name, h_tabs[downer + '.' + tab_name], 'Rename'));
1938         sum = sum + 1;
1939     }
1940     if (document.getElementById('operator').value !== '---') {
1941         var aggregate_obj = new aggregate(document.getElementById('operator').value);
1942         history_array.push(new history_obj(col_name, aggregate_obj, tab_name, h_tabs[downer + '.' + tab_name], 'Aggregate'));
1943         sum = sum + 1;
1944         // make aggregate operator
1945     }
1946     if (document.getElementById('groupby').checked === true) {
1947         history_array.push(new history_obj(col_name, 'GroupBy', tab_name, h_tabs[downer + '.' + tab_name], 'GroupBy'));
1948         sum = sum + 1;
1949         // make groupby
1950     }
1951     if (document.getElementById('h_rel_opt').value !== '--') {
1952         if (document.getElementById('having').value === '') {
1953             return;
1954         }
1955         where_obj = new having(
1956             document.getElementById('h_rel_opt').value,
1957             document.getElementById('having').value,
1958             document.getElementById('h_operator').value
1959         );// make where object
1960         history_array.push(new history_obj(col_name, where_obj, tab_name, h_tabs[downer + '.' + tab_name], 'Having'));
1961         sum = sum + 1;
1962         // make having
1963     }
1964     if (document.getElementById('orderby').value !== '---') {
1965         var oderby_obj = new orderby(document.getElementById('orderby').value);
1966         history_array.push(new history_obj(col_name, oderby_obj, tab_name, h_tabs[downer + '.' + tab_name], 'OrderBy'));
1967         sum = sum + 1;
1968         // make orderby
1969     }
1970     PMA_ajaxShowMessage(PMA_sprintf(PMA_messages.strObjectsCreated, sum));
1971     // output sum new objects created
1972     var existingDiv = document.getElementById('ab');
1973     existingDiv.innerHTML = display(init, history_array.length);
1974     Close_option();
1975     $('#ab').accordion('refresh');
1978 function enablePageContentEvents() {
1979     $('#page_content').off('mousedown', MouseDown);
1980     $('#page_content').off('mouseup', MouseUp);
1981     $('#page_content').off('mousemove', MouseMove);
1982     $('#page_content').on('mousedown', MouseDown);
1983     $('#page_content').on('mouseup', MouseUp);
1984     $('#page_content').on('mousemove', MouseMove);
1988  * This function enables the events on table items.
1989  * It helps to enable them on page loading and when a table is added on the fly.
1990  */
1991 function enableTableEvents(index, element) {
1992     $(element).on('click', '.select_all_1', function () {
1993         Select_all($(this).attr('designer_url_table_name'), $(this).attr('designer_out_owner'));
1994     });
1995     $(element).on('click', '.small_tab,.small_tab2', function () {
1996         Small_tab($(this).attr('table_name'), 1);
1997     });
1998     $(element).on('click', '.small_tab_pref_1', function () {
1999         Start_tab_upd($(this).attr('db_url'), $(this).attr('table_name_url'));
2000     });
2001     $(element).on('click', '.select_all_store_col', function () {
2002         var params = ($(this).attr('store_column_param')).split(',');
2003         store_column(params[0], params[1], params[2]);
2004     });
2005     $(element).on('click', '.small_tab_pref_click_opt', function () {
2006         var params = ($(this).attr('Click_option_param')).split(',');
2007         Click_option(params[0], params[1], params[2]);
2008     });
2009     $(element).on('click', '.tab_field_2,.tab_field_3,.tab_field', function () {
2010         var params = ($(this).attr('click_field_param')).split(',');
2011         Click_field(params[3], params[0], params[1], params[2]);
2012     });
2014     $(element).find('.tab_zag_noquery').mouseover(function () {
2015         Table_onover($(this).attr('table_name'),0, $(this).attr('query_set'));
2016     });
2017     $(element).find('.tab_zag_noquery').mouseout(function () {
2018         Table_onover($(this).attr('table_name'),1, $(this).attr('query_set'));
2019     });
2020     $(element).find('.tab_zag_query').mouseover(function () {
2021         Table_onover($(this).attr('table_name'),0, 1);
2022     });
2023     $(element).find('.tab_zag_query').mouseout(function () {
2024         Table_onover($(this).attr('table_name'),1, 1);
2025     });
2027     enablePageContentEvents();
2030 AJAX.registerTeardown('designer/move.js', function () {
2031     $('#side_menu').off('mouseenter mouseleave');
2032     $('#key_Show_left_menu').off('click');
2033     $('#toggleFullscreen').off('click');
2034     $('#newPage').off('click');
2035     $('#editPage').off('click');
2036     $('#savePos').off('click');
2037     $('#SaveAs').off('click');
2038     $('#delPages').off('click');
2039     $('#StartTableNew').off('click');
2040     $('#rel_button').off('click');
2041     $('#StartTableNew').off('click');
2042     $('#display_field_button').off('click');
2043     $('#reloadPage').off('click');
2044     $('#angular_direct_button').off('click');
2045     $('#grid_button').off('click');
2046     $('#key_SB_all').off('click');
2047     $('#SmallTabInvert').off('click');
2048     $('#relLineInvert').off('click');
2049     $('#exportPages').off('click');
2050     $('#query_builder').off('click');
2051     $('#key_Left_Right').off('click');
2052     $('#pin_Text').off('click');
2053     $('#canvas').off('click');
2054     $('#key_HS_all').off('click');
2055     $('#key_HS').off('click');
2056     $('.scroll_tab_struct').off('click');
2057     $('.scroll_tab_checkbox').off('click');
2058     $('#id_scroll_tab').find('tr').off('click', '.designer_Tabs2,.designer_Tabs');
2059     $('.designer_tab').off('click', '.select_all_1');
2060     $('.designer_tab').off('click', '.small_tab,.small_tab2');
2061     $('.designer_tab').off('click', '.small_tab_pref_1');
2062     $('.tab_zag_noquery').off('mouseover');
2063     $('.tab_zag_noquery').off('mouseout');
2064     $('.tab_zag_query').off('mouseover');
2065     $('.tab_zag_query').off('mouseout');
2066     $('.designer_tab').off('click','.tab_field_2,.tab_field_3,.tab_field');
2067     $('.designer_tab').off('click', '.select_all_store_col');
2068     $('.designer_tab').off('click', '.small_tab_pref_click_opt');
2069     $('#del_button').off('click');
2070     $('#cancel_button').off('click');
2071     $('#ok_add_object').off('click');
2072     $('#cancel_close_option').off('click');
2073     $('#ok_new_rel_panel').off('click');
2074     $('#cancel_new_rel_panel').off('click');
2075     $('#page_content').off('mouseup');
2076     $('#page_content').off('mousedown');
2077     $('#page_content').off('mousemove');
2080 AJAX.registerOnload('designer/move.js', function () {
2081     $('#key_Show_left_menu').click(function () {
2082         Show_left_menu(this);
2083         return false;
2084     });
2085     $('#toggleFullscreen').click(function () {
2086         Toggle_fullscreen();
2087         return false;
2088     });
2089     $('#addOtherDbTables').click(function () {
2090         Add_Other_db_tables();
2091         return false;
2092     });
2093     $('#newPage').click(function () {
2094         New();
2095         return false;
2096     });
2097     $('#editPage').click(function () {
2098         Edit_pages();
2099         return false;
2100     });
2101     $('#savePos').click(function () {
2102         Save3();
2103         return false;
2104     });
2105     $('#SaveAs').click(function () {
2106         Save_as();
2107         return false;
2108     });
2109     $('#delPages').click(function () {
2110         Delete_pages();
2111         return false;
2112     });
2113     $('#StartTableNew').click(function () {
2114         Start_table_new();
2115         return false;
2116     });
2117     $('#rel_button').click(function () {
2118         Start_relation();
2119         return false;
2120     });
2121     $('#display_field_button').click(function () {
2122         Start_display_field();
2123         return false;
2124     });
2125     $('#reloadPage').click(function () {
2126         Load_page(selected_page);
2127     });
2128     $('#angular_direct_button').click(function () {
2129         Angular_direct();
2130         return false;
2131     });
2132     $('#grid_button').click(function () {
2133         Grid();
2134         return false;
2135     });
2136     $('#key_SB_all').click(function () {
2137         Small_tab_all(this);
2138         return false;
2139     });
2140     $('#SmallTabInvert').click(function () {
2141         Small_tab_invert();
2142         return false;
2143     });
2144     $('#relLineInvert').click(function () {
2145         Relation_lines_invert();
2146         return false;
2147     });
2148     $('#exportPages').click(function () {
2149         Export_pages();
2150         return false;
2151     });
2152     $('#query_builder').click(function () {
2153         build_query('SQL Query on Database', 0);
2154     });
2155     $('#key_Left_Right').click(function () {
2156         Side_menu_right(this);
2157         return false;
2158     });
2159     $('#side_menu').hover(function () {
2160         Show_text();
2161         return false;
2162     }, function () {
2163         Hide_text();
2164         return false;
2165     });
2166     $('#pin_Text').click(function () {
2167         Pin_text(this);
2168         return false;
2169     });
2170     $('#canvas').click(function (event) {
2171         Canvas_click(this, event);
2172     });
2173     $('#key_HS_all').click(function () {
2174         Hide_tab_all(this);
2175         return false;
2176     });
2177     $('#key_HS').click(function () {
2178         No_have_constr(this);
2179         return false;
2180     });
2182     $('.designer_tab').each(enableTableEvents);
2183     $('.designer_tab').each(addTableToTablesList);
2185     $('input#del_button').click(function () {
2186         Upd_relation();
2187     });
2188     $('input#cancel_button').click(function () {
2189         document.getElementById('layer_upd_relation').style.display = 'none';
2190         Re_load();
2191     });
2192     $('input#ok_add_object').click(function () {
2193         add_object();
2194     });
2195     $('input#cancel_close_option').click(function () {
2196         Close_option();
2197     });
2198     $('input#ok_new_rel_panel').click(function () {
2199         New_relation();
2200     });
2201     $('input#cancel_new_rel_panel').click(function () {
2202         document.getElementById('layer_new_relation').style.display = 'none';
2203     });
2204     enablePageContentEvents();