/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* @fileoverview function used for index manipulation pages
* @name Table Structure
*
* @requires jQuery
* @requires jQueryUI
* @required js/functions.js
*/
/**
* Hides/shows the inputs and submits appropriately depending
* on whether the index type chosen is 'SPATIAL' or not.
*/
function checkIndexType()
{
/**
* @var Object Dropdown to select the index type.
*/
$select_index_type = $('#select_index_type');
/**
* @var Object Table header for the size column.
*/
$size_header = $('#index_columns thead tr th:nth-child(2)');
/**
* @var Object Inputs to specify the columns for the index.
*/
$column_inputs = $('select[name="index[columns][names][]"]');
/**
* @var Object Inputs to specify sizes for columns of the index.
*/
$size_inputs = $('input[name="index[columns][sub_parts][]"]');
/**
* @var Object Footer containg the controllers to add more columns
*/
$add_more = $('#index_frm .tblFooters');
if ($select_index_type.val() == 'SPATIAL') {
// Disable and hide the size column
$size_header.hide();
$size_inputs.each(function () {
$(this)
.prop('disabled', true)
.parent('td').hide();
});
// Disable and hide the columns of the index other than the first one
var initial = true;
$column_inputs.each(function () {
$column_input = $(this);
if (! initial) {
$column_input
.prop('disabled', true)
.parent('td').hide();
} else {
initial = false;
}
});
// Hide controllers to add more columns
$add_more.hide();
} else {
// Enable and show the size column
$size_header.show();
$size_inputs.each(function () {
$(this)
.prop('disabled', false)
.parent('td').show();
});
// Enable and show the columns of the index
$column_inputs.each(function () {
$(this)
.prop('disabled', false)
.parent('td').show();
});
// Show controllers to add more columns
$add_more.show();
}
}
/**
* Unbind all event handlers before tearing down a page
*/
AJAX.registerTeardown('indexes.js', function () {
$('#select_index_type').die('change');
$('a.drop_primary_key_index_anchor.ajax').die('click');
$("#table_index tbody tr td.edit_index.ajax, #indexes .add_index.ajax").die('click');
$('#index_frm input[type=submit]').die('click');
});
/**
* @description <p>Ajax scripts for table index page</p>
*
* Actions ajaxified here:
* <ul>
* <li>Showing/hiding inputs depending on the index type chosen</li>
* <li>create/edit/drop indexes</li>
* </ul>
*/
AJAX.registerOnload('indexes.js', function () {
checkIndexType();
checkIndexName("index_frm");
$('#select_index_type').live('change', function (event) {
event.preventDefault();
checkIndexType();
checkIndexName("index_frm");
});
/**
* Ajax Event handler for 'Drop Index'
*/
$('a.drop_primary_key_index_anchor.ajax').live('click', function (event) {
event.preventDefault();
var $anchor = $(this);
/**
* @var $curr_row Object containing reference to the current field's row
*/
var $curr_row = $anchor.parents('tr');
/** @var Number of columns in the key */
var rows = $anchor.parents('td').attr('rowspan') || 1;
/** @var Rows that should be hidden */
var $rows_to_hide = $curr_row;
for (var i = 1, $last_row = $curr_row.next(); i < rows; i++, $last_row = $last_row.next()) {
$rows_to_hide = $rows_to_hide.add($last_row);
}
var question = escapeHtml(
$curr_row.children('td')
.children('.drop_primary_key_index_msg')
.val()
);
$anchor.PMA_confirm(question, $anchor.attr('href'), function (url) {
var $msg = PMA_ajaxShowMessage(PMA_messages.strDroppingPrimaryKeyIndex, false);
$.get(url, {'is_js_confirmed': 1, 'ajax_request': true}, function (data) {
if (data.success === true) {
PMA_ajaxRemoveMessage($msg);
var $table_ref = $rows_to_hide.closest('table');
if ($rows_to_hide.length == $table_ref.find('tbody > tr').length) {
// We are about to remove all rows from the table
$table_ref.hide('medium', function () {
$('div.no_indexes_defined').show('medium');
$rows_to_hide.remove();
});
$table_ref.siblings('div.notice').hide('medium');
} else {
// We are removing some of the rows only
toggleRowColors($rows_to_hide.last().next());
$rows_to_hide.hide("medium", function () {
$(this).remove();
});
}
if ($('#result_query').length) {
$('#result_query').remove();
}
if (data.sql_query) {
$('<div id="result_query"></div>')
.html(data.sql_query)
.prependTo('#page_content');
PMA_highlightSQL($('#page_content'));
}
PMA_commonActions.refreshMain(false, function () {
$("a.ajax[href^=#indexes]").click();
});
PMA_reloadNavigation();
} else {
PMA_ajaxShowMessage(PMA_messages.strErrorProcessingRequest + " : " + data.error, false);
}
}); // end $.get()
}); // end $.PMA_confirm()
}); //end Drop Primary Key/Index
/**
*Ajax event handler for index edit
**/
$("#table_index tbody tr td.edit_index.ajax, #indexes .add_index.ajax").live('click', function (event) {
event.preventDefault();
var url, title;
if ($(this).find("a").length === 0) {
// Add index
var valid = checkFormElementInRange(
$(this).closest('form')[0],
'added_fields',
'Column count has to be larger than zero.'
);
if (! valid) {
return;
}
url = $(this).closest('form').serialize();
title = PMA_messages.strAddIndex;
} else {
// Edit index
url = $(this).find("a").attr("href");
if (url.substring(0, 16) == "tbl_indexes.php?") {
url = url.substring(16, url.length);
}
title = PMA_messages.strEditIndex;
}
url += "&ajax_request=true";
indexEditorDialog(url, title, function () {
// refresh the page using ajax
PMA_commonActions.refreshMain(false, function () {
$("a.ajax[href^=#indexes]").click();
});
});
});
});