/**
 * Load update page
 */
function loadUpdatePage() {
    var repositoryDiv = $('<div id="repository"></div>');
    var rpmDiv = $('<div id="rpm"></div>');
    var statusDiv = createStatusBar("update");
    statusDiv.hide();

    $('#updateTab').append(statusDiv);
    $('#updateTab').append(repositoryDiv);
    $('#updateTab').append(rpmDiv);

    var infoBar = createInfoBar('Select the repository to use and the RPMs to update, then click Update.');
    repositoryDiv.append(infoBar);

    repositoryDiv.append("<fieldset><legend>Repository</legend></fieldset>");
    $.ajax( {
        url : 'lib/systemcmd.php',
        dataType : 'json',
        data : {
            cmd : 'ostype'
        },

        success : showRepository
    });

    rpmDiv.append("<fieldset></fieldset>");
    $.ajax( {
        url : 'lib/systemcmd.php',
        dataType : 'json',
        data : {
            cmd : 'rpm -q xCAT-client perl-xCAT xCAT-server xCAT xCAT-rmc xCAT-UI'
        },

        success : showRpmInfo
    });
}

/**
 * Show the RPM repository (it can use the user's last choice and input)
 * 
 * @param data Data returned from HTTP request
 */
function showRepository(data) {
    var develRepository = "";
    var stableRepository = "";
    var show = "";

    // Get the corresponding repository by OS Type
    if (data.rsp == "aix") {
        // No repository exists for AIX on Sourceforge!
        develRepository = "http://xcat.sourceforge.net/aix/devel/xcat-core/";
        stableRepository = "http://xcat.sourceforge.net/aix/xcat-core/";
    } else {
        develRepository = "http://sourceforge.net/projects/xcat/files/yum/devel/xcat-core/";
        stableRepository = "http://sourceforge.net/projects/xcat/files/yum/stable/xcat-core/";
    }

    var repoList = $('<ol></ol>');

    // Display the Devel Repository, remember user's last selection
    show = show + "<li><input type='radio' ";
    if ($.cookie('xcatrepository') == 1) {
        show = show + "checked='true'";
    }
    show = show + "name='reporadio' value='" + develRepository + "'>";
    show = show + "<strong>Development</strong>: " + develRepository + "</li>";
    repoList.append(show);

    // Display the Stable Repository, remember user's last selection
    show = "<li><input type='radio' ";
    if ($.cookie('xcatrepository') == 2) {
        show = show + "checked='true'";
    }
    show = show + "name='reporadio' value='" + stableRepository + "' checked='true'>";
    show = show + "<strong>Stable</strong>: " + stableRepository + "</li>";
    repoList.append(show);

    // Display the Input Repository, remember user's last selection
    if (($.cookie('xcatrepository')) && ($.cookie('xcatrepository') != 1)
            && ($.cookie('xcatrepository') != 2)) {
        show = "<li><input type='radio' checked='true' name='reporadio' value=''>Other: ";
        show += "<input style='width: 500px' id='repositoryaddr' value='"
                + $.cookie('xcatrepository') + "'</li>";
    } else {
        show = "<li><input type='radio' name='reporadio' value=''>Other: ";
        show += "<input style='width: 500px' id='repositoryaddr' value=''</li>";
    }
    repoList.append(show);
    
    $('#repository fieldset').append(repoList);
}

/**
 * Show all xCAT RPMs
 * 
 * @param data Data returned from HTTP request
 */
function showRpmInfo(data) {
    var rpms = null;
    var show = "";
    var rpmNames = new Array("xCAT-client", "perl-xCAT", "xCAT-server", "xCAT", "xCAT-rmc",
            "xCAT-UI");
    var temp = 0;
    if (null == data.rsp) {
        $('#rpm fieldset').append("Error getting RPMs!");
        return;
    }

    rpms = data.rsp.split(/\n/);
    
    // No rpm installed, return
    if (1 > rpms.length) {
        $('#rpm fieldset').append("No RPMs installed!");
        return;
    }

    // Clear the old data
    $('#rpm fieldset').children().remove();
    $('#rpm fieldset').append("<legend>xCAT RPMs</legend>");
    show = "<table id=rpmtable >";
    show += "<thead class='ui-widget-header'><tr>";
    show += "<th><input type='checkbox' id='selectall' value='' onclick='updateSelectAll()'></th>";
    show += "<th><b>Package Name</b></th><th><b>Version</b></th>";
    show += "</tr></thead>";
    for (temp = 0; temp < rpms.length; temp++) {
        // Empty line continue
        if (!rpms[temp]) {
            continue;
        }

        // The RPM is not installed, continue
        if (rpms[temp].indexOf("not") != -1) {
            continue;
        }

        // Show the version in table
        show += "<tr>";
        show += "<td><input type='checkbox' value='" + rpmNames[temp] + "'></td>";
        show += "<td>" + rpmNames[temp] + "</td><td>"
                + rpms[temp].substr(rpmNames[temp].length + 1) + "</td>";
        show += "</tr>";
    }
    show += "</table>";
    show += "<br\>";
    $('#rpm fieldset').append(show);

    // Add the update button
    var updateButton = createButton('Update');
    $('#rpm fieldset').append(updateButton);
    updateButton.bind('click', function() {
        updateRpm();
    });
}

/**
 * Select all checkboxes
 */
function updateSelectAll() {
    var check_status = $('#selectall').attr('checked');
    $('input:checkbox').attr('checked', check_status);
}

/**
 * Update selected xCAT RPMs
 */
function updateRpm() {
    // Remove any warning messages
    $('#updateTab').find('.ui-state-error').remove();

    var rpmPath = $('input[type=radio]:checked').val();
    var rpmPathType = "0";
    var rpms = "";
    var temp = "";

    if (undefined == rpmPath) {
        rpmPath = "";
    }

    // Select other and we should use the value in the input
    if ("" == rpmPath) {
        // Store repo in a cookie
        rpmPath = $('#repositoryaddr').val();
        rpmPathType = rpmPath;
    } else {
        if (-1 == rpmPath.toLowerCase().indexOf("devel")) {
            rpmPathType = "2";
        } else {
            rpmPathType = "1";
        }
    }

    $("input[type=checkbox]:checked").each(function() {
        temp = $(this).val();
        if ("" == temp) {
            return true;
        }

        var pattern = new RegExp("^" + temp + ",|," + temp + ",");
        if (pattern.test(rpms)) {
            return true;
        }
        
        rpms = rpms + temp + ",";
    });

    if (0 < rpms.length) {
        rpms = rpms.slice(0, -1);
    }

    // Check RPM and repository
    var errMsg = '';
    if (!rpms) {
        errMsg = "Please select an RPM!<br>";
    }

    if (!rpmPath) {
        errMsg += "Please select or specify a repository!";
    }

    if (!rpms || !rpmPath) {
        // Show warning message
        var warn = createWarnBar(errMsg);
        warn.prependTo($('#updateTab'));
        return;
    }

    // Remember users' choice and input
    $.cookie('xcatrepository', rpmPathType, {
        path : '/xcat',
        expires : 10
    });

    $('#update').show();
    $('#update div').empty();
    $('#update div').append("<p>Updating <b>" + rpms + "</b> from <b>" + rpmPath + "</b></p>");
    $('#update div').append("<img id='loadingpic' src='images/loader.gif'>");
    $('#rpm button').attr('disabled', 'true');

    // Send the update command to server
    $.ajax( {
        url : 'lib/cmd.php',
        dataType : 'json',
        data : {
            cmd : 'webrun',
            tgt : '',
            args : 'update;' + rpms + ";" + rpmPath,
            msg : ''
        },

        success : showUpdateResult
    });
}

/**
 * Show the results of the RPM update
 * 
 * @param data Data returned from HTTP request
 */
function showUpdateResult(data) {
    var temp = 0;
    $('#loadingpic').remove();

    var resArray = data.rsp[0].split(/\n/);
    if (0 < resArray.length) {
        // Show last lines
        if (('' == resArray[resArray.length - 1]) && (resArray.length > 1)) {
            $('#update div').append('<pre>' + resArray[resArray.length - 2] + '</pre>');
        } else {
            $('#update div').append('<pre>' + resArray[resArray.length - 1] + '</pre>');
        }

        // Create link to show details
        $('#update div').append('<br/><a>Show details</a>');
        $('#update div a').css( {
            'color' : '#0000FF',
            'cursor' : 'pointer'
        }).bind('click', function() {
            // Toggle details and change text
            $('#resDetail').toggle();
            if ($('#update div a').text() == 'Show details') {
                $('#update div a').text('Hide details');
            } else {
                $('#update div a').text('Show details');
            }
        });

        var resDetail = $('<pre id="resDetail"></pre>');
        resDetail.hide();
        $('#update div').append(resDetail);
        for (temp = 0; temp < resArray.length; temp++) {
            resDetail.append(resArray[temp] + '<br/>');
        }
    }

    // Update the rpm info
    $.ajax( {
        url : 'lib/systemcmd.php',
        dataType : 'json',
        data : {
            cmd : 'rpm -q xCAT-client perl-xCAT xCAT-server xCAT xCAT-rmc xCAT-UI'
        },

        success : showRpmInfo
    });

    $('#rpm button').attr('disabled', '');
}