/**
 * Load updatenode page
 * 
 * @param tgtNodes
 *            Targets to run updatenode against
 * @return Nothing
 */
function loadUpdatenodePage(tgtNodes) {
	// Get OS images
	$.ajax({
		url : 'lib/cmd.php',
		dataType : 'json',
		data : {
			cmd : 'tabdump',
			tgt : '',
			args : 'osimage',
			msg : ''
		},

		success : setOSImageCookies
	});
	
	// Get node OS
	var osHash = new Object();
	var nodes = tgtNodes.split(',');
	for (var i in nodes) {
		var os = getNodeAttr(nodes[i], 'os');
		var osBase = os.match(/[a-zA-Z]+/);
		if (osBase) {
			nodes[osBase] = 1;
		}
	}
	
	// Get nodes tab
	var tab = getNodesTab();

	// Generate new tab ID
	var inst = 0;
	var newTabId = 'updatenodeTab' + inst;
	while ($('#' + newTabId).length) {
		// If one already exists, generate another one
		inst = inst + 1;
		newTabId = 'updatenodeTab' + inst;
	}
	
	// Create updatenode form
	var updatenodeForm = $('<div class="form"></div>');

	// Create status bar
	var statBarId = 'updatenodeStatusBar' + inst;
	var statusBar = createStatusBar(statBarId).hide();
	updatenodeForm.append(statusBar);

	// Create loader
	var loader = createLoader('updatenodeLoader');
	statusBar.append(loader);

	// Create info bar
	var infoBar = createInfoBar('Update nodes in an xCAT environment');
	updatenodeForm.append(infoBar);
	
	// Create target node or group input
	var tgt = $('<div><label for="target">Target node range:</label><input type="text" name="target" value="' + tgtNodes + '" title="The node or node range to update"/></div>');
	updatenodeForm.append(tgt);

	// Create options
	var options = $('<div></div>');
	var optionsLabel = $('<label>Options:</label>');	
	var optionsList = $('<ul></ul>');
	options.append(optionsLabel);
	options.append(optionsList);
	updatenodeForm.append(options);
		
	// Create update all software checkbox (only AIX)
	if (osHash['AIX']) {
		var updateAllOption = $('<li></li>');
    	var updateAllChkBox = $('<input type="checkbox" id="A" name="A"/>');
    	updateAllOption.append(updateAllChkBox);
    	optionsList.append(updateAllOption);
    	updateAllOption.append('Install or update all software contained in the source directory');
    	
    	// Create source directory input
    	var allSwScrDirectory = $('<li><label for="allSwSrcDirectory" style="vertical-align: middle">Source directory:</label><input type="text" id="allSwSrcDirectory" name="allSwSrcDirectory"/></li>');
    	// Browse server directory and files
    	var allSWSrcDirBrowse = createButton('Browse');
    	allSWSrcDirBrowse.serverBrowser({
    		onSelect : function(path) {
    			$('#allSwSrcDirectory').val(path);
    		},
    		onLoad : function() {
    			return $('#allSwSrcDirectory').val();
    		},
    		knownExt : [ 'exe', 'js', 'txt' ],
    		knownPaths : [ {
    			text : 'Install',
    			image : 'desktop.png',
    			path : '/install'
    		} ],
    		imageUrl : 'images/serverbrowser/',
    		systemImageUrl : 'images/serverbrowser/',
    		handlerUrl : 'lib/getpath.php',
    		title : 'Browse',
    		requestMethod : 'POST',
    		width : '500',
    		height : '300',
    		basePath : '/install' // Limit user to only install directory
    	});
    	allSwScrDirectory.append(allSWSrcDirBrowse);
    	allSwScrDirectory.hide();
    	optionsList.append(allSwScrDirectory);

    	// Show source directory when checked
    	updateAllChkBox.bind('click', function(event) {
    		if ($(this).is(':checked')) {
    			allSwScrDirectory.show();
    		} else {
    			allSwScrDirectory.hide();
    		}
    	});
	}
	
	// Create update software checkbox
	var updateOption = $('<li></li>');
	var updateChkBox = $('<input type="checkbox" id="S" name="S"/>');
	optionsList.append(updateOption);
	updateOption.append(updateChkBox);
	updateOption.append('Update existing software');
		
	// Create source directory input
	var scrDirectory = $('<li><label for="srcDirectory" style="vertical-align: middle">Source directory:</label><input type="text" id="srcDirectory" name="srcDirectory" title="You must give the source directory containing the updated software packages"/></li>');
	// Browse server directory and files
	var srcDirBrowse = createButton('Browse');
	srcDirBrowse.serverBrowser({
		onSelect : function(path) {
			$('#srcDirectory').val(path);
		},
		onLoad : function() {
			return $('#srcDirectory').val();
		},
		knownExt : [ 'exe', 'js', 'txt' ],
		knownPaths : [ {
			text : 'Install',
			image : 'desktop.png',
			path : '/install'
		} ],
		imageUrl : 'images/serverbrowser/',
		systemImageUrl : 'images/serverbrowser/',
		handlerUrl : 'lib/getpath.php',
		title : 'Browse',
		requestMethod : 'POST',
		width : '500',
		height : '300',
		basePath : '/install' // Limit user to only install directory
	});
	scrDirectory.append(srcDirBrowse);
	scrDirectory.hide();
	optionsList.append(scrDirectory);
	
	// Create other packages input
	var otherPkgs = $('<li><label for="otherpkgs" style="vertical-align: middle">otherpkgs:</label><input type="text" id="otherpkgs" name="otherpkgs"/></li>');
	otherPkgs.hide();
	optionsList.append(otherPkgs);
	
	// Create RPM flags input (only AIX)
	var aixRpmFlags = $('<li><label for="rpm_flags">rpm_flags:</label><input type="text" name="rpm_flags"/></li>');
	aixRpmFlags.hide();
	optionsList.append(aixRpmFlags);
	
	// Create installp flags input (only AIX)
	var aixInstallPFlags = $('<li><label for="installp_flags">installp_flags:</label><input type="text" name="installp_flags"/></li>');
	aixInstallPFlags.hide();
	optionsList.append(aixInstallPFlags);
	
	// Create emgr flags input (only AIX)
	var aixEmgrFlags = $('<li><label for="emgr_flags">emgr_flags:</label><input type="text" name="emgr_flags"/></li>');
	aixEmgrFlags.hide();
	optionsList.append(aixEmgrFlags);
	
	// Show flags when checked
	updateChkBox.bind('click', function(event) {
		if ($(this).is(':checked')) {
			scrDirectory.show();
			otherPkgs.show();
			if (osHash['AIX']) {
    			aixRpmFlags.show();
    			aixInstallPFlags.show();
    			aixEmgrFlags.show();
			}
		} else {
			scrDirectory.hide();
			otherPkgs.hide();
			if (osHash['AIX']) {
    			aixRpmFlags.hide();
    			aixInstallPFlags.hide();
    			aixEmgrFlags.hide();
			}
		}
	});
	
	// Create postscripts input
	var postOption = $('<li></li>');
	var postChkBox = $('<input type="checkbox" id="P" name="P"/>');
	optionsList.append(postOption);
	postOption.append(postChkBox);
	postOption.append('Run postscripts');
	var postscripts = $('<li><label for="postscripts" style="vertical-align: middle">Postscripts:</label><input type="text" id="postscripts" name="postscripts" title="You must give the postscript(s) to run"/></li>');
	postscripts.hide();
	optionsList.append(postscripts);
	
	// Show alternate source directory when checked
	postChkBox.bind('click', function(event) {
		if ($(this).is(':checked')) {
			postscripts.show();
		} else {
			postscripts.hide();
		}
	});
	optionsList.append('<li><input type="checkbox" id="F" name="F"/>Distribute and synchronize files</li>');
	optionsList.append('<li><input type="checkbox" id="k" name="k"/>Update the ssh keys and host keys for the service nodes and compute nodes</li>');
	
	// Create update OS checkbox
	if (!osHash['AIX']) {
		var osOption = $('<li></li>');
    	var osChkBox = $('<input type="checkbox" id="o" name="o"/>');
    	optionsList.append(osOption);
    	osOption.append(osChkBox);
    	osOption.append('Update the operating system');
    	
    	var os = $('<li></li>').hide();
    	var osLabel = $('<label for="os">Operating system:</label>');
    	var osInput = $('<input type="text" name="os" title="You must give the operating system to upgrade to, e.g. rhel5.5"/>');
    	osInput.one('focus', function(){
    		var tmp = $.cookie('osvers');
    		if (tmp) {
    			// Turn on auto complete
    			$(this).autocomplete({
    				source: tmp.split(',')
    			});
    		}
    	});
    	os.append(osLabel);
    	os.append(osInput);
    	optionsList.append(os);
    	
    	// Show alternate source directory when checked
    	osChkBox.bind('click', function(event) {
    		if ($(this).is(':checked')) {
    			os.show();
    		} else {
    			os.hide();
    		}
    	});
	}
	
	// Generate tooltips
	updatenodeForm.find('div input[title]').tooltip({
		position: "center right",
		offset: [-2, 10],
		effect: "fade",
		opacity: 0.7,
		predelay: 800,
		events : {
			def : "mouseover,mouseout",
			input : "mouseover,mouseout",
			widget : "focus mouseover,blur mouseout",
			tooltip : "mouseover,mouseout"
		}
	});
	
	/**
	 * Ok
	 */
	var okBtn = createButton('Ok');
	okBtn.bind('click', function(event) {
		// Remove any warning messages
		$(this).parent().parent().find('.ui-state-error').remove();
		var ready = true;
		
		// Generate arguments
		var chkBoxes = $("#" + newTabId + " input[type='checkbox']:checked");
		var optionsStr = '';
		var option;
		for ( var i = 0; i < chkBoxes.length; i++) {
			option = chkBoxes.eq(i).attr('name');
			optionsStr += '-' + option;
			
			// If update all software is checked
			if (option == 'S') {
				var srcDir = $('#' + newTabId + ' input[name=allSwSrcDirectory]').val();
				if (srcDir) {
					optionsStr += ';-d ' + srcDir;
				}
			}

			// If update software is checked
			if (option == 'S') {
				// Get source directory
				var srcDirectory = $('#' + newTabId + ' input[name=srcDirectory]').val();
				if (srcDirectory) {
					optionsStr += ';-d;' + srcDirectory;
				}
				
				// Get otherpkgs
				var otherpkgs = $('#' + newTabId + ' input[name=otherpkgs]').val();
				if (otherpkgs) {
					optionsStr += ';otherpkgs=' + otherpkgs;
				}
				
				// Get rpm_flags
				var rpm_flags = $('#' + newTabId + ' input[name=rpm_flags]').val();
				if (rpm_flags) {
					optionsStr += ';rpm_flags=' + rpm_flags;
				}
				
				// Get installp_flags
				var installp_flags = $('#' + newTabId + ' input[name=installp_flags]').val();
				if (installp_flags) {
					optionsStr += ';installp_flags=' + installp_flags;
				}
				
				// Get emgr_flags
				var emgr_flags = $('#' + newTabId + ' input[name=emgr_flags]').val();
				if (emgr_flags) {
					optionsStr += ';emgr_flags=' + emgr_flags;
				}
			}
			
			// If postscripts is checked
			if (option == 'P') {
				// Get postscripts
				optionsStr += ';' + $('#' + newTabId + ' input[name=postscripts]').val();
			}
			
			// If operating system is checked
			if (option == 'o') {
				// Get the OS
				optionsStr += ';' + $('#' + newTabId + ' input[name=os]').val();
			}
			
			// Append ; to end of string
			if (i < (chkBoxes.length - 1)) {
				optionsStr += ';';
			}
		}
		
		// If no inputs are empty
		if (ready) {
			// Get nodes
			var tgts = $('#' + newTabId + ' input[name=target]').val();

			// Disable all inputs and Ok button
			$('#' + newTabId + ' input').attr('disabled', 'disabled');
			$(this).attr('disabled', 'true');
			
			/**
			 * (1) Boot to network
			 */
			$.ajax( {
				url : 'lib/cmd.php',
				dataType : 'json',
				data : {
					cmd : 'updatenode',
					tgt : tgts,
					args : optionsStr,
					msg : 'out=' + statBarId + ';cmd=updatenode;tgt=' + tgts
				},

				success : updateStatusBar
			});

			// Show status bar
			statusBar.show();
		} else {
			// Show warning message
			var warn = createWarnBar('You are missing some values');
			warn.prependTo($(this).parent().parent());
		}
	});
	updatenodeForm.append(okBtn);

	// Append to discover tab
	tab.add(newTabId, 'Update', updatenodeForm, true);

	// Select new tab
	tab.select(newTabId);
}