/**
* Global variables
*/
var configTabs; // Config tabs
var configDatatables = new Object(); // Datatables on the config page
/**
* Set the datatable
*
* @param id
* The ID of the datatable
* @param obj
* Datatable object
* @return Nothing
*/
function setConfigDatatable(id, obj) {
configDatatables[id] = obj;
}
/**
* Get the datatable with the given ID
*
* @param id
* The ID of the datatable
* @return Datatable object
*/
function getConfigDatatable(id) {
return configDatatables[id];
}
/**
* Set the configure tab
*
* @param obj
* Tab object
* @return Nothing
*/
function setConfigTab(obj) {
configTabs = obj;
}
/**
* Get the configure tab
*
* @param Nothing
* @return Tab object
*/
function getConfigTab() {
return configTabs;
}
/**
* Load configure page
*
* @return Nothing
*/
function loadConfigPage() {
// If the configure page has already been loaded
if ($('#content').children().length) {
// Do not reload configure page
return;
}
// Create configure tab
var tab = new Tab();
setConfigTab(tab);
tab.init();
$('#content').append(tab.object());
// Create loader
var loader = $('
').append(createLoader());
// Add tab to configure xCAT tables
tab.add('configTablesTab', 'Tables', loader, false);
// Add the update tab
tab.add('updateTab', 'Update', '', false);
// Add the discover tab
tab.add('discoverTab', 'Discover', '', false);
// Get list of tables and their descriptions
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'tabdump',
tgt : '',
args : '-d',
msg : ''
},
success : loadTableNames
});
loadUpdatePage();
loadDiscoverPage();
}
/**
* Load xCAT database table names and their descriptions
*
* @param data
* Data returned from HTTP request
* @return Nothing
*/
function loadTableNames(data) {
// Get output
var tables = data.rsp;
// Remove loader
var tabId = 'configTablesTab';
$('#' + tabId).find('img').hide();
// Create a groups division
var tablesDIV = $('');
$('#' + tabId).append(tablesDIV);
// Create info bar
var infoBar = createInfoBar('Select a table to view or edit.');
tablesDIV.append(infoBar);
// Create a list for the tables
var list = $('');
// Loop through each table
for ( var i = 0; i < tables.length; i++) {
// Create a link for each table
var args = tables[i].split(':');
var link = $('' + args[0] + '');
// Open table on click
link.bind('click', function(e) {
// Get table ID that was clicked
var id = (e.target) ? e.target.id : e.srcElement.id;
// Create loader
var loader = $('').append(createLoader());
// Add a new tab for this table
var configTab = getConfigTab();
if (!$('#' + id + 'Tab').length) {
configTab.add(id + 'Tab', id, loader, true);
// Get contents of selected table
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'tabdump',
tgt : '',
args : id,
msg : id
},
success : loadTable
});
}
// Select new tab
configTab.select(id + 'Tab');
});
var item = $('');
item.append(link);
// Append the table description
item.append(': ' + args[1]);
// Append item to list
list.append(item);
}
tablesDIV.append(list);
}
/**
* Load a given database table
*
* @param data
* Data returned from HTTP request
* @return Nothing
*/
function loadTable(data) {
// Get response
var rsp = data.rsp;
// Get table ID
var id = data.msg;
// Remove loader
var tabId = id + 'Tab';
$('#' + tabId).find('img').remove();
// Create info bar
var infoBar = createInfoBar('Click on a cell to edit. ddClick outside the table to write to the cell. Once you are satisfied with how the table looks, click on Save.');
$('#' + tabId).append(infoBar);
// Create action bar
var actionBar = $('');
$('#' + tabId).append(actionBar);
// Get table headers
var args = rsp[0].replace('#', '');
var headers = args.split(',');
// Create container for original table contents
var origCont = new Array(); // Original table content
origCont[0] = rsp[0].split(','); // Headers
// Create container for new table contents
var newCont = new Object();
var tmp = new Object();
tmp[0] = '#' + headers[0]; // Put a # in front of the header
for ( var i = 1; i < headers.length; i++) {
tmp[i] = headers[i];
}
newCont[0] = tmp;
// Create a new datatable
var tableId = id + 'Datatable';
var table = new DataTable(tableId);
// Add column for the remove row button
headers.unshift('');
table.init(headers);
headers.shift();
// Append datatable to tab
$('#' + tabId).append(table.object());
// Data table
var dTable;
// Add table rows
// Start with the 2nd row (1st row is the headers)
for ( var i = 1; i < rsp.length; i++) {
// Split into columns
var cols = rsp[i].split(',');
// Go through each column
for ( var j = 0; j < cols.length; j++) {
// If the column is not complete
if (cols[j].count('"') == 1) {
while (cols[j].count('"') != 2) {
// Merge this column with the adjacent one
cols[j] = cols[j] + "," + cols[j + 1];
// Remove merged row
cols.splice(j + 1, 1);
}
}
// Replace quote
cols[j] = cols[j].replace(new RegExp('"', 'g'), '');
}
// Add remove button
cols.unshift('');
// Add row
table.add(cols);
// Save original table content
origCont[i] = cols;
}
/**
* Enable editable columns
*/
// Do not make 1st column editable
$('#' + tableId + ' td:not(td:nth-child(1))').editable(
function(value, settings) {
// Get column index
var colPos = this.cellIndex;
// Get row index
var rowPos = dTable.fnGetPosition(this.parentNode);
// Update datatable
dTable.fnUpdate(value, rowPos, colPos);
return (value);
}, {
onblur : 'submit', // Clicking outside editable area submits changes
type : 'textarea',
placeholder: ' ',
height : '30px' // The height of the text area
});
// Turn table into datatable
dTable = $('#' + id + 'Datatable').dataTable({
'iDisplayLength': 50,
'bLengthChange': false,
"sScrollX": "100%",
"bAutoWidth": true
});
// Create action bar
var actionBar = $('');
var saveLnk = $('Save');
saveLnk.click(function() {
// Get table ID and name
var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', '');
var tableName = tableId.replace('Datatable', '');
// Get datatable
var dTable = $('#' + tableId).dataTable();
// Get the nodes from the table
var dRows = dTable.fnGetNodes();
// Go through each row
for ( var i = 0; i < dRows.length; i++) {
// If there is row with values
if (dRows[i]) {
// Go through each column
// Ignore the 1st column because it is a button
var cols = dRows[i].childNodes;
var vals = new Object();
for ( var j = 1; j < cols.length; j++) {
var val = cols.item(j).firstChild.nodeValue;
// Insert quotes
if (val == ' ') {
vals[j - 1] = '';
} else {
vals[j - 1] = val;
}
}
// Save row
newCont[i + 1] = vals;
}
}
// Update xCAT table
$.ajax( {
type : 'POST',
url : 'lib/tabRestore.php',
dataType : 'json',
data : {
table : tableName,
cont : newCont
},
success : function(data) {
alert('Changes saved');
}
});
});
var undoLnk = $('Undo');
undoLnk.click(function() {
// Get table ID
var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', '');
// Get datatable
var dTable = $('#' + tableId).dataTable();
// Clear entire datatable
dTable.fnClearTable();
// Add original content back into datatable
for ( var i = 1; i < origCont.length; i++) {
dTable.fnAddData(origCont[i], true);
}
// Enable editable columns (again)
// Do not make 1st column editable
$('#' + tableId + ' td:not(td:nth-child(1))').editable(
function(value, settings) {
// Get column index
var colPos = this.cellIndex;
// Get row index
var rowPos = dTable.fnGetPosition(this.parentNode);
// Update datatable
dTable.fnUpdate(value, rowPos, colPos);
return (value);
}, {
onblur : 'submit', // Clicking outside editable area submits changes
type : 'textarea',
placeholder: ' ',
height : '30px' // The height of the text area
});
});
var addLnk = $('Add row');
addLnk.click(function() {
// Create an empty row
var row = new Array();
/**
* Remove button
*/
row.push('');
for ( var i = 0; i < headers.length; i++) {
row.push('');
}
// Get table ID and name
var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', '');
var tableName = tableId.replace('Datatable', '');
// Get datatable
var dTable = $('#' + tableId).dataTable();
// Add the row to the data table
dTable.fnAddData(row);
// Enable editable columns (again)
// Do not make 1st column editable
$('#' + tableId + ' td:not(td:nth-child(1))').editable(
function(value, settings) {
// Get column index
var colPos = this.cellIndex;
// Get row index
var rowPos = dTable.fnGetPosition(this.parentNode);
// Update datatable
dTable.fnUpdate(value, rowPos, colPos);
return (value);
}, {
onblur : 'submit', // Clicking outside editable area submits changes
type : 'textarea',
placeholder: ' ',
height : '30px' // The height of the text area
});
});
// Actions
var actionsLnk = 'Actions';
var actsMenu = createMenu([saveLnk, undoLnk, addLnk]);
// Create an action menu
var actionsMenu = createMenu([ [ actionsLnk, actsMenu ] ]);
actionsMenu.superfish();
actionsMenu.css('display', 'inline-block');
actionBar.append(actionsMenu);
// Create a division to hold actions menu
var menuDiv = $('');
$('#' + id + 'Datatable_wrapper').prepend(menuDiv);
menuDiv.append(actionBar);
$('#' + id + 'Datatable_filter').appendTo(menuDiv);
}
/**
* Delete a row in the data table
*
* @param obj
* The object that was clicked
* @return Nothing
*/
function deleteRow(obj) {
// Get table ID
var tableId = $(obj).parents('table').attr('id');
// Get datatable
var dTable = $('#' + tableId).dataTable();
// Get all nodes within the datatable
var rows = dTable.fnGetNodes();
// Get target row
var tgtRow = $(obj).parent().parent().get(0);
// Find the target row in the datatable
for ( var i in rows) {
// If the row matches the target row
if (rows[i] == tgtRow) {
// Remove row
dTable.fnDeleteRow(i, null, true);
break;
}
}
}
/**
* Count the number of occurrences of a specific character in a string
*
* @param c
* Character to count
* @return The number of occurrences
*/
String.prototype.count = function(c) {
return (this.length - this.replace(new RegExp(c, 'g'), '').length)/c.length;
};