/**
 * Global variables
 */
var xcatMonTableId = "xcatMonSettingTable";

/**
 * Load xCAT monitoring
 */
function loadXcatMon() {
	// Find xCAT monitoring tab
	var xcatMonTab = $('#xcatmon');
	xcatMonTab.append("<div id= xcatmonTable></div>");

	// Show content of monsetting table
	$.ajax({
		url : 'lib/cmd.php',
		dataType : 'json',
		data : {
			cmd : 'tabdump',
			tgt : '',
			args : 'monsetting',
			msg : ''
		},
		success : loadXcatMonSetting
	});
}

function loadXcatMonSetting(data) {
	var apps = ""; // Contains the xcatmon config
	var rsp = data.rsp;
	var apps_flag = 0;
	var ping; // xcatmon ping interval
	var ping_flag = 0;

	// Create an info bar
	var infoBar = createInfoBar('Click on a cell to edit. Click outside the table to write to the cell. Once you are finished configuring the xCAT monitor, click on Apply.');
	$('#xcatmonTable').append(infoBar);

	// Create xcatmon table
	var xcatmonTable = new DataTable(xcatMonTableId);

	// Create datatable
	var dTable;

	// Create table header
	var header = rsp[0].split(",");
	header.splice(3, 2);
	header.splice(0, 1);
	header[0] = "App Name";
	header[1] = "Configure";
	header.push('<input type="checkbox" onclick="selectAllCheckbox(event,$(this))">');
	header.unshift('');
	xcatmonTable.init(header);

	// Create container for original table contents
	var origCont = new Array();
	origCont[0] = header; // Table headers

	// Create container for new contents to use later updating monsetting table
	var newCont = new Object();
	newCont[0] = rsp[0].split(","); // Table headers

	// Create container for other monsetting lines
	var otherCont = new Array();

	$('#xcatmonTable').append(xcatmonTable.object());
	var m = 1; // Count for origCont
	var n = 0;
	for ( var i = 1; i < rsp.length; i++) {
		var pos = rsp[i].indexOf("xcatmon"); // Only check xcatmon setting
		if (pos == 1) {
			if ((rsp[i].indexOf("apps") == -1) && (rsp[i].indexOf("ping") == -1)) {
				var cols = rsp[i].split(',');
				for ( var j = 0; j < cols.length; j++) {
					if (cols[j].count('"') % 2 == 1) {
						while (cols[j].count('"') % 2 == 1) {
							cols[j] = cols[j] + "," + cols[j + 1];
							cols.splice(j + 1, 1);
						}
					}
					cols[j] = cols[j].replace(new RegExp('"', 'g'), '');
				}

				cols.splice(3, 2);
				cols.splice(0, 1);
				cols.push('<input type="checkbox" name="' + cols[0] + '" title="Checking this box will add/remove the app from the configured app value"/>');
				cols.unshift('<span class="ui-icon ui-icon-close" onclick="deleteXcatMonRow(this)"></span>');

				// Add column to table
				xcatmonTable.add(cols);
				origCont[m++] = cols;
			} else {
				if (!apps_flag) { // Check the apps setting
					if (rsp[i].indexOf("apps") > -1) {
						apps = rsp[i].split(',');

						for ( var j = 0; j < apps.length; j++) {
							if (apps[j].count('"') % 2 == 1) {
								while (apps[j].count('"') % 2 == 1) {
									apps[j] = apps[j] + "," + apps[j + 1];
									apps.splice(j + 1, 1);
								}
							}
							apps[j] = apps[j].replace(new RegExp('"', 'g'), '');
						}

						apps_flag = 1; // Set the flag to 1 to avoid this subroute
					}
				}

				// Get into the ping settings
				if (!ping_flag) {
					// Check the ping interval
					if (rsp[i].indexOf("ping-interval") > -1) {
						ping = rsp[i].split(',');
						for ( var j = 0; j < ping.length; j++) {
							if (ping[j].count('"') % 2 == 1) {
								while (ping[j].count('"') % 2 == 1) {
									ping[j] = ping[j] + "," + ping[j + 1];
									ping.splice(j + 1, 1);
								}
							}
							ping[j] = ping[j].replace((new RegExp('"', 'g')),
									'');
						}
						ping_flag = 1;
					}
				}
			}
		} else if (pos != 1) {
			// The other monitor in the monsetting table
			var otherCols = rsp[i].split(',');
			for ( var k = 0; k < otherCols.length; k++) {
				if (otherCols[k].count('"') % 2 == 1) {
					while (otherCols[k].count('"') % 2 == 1) {
						otherCols[k] = otherCols[k] + "," + otherCols[k + 1];
						otherCols.splice(k + 1, 1);
					}
				}
				otherCols[k] = otherCols[k].replace(new RegExp('"', 'g'), '');
			}

			otherCont[n++] = otherCols;

		}
	}
	// If app is not in the monsetting table, then create default apps row
	if (!apps_flag) {
		apps = rsp[0].split(',');
		apps[0] = "xcatmon";
		apps[1] = "apps";
		apps[2] = "";
		apps[3] = "";
		apps[4] = "";
	}

	// If the ping interval is not in the monsetting table, then create the
	// default ping-interval
	if (!ping_flag) {
		ping = rsp[0].split(',');
		ping[0] = "xcatmon";
		ping[1] = "ping-interval";
		
		// Set default ping-interval setting to 5
		ping[2] = "5";
		ping[3] = "";
		ping[4] = "";
	}

	// Set checkbox to be true
	var checked = apps[2].split(',');
	for ( var i = 0; i < checked.length; i++) {
		$("input:checkbox[name=" + checked[i] + "]").attr('checked', true);
		for ( var j = 0; j < origCont.length; j++) {
			if (origCont[j][1] == checked[i]) {
				origCont[j].splice(3, 1);
				origCont[j].push('<input type="checkbox" name="' + origCont[j][1] + '" title="Check this checkbox to add/remove the app from the configured app value." checked=true/>');
			}
		}

	}
	$(":checkbox").tooltip();

	// Make the table editable
	$('#' + xcatMonTableId + ' td:not(td:nth-child(1),td:last-child)').editable(function(value, settings) {
		var colPos = this.cellIndex;
		var rowPos = dTable.fnGetPosition(this.parentNode);
		dTable.fnUpdate(value, rowPos, colPos);
		return (value);
	}, {
		onblur : 'submit',
		type : 'textarea',
		placeholder : ' ',
		height : '30px'
	});

	// Save datatable
	dTable = $('#' + xcatMonTableId).dataTable({
		'iDisplayLength' : 50,
		'bLengthChange' : false,
		"sScrollX" : "100%",
		"bAutoWidth" : true
	});

	// Create action bar
	var actionBar = $('<div class="actionBar"></div>');
	var addRowLnk = $('<a>Add row</a>');
	addRowLnk.bind('click', function(event) {
		// Create container for new row
		var row = new Array();

		// Add delete button to row
		row.push('<span class="ui-icon ui-icon-close" onclick="deleteXcatMonRow(this)"></span>');
		for ( var i = 0; i < header.length - 2; i++)
			row.push('');

		// Add checkbox
		row.push('<input type="checkbox" name="' + row[2] + '" title="Checking this checkbox will add/remove the app from the configured apps value"/>');
		// Get the datatable of the table
		var dTable = $('#' + xcatMonTableId).dataTable();
		// Add the new row to the datatable
		dTable.fnAddData(row);

		// make the datatable editable
		$(":checkbox[title]").tooltip();
		$('#' + xcatMonTableId + ' td:not(td:nth-child(1),td:last-child)').editable(function(value, settings) {
			var colPos = this.cellIndex;
			var rowPos = dTable
					.fnGetPosition(this.parentNode);
			dTable.fnUpdate(value, rowPos,
					colPos);
			return (value);
		}, {
			onblur : 'submit',
			type : 'textarea',
			placeholder : ' ',
			height : '30px'
		});
	});

	// Create apply button to store the contents of the table to the monsetting table
	var applyLnk = $('<a>Apply</a>');
	applyLnk.bind('click', function(event) {
		// Get the datatable
		var dTable = $('#' + xcatMonTableId).dataTable();
		// Get datatable rows
		var dRows = dTable.fnGetNodes();
		var count = 0;
		
		// Create a new container for the apps value
		var appValue = '';
		var tableName = 'monsetting';
		var closeBtn = createButton('close');

		// Get the row contents
		for ( var i = 0; i < dRows.length; i++) {
			if (dRows[i]) {
				// Get the row columns
				var cols = dRows[i].childNodes;
				// Create a container for the new columns
				var vals = new Array();

				for ( var j = 1; j < cols.length - 1; j++) {
					var val = cols.item(j).firstChild.nodeValue;
					if (val == ' ')
						vals[j - 1] = '';
					else
						vals[j - 1] = val;
				}

				var vals_orig = new Array();
				// Copy data from vals to vals_orig
				for ( var p = 0; p < 2; p++) {
					var val = vals[p];
					vals_orig[p] = val;
				}

				vals.push('');
				vals.push('');
				vals.unshift('xcatmon');
				
				// Stored new column to newCont
				newCont[i + 1] = vals;

				if (cols.item(cols.length - 1).firstChild.checked) {
					vals_orig.push('<input type="checkbox" name="' + vals_orig[0] + '" title="Checking this checkbox will add/remove the app from the configured apps value" checked=true/>');
				} else {
					vals_orig.push('<input type="checkbox" name="' + vals_orig[0] + '" title="Checking this checkbox will add/remove the app from the configured apps value"/>');
				}

				// Add delete button to row
				vals_orig.unshift('<span class="ui-icon ui-icon-close" onclick="deleteXcatMonRow(this)"></span>');
				// Add row to origCont
				origCont[i + 1] = vals_orig;
				count = i + 1;

				// Check checkbox for every row when merging the app name with the apps values
				if (cols.item(cols.length - 1).firstChild.checked)
					appValue = appValue.concat(cols.item(2).firstChild.nodeValue + ",");
			}
		}

		count++;
		
		// Delete the last comma of the apps value
		appValue = appValue.substring(0, (appValue.length - 1));
		apps[2] = appValue;

		newCont[count++] = apps;
		newCont[count++] = ping;

		// Add to other monitor settings
		for ( var j = 0; j < otherCont.length; j++) {
			newCont[count++] = otherCont[j];
		}

		// Create save dialog
		var dialogSave = $('<div id="saveDialog" align="center">Saving configuration</div>');
		dialogSave.append(createLoader());
		
		$('#xcatmon').append(dialogSave);
		$("#saveDialog").dialog({
			modal : true
		});
		
		$('.ui-dialog-titlebar-close').hide();
		$.ajax({
			type : 'POST',
			url : 'lib/tabRestore.php',
			dataType : 'json',
			data : {
				table : tableName,
				cont : newCont
			},
			success : function(data) {
				// empty the dialog.add the close button
				$("#saveDialog").empty().append('<p>Configuration saved!</p>');
				$("#saveDialog").append(closeBtn);
			}
		});

		// Close button
		closeBtn.bind('click', function(event) {
			$("#saveDialog").dialog("destroy");
			$("#saveDialog").remove();
		});

		// Clear the newCont
		newCont = null;
		newCont = new Object();
		newCont[0] = rsp[0].split(",");
	});

	var cancelLnk = $('<a>Cancel</a>');
	cancelLnk.bind('click', function(event) {
		// Get the datatable for the page
		var dTable = $('#' + xcatMonTableId).dataTable();

		// Clear the datatable
		dTable.fnClearTable();

		// Add the contents of origCont to the datatable
		for ( var i = 1; i < origCont.length; i++)
			dTable.fnAddData(origCont[i], true);

		$(":checkbox[title]").tooltip();
		$('#' + xcatMonTableId + ' td:not(td:nth-child(1),td:last-child)').editable(function(value, settings) {
			var colPos = this.cellIndex;
			var rowPos = dTable.fnGetPosition(this.parentNode);
			dTable.fnUpdate(value, rowPos, colPos);
			return (value);
		}, {
			onblur : 'submit',
			type : 'textarea',
			placeholder : ' ',
			height : '30px'
		});
	});

	// Create actions menu
	var actionsLnk = '<a>Actions</a>';
	var actsMenu = createMenu([ addRowLnk, applyLnk, cancelLnk ]);
	var actionsMenu = createMenu([ [ actionsLnk, actsMenu ] ]);
	actionsMenu.superfish();
	actionsMenu.css('display', 'inline-block');
	actionBar.append(actionsMenu);

	// Create a division to hold actions menu
	var menuDiv = $('<div id="' + xcatMonTableId + '_menuDiv" class="menuDiv"></div>');
	$('#' + xcatMonTableId + '_wrapper').prepend(menuDiv);
	menuDiv.append(actionBar);
	$('#' + xcatMonTableId + '_filter').appendTo(menuDiv);
}

/**
 * Delete a row from the table
 */
function deleteXcatMonRow(obj) {
	var dTable = $('#' + xcatMonTableId).dataTable();
	var rows = dTable.fnGetNodes();
	var tgtRow = $(obj).parent().parent().get(0);
	for ( var i in rows) {
		if (rows[i] == tgtRow) {
			dTable.fnDeleteRow(i, null, true);
			break;
		}
	}
}