mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
2) Undo gson Unicode escape in API response object to avoid double escaping which can break Javascript from getting correct text content 3) Correct API layer in dealing with character encoding 4) Remove double escape in cloud.core.js
1992 lines
75 KiB
JavaScript
1992 lines
75 KiB
JavaScript
/**
|
|
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
|
|
*
|
|
* This software is licensed under the GNU General Public License v3 or later.
|
|
*
|
|
* It is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or any later version.
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
//***** actions for a tab in right panel (begin) ************************************************************************
|
|
function buildActionLinkForTab(label, actionMap, $actionMenu, $midmenuItem1, $thisTab) {
|
|
var apiInfo = actionMap[label];
|
|
var $listItem = $("#action_list_item").clone();
|
|
$actionMenu.find("#action_list").append($listItem.show());
|
|
$listItem.find("#link").text(label);
|
|
$listItem.data("label", label);
|
|
$listItem.data("apiInfo", apiInfo);
|
|
|
|
var id = $midmenuItem1.data("jsonObj").id;
|
|
|
|
$listItem.bind("click", function(event) {
|
|
$actionMenu.hide();
|
|
var $actionLink = $(this);
|
|
|
|
var dialogBeforeActionFn = apiInfo.dialogBeforeActionFn;
|
|
if(dialogBeforeActionFn == null) {
|
|
var apiCommand = "command="+apiInfo.api+"&id="+id;
|
|
doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $thisTab);
|
|
}
|
|
else {
|
|
dialogBeforeActionFn($actionLink, $thisTab, $midmenuItem1);
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
|
|
function doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $thisTab) {
|
|
var label = $actionLink.data("label");
|
|
var apiInfo = $actionLink.data("apiInfo");
|
|
|
|
var inProcessText = apiInfo.inProcessText;
|
|
var isAsyncJob = apiInfo.isAsyncJob;
|
|
var asyncJobResponse = apiInfo.asyncJobResponse;
|
|
var afterActionSeccessFn = apiInfo.afterActionSeccessFn;
|
|
|
|
var $spinningWheel = $thisTab.find("#spinning_wheel");
|
|
$spinningWheel.find("#description").text(inProcessText);
|
|
$spinningWheel.show();
|
|
|
|
$midmenuItem1.find("#content").removeClass("selected").addClass("inaction");
|
|
$midmenuItem1.find("#spinning_wheel").addClass("midmenu_addingloader").show();
|
|
$midmenuItem1.find("#spinning_wheel").data("inProcessText", inProcessText);
|
|
$midmenuItem1.find("#info_icon").hide();
|
|
|
|
var $afterActionInfoContainer = $("#right_panel_content #after_action_info_container_on_top");
|
|
$afterActionInfoContainer.removeClass("errorbox").hide();
|
|
|
|
//Async job (begin) *****
|
|
if(isAsyncJob == true) {
|
|
$.ajax({
|
|
data: createURL(apiCommand),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var jobId = json[asyncJobResponse].jobid;
|
|
var timerKey = "asyncJob_" + jobId;
|
|
$("body").everyTime(
|
|
10000,
|
|
timerKey,
|
|
function() {
|
|
$.ajax({
|
|
data: createURL("command=queryAsyncJobResult&jobId="+jobId),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var result = json.queryasyncjobresultresponse;
|
|
if (result.jobstatus == 0) {
|
|
return; //Job has not completed
|
|
} else {
|
|
$("body").stopTime(timerKey);
|
|
$spinningWheel.hide();
|
|
|
|
if (result.jobstatus == 1) { // Succeeded
|
|
handleMidMenuItemAfterDetailsTabAction($midmenuItem1, true, (label + " action succeeded."));
|
|
$afterActionInfoContainer.find("#after_action_info").text(label + " action succeeded.");
|
|
$afterActionInfoContainer.removeClass("errorbox").show();
|
|
afterActionSeccessFn(json, $midmenuItem1, id);
|
|
} else if (result.jobstatus == 2) { // Failed
|
|
handleMidMenuItemAfterDetailsTabAction($midmenuItem1, false, (label + " action failed. Reason: " + fromdb(result.jobresult.errortext)));
|
|
$afterActionInfoContainer.find("#after_action_info").text(label + " action failed. Reason: " + fromdb(result.jobresult.errortext));
|
|
$afterActionInfoContainer.addClass("errorbox").show();
|
|
}
|
|
}
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
$("body").stopTime(timerKey);
|
|
handleError(XMLHttpResponse, function() {
|
|
handleErrorInDetailsTab(XMLHttpResponse, $thisTab, label, $afterActionInfoContainer, $midmenuItem1);
|
|
});
|
|
}
|
|
});
|
|
},
|
|
0
|
|
);
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleError(XMLHttpResponse, function() {
|
|
handleErrorInDetailsTab(XMLHttpResponse, $thisTab, label, $afterActionInfoContainer, $midmenuItem1);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
//Async job (end) *****
|
|
|
|
//Sync job (begin) *****
|
|
else {
|
|
$.ajax({
|
|
data: createURL(apiCommand),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json) {
|
|
$spinningWheel.hide();
|
|
handleMidMenuItemAfterDetailsTabAction($midmenuItem1, true, (label + " action succeeded."));
|
|
|
|
$afterActionInfoContainer.find("#after_action_info").text(label + " action succeeded.");
|
|
$afterActionInfoContainer.removeClass("errorbox").show();
|
|
|
|
afterActionSeccessFn(json, $midmenuItem1, id);
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleError(XMLHttpResponse, function() {
|
|
handleErrorInDetailsTab(XMLHttpResponse, $thisTab, label, $afterActionInfoContainer, $midmenuItem1);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
//Sync job (end) *****
|
|
}
|
|
|
|
function handleErrorInDetailsTab(XMLHttpResponse, $thisTab, label, $afterActionInfoContainer, $midmenuItem1) {
|
|
var errorMsg = "";
|
|
if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) {
|
|
errorMsg = parseXMLHttpResponse(XMLHttpResponse);
|
|
}
|
|
|
|
var afterActionInfo;
|
|
if(errorMsg.length > 0)
|
|
afterActionInfo = label + " action failed. Reason: " + fromdb(errorMsg);
|
|
else
|
|
afterActionInfo = label + " action failed.";
|
|
|
|
$afterActionInfoContainer.find("#after_action_info").text(afterActionInfo);
|
|
$afterActionInfoContainer.addClass("errorbox").show();
|
|
|
|
$thisTab.find("#spinning_wheel").hide();
|
|
handleMidMenuItemAfterDetailsTabAction($midmenuItem1, false, afterActionInfo);
|
|
}
|
|
|
|
function handleMidMenuItemAfterDetailsTabAction($midmenuItem1, isSuccessful, afterActionInfo) {
|
|
$midmenuItem1.find("#content").removeClass("inaction");
|
|
$midmenuItem1.find("#spinning_wheel").hide();
|
|
|
|
$midmenuItem1.data("afterActionInfo", afterActionInfo);
|
|
|
|
var $infoIcon = $midmenuItem1.find("#info_icon").show();
|
|
if(isSuccessful)
|
|
$infoIcon.removeClass("error");
|
|
else
|
|
$infoIcon.addClass("error");
|
|
}
|
|
|
|
//***** actions for a tab in right panel (end) **************************************************************************
|
|
|
|
//***** actions for a subgrid item in right panel (begin) ************************************************************************
|
|
function buildActionLinkForSubgridItem(label, actionMap, $actionMenu, $subgridItem) {
|
|
var apiInfo = actionMap[label];
|
|
var $listItem = $("#action_list_item").clone();
|
|
$actionMenu.find("#action_list").append($listItem.show());
|
|
$listItem.find("#link").text(label);
|
|
$listItem.data("label", label);
|
|
$listItem.data("apiInfo", apiInfo);
|
|
|
|
var id = $subgridItem.data("jsonObj").id;
|
|
|
|
$listItem.bind("click", function(event) {
|
|
$actionMenu.hide();
|
|
var $actionLink = $(this);
|
|
|
|
var dialogBeforeActionFn = apiInfo.dialogBeforeActionFn;
|
|
if(dialogBeforeActionFn == null) {
|
|
var apiCommand = "command="+apiInfo.api+"&id="+id;
|
|
doActionToSubgridItem(id, $actionLink, apiCommand, $subgridItem);
|
|
}
|
|
else {
|
|
dialogBeforeActionFn($actionLink, $subgridItem);
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
|
|
function doActionToSubgridItem(id, $actionLink, apiCommand, $subgridItem) {
|
|
var label = $actionLink.data("label");
|
|
var apiInfo = $actionLink.data("apiInfo");
|
|
|
|
var inProcessText = apiInfo.inProcessText;
|
|
var isAsyncJob = apiInfo.isAsyncJob;
|
|
var asyncJobResponse = apiInfo.asyncJobResponse;
|
|
var afterActionSeccessFn = apiInfo.afterActionSeccessFn;
|
|
|
|
var $spinningWheel = $subgridItem.find("#spinning_wheel");
|
|
$spinningWheel.find("#description").text(inProcessText);
|
|
$spinningWheel.show();
|
|
$subgridItem.find("#after_action_info_container").removeClass("error").addClass("success").hide();
|
|
|
|
//Async job (begin) *****
|
|
if(isAsyncJob == true) {
|
|
$.ajax({
|
|
data: createURL(apiCommand),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var jobId = json[asyncJobResponse].jobid;
|
|
var timerKey = "asyncJob_" + jobId;
|
|
$("body").everyTime(
|
|
10000,
|
|
timerKey,
|
|
function() {
|
|
$.ajax({
|
|
data: createURL("command=queryAsyncJobResult&jobId="+jobId),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var result = json.queryasyncjobresultresponse;
|
|
if (result.jobstatus == 0) {
|
|
return; //Job has not completed
|
|
} else {
|
|
$("body").stopTime(timerKey);
|
|
$spinningWheel.hide();
|
|
if (result.jobstatus == 1) { // Succeeded
|
|
$subgridItem.find("#after_action_info").text(label + " action succeeded.");
|
|
$subgridItem.find("#after_action_info_container").removeClass("error").addClass("success").show();
|
|
afterActionSeccessFn(json, id, $subgridItem);
|
|
} else if (result.jobstatus == 2) { // Failed
|
|
$subgridItem.find("#after_action_info").text(label + " action failed. Reason: " + fromdb(result.jobresult.errortext));
|
|
$subgridItem.find("#after_action_info_container").removeClass("success").addClass("error").show();
|
|
}
|
|
}
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
$("body").stopTime(timerKey);
|
|
handleError(XMLHttpResponse, function() {
|
|
handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label);
|
|
});
|
|
}
|
|
});
|
|
},
|
|
0
|
|
);
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleError(XMLHttpResponse, function() {
|
|
handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
//Async job (end) *****
|
|
|
|
//Sync job (begin) *****
|
|
else {
|
|
$.ajax({
|
|
data: createURL(apiCommand),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json) {
|
|
$spinningWheel.hide();
|
|
$subgridItem.find("#after_action_info").text(label + " action succeeded.");
|
|
$subgridItem.find("#after_action_info_container").removeClass("error").addClass("success").show();
|
|
afterActionSeccessFn(json, id, $subgridItem);
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleError(XMLHttpResponse, function() {
|
|
handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
//Sync job (end) *****
|
|
}
|
|
|
|
function handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label) {
|
|
$subgridItem.find("#spinning_wheel").hide();
|
|
|
|
var errorMsg = "";
|
|
if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) {
|
|
errorMsg = parseXMLHttpResponse(XMLHttpResponse);
|
|
}
|
|
if(errorMsg.length > 0)
|
|
$subgridItem.find("#after_action_info").text(label + " action failed. Reason: " + fromdb(errorMsg));
|
|
else
|
|
$subgridItem.find("#after_action_info").text(label + " action failed.");
|
|
|
|
$subgridItem.find("#after_action_info_container").removeClass("success").addClass("error").show();
|
|
}
|
|
//***** actions for a subgrid item in right panel (end) **************************************************************************
|
|
|
|
//***** actions for middle menu (begin) ************************************************************************
|
|
var selectedItemsInMidMenu = {};
|
|
|
|
function buildActionLinkForMidMenu(label, actionMap, $actionMenu) {
|
|
var apiInfo = actionMap[label];
|
|
var $listItem = $("#action_list_item_middle_menu").clone();
|
|
$actionMenu.find("#action_list").append($listItem.show());
|
|
var $link = $listItem.find("#link").text(label);
|
|
$link.data("apiInfo", apiInfo);
|
|
|
|
/*
|
|
$link.data("label", label);
|
|
$link.data("api",apiInfo .api);
|
|
$link.data("isAsyncJob", apiInfo.isAsyncJob);
|
|
$link.data("asyncJobResponse", apiInfo.asyncJobResponse);
|
|
$link.data("afterActionSeccessFn", apiInfo.afterActionSeccessFn);
|
|
$link.data("dialogBeforeActionFn", apiInfo.dialogBeforeActionFn);
|
|
*/
|
|
|
|
$link.bind("click", function(event) {
|
|
$actionMenu.hide();
|
|
|
|
var itemCounts = 0;
|
|
for(var id in selectedItemsInMidMenu) {
|
|
itemCounts ++;
|
|
}
|
|
if(itemCounts == 0) {
|
|
$("#dialog_info_please_select_one_item_in_middle_menu").dialog("open");
|
|
return;
|
|
}
|
|
|
|
var $actionLink = $(this);
|
|
var dialogBeforeActionFn = $actionLink.data("dialogBeforeActionFn");
|
|
if(dialogBeforeActionFn == null) {
|
|
for(var id in selectedItemsInMidMenu) {
|
|
var apiCommand = "command="+$actionLink.data("api")+"&id="+id;
|
|
doActionToMidMenu(id, apiInfo, apiCommand);
|
|
}
|
|
}
|
|
else {
|
|
dialogBeforeActionFn(apiInfo, selectedItemsInMidMenu);
|
|
|
|
}
|
|
selectedItemsInMidMenu = {}; //clear selected items for action
|
|
return false;
|
|
});
|
|
}
|
|
|
|
function doActionToMidMenu(id, apiInfo, apiCommand) {
|
|
var label = apiInfo.label;
|
|
var isAsyncJob = apiInfo.isAsyncJob;
|
|
var inProcessText = apiInfo.inProcessText;
|
|
var asyncJobResponse = apiInfo.asyncJobResponse;
|
|
var afterActionSeccessFn = apiInfo.afterActionSeccessFn;
|
|
|
|
var $midmenuItem1 = $("#midmenuItem_"+id);
|
|
$midmenuItem1.find("#content").removeClass("selected").addClass("inaction");
|
|
$midmenuItem1.find("#spinning_wheel").addClass("midmenu_addingloader").show();
|
|
$midmenuItem1.find("#spinning_wheel").data("inProcessText", inProcessText);
|
|
$midmenuItem1.find("#info_icon").hide();
|
|
|
|
var $detailsTab = $("#right_panel_content #tab_content_details");
|
|
var $spinningWheel = $detailsTab.find("#spinning_wheel");
|
|
$spinningWheel.find("#description").text(inProcessText);
|
|
$spinningWheel.show();
|
|
|
|
//Async job (begin) *****
|
|
if(isAsyncJob == true) {
|
|
$.ajax({
|
|
data: createURL(apiCommand),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var jobId = json[asyncJobResponse].jobid;
|
|
var timerKey = "asyncJob_" + jobId;
|
|
$("body").everyTime(
|
|
10000,
|
|
timerKey,
|
|
function() {
|
|
$.ajax({
|
|
data: createURL("command=queryAsyncJobResult&jobId="+jobId),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var result = json.queryasyncjobresultresponse;
|
|
if (result.jobstatus == 0) {
|
|
return; //Job has not completed
|
|
} else {
|
|
$("body").stopTime(timerKey);
|
|
$midmenuItem1.find("#content").removeClass("inaction");
|
|
$midmenuItem1.find("#spinning_wheel").hide();
|
|
hideDetailsTabActionSpinningWheel(id, inProcessText);
|
|
if (result.jobstatus == 1) { // Succeeded
|
|
$midmenuItem1.find("#info_icon").removeClass("error").show();
|
|
$midmenuItem1.data("afterActionInfo", (label + " action succeeded."));
|
|
afterActionSeccessFn(json, $midmenuItem1, id);
|
|
} else if (result.jobstatus == 2) { // Failed
|
|
$midmenuItem1.find("#info_icon").addClass("error").show();
|
|
$midmenuItem1.data("afterActionInfo", (label + " action failed. Reason: " + fromdb(result.jobresult.errortext)));
|
|
}
|
|
}
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
$("body").stopTime(timerKey);
|
|
handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText);
|
|
}
|
|
});
|
|
},
|
|
0
|
|
);
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleError(XMLHttpResponse);
|
|
handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText);
|
|
}
|
|
});
|
|
}
|
|
//Async job (end) *****
|
|
|
|
//Sync job (begin) *****
|
|
else {
|
|
$.ajax({
|
|
data: createURL(apiCommand),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json) {
|
|
$midmenuItem1.find("#content").removeClass("inaction");
|
|
$midmenuItem1.find("#spinning_wheel").hide();
|
|
$midmenuItem1.find("#info_icon").removeClass("error").show();
|
|
$midmenuItem1.data("afterActionInfo", (label + " action succeeded."));
|
|
hideDetailsTabActionSpinningWheel(id, inProcessText);
|
|
afterActionSeccessFn(json, $midmenuItem1, id);
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText);
|
|
}
|
|
});
|
|
}
|
|
//Sync job (end) *****
|
|
}
|
|
|
|
function handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1, id, inProcessText) {
|
|
$midmenuItem1.find("#content").removeClass("inaction");
|
|
$midmenuItem1.find("#spinning_wheel").hide();
|
|
$midmenuItem1.find("#info_icon").addClass("error").show();
|
|
$midmenuItem1.find("#first_row").text("Action failed");
|
|
hideDetailsTabActionSpinningWheel(id, inProcessText);
|
|
|
|
var errorMsg = "";
|
|
if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) {
|
|
errorMsg = parseXMLHttpResponse(XMLHttpResponse);
|
|
}
|
|
if(errorMsg.length > 0)
|
|
$midmenuItem1.find("#second_row").text(fromdb(errorMsg));
|
|
else
|
|
$midmenuItem1.find("#second_row").html(" ");
|
|
}
|
|
|
|
function hideDetailsTabActionSpinningWheel(id, inProcessText) {
|
|
var $detailsTab = $("#right_panel_content #tab_content_details");
|
|
var jsonObj = $detailsTab.data("jsonObj");
|
|
var $spinningWheel = $detailsTab.find("#spinning_wheel");
|
|
if(jsonObj != null && ("id" in jsonObj) && jsonObj.id == id && ($spinningWheel.find("#description").text() == inProcessText)) {
|
|
$spinningWheel.hide();
|
|
}
|
|
}
|
|
|
|
/*
|
|
function handleAsyncJobFailInMidMenu(errorMsg, $midmenuItem1) {
|
|
$midmenuItem1.find("#content").removeClass("inaction");
|
|
$midmenuItem1.find("#spinning_wheel").hide();
|
|
$midmenuItem1.find("#info_icon").addClass("error").show();
|
|
$midmenuItem1.find("#first_row").text("Adding failed");
|
|
|
|
if(errorMsg.length > 0)
|
|
$midmenuItem1.find("#second_row").text(fromdb(errorMsg));
|
|
else
|
|
$midmenuItem1.find("#second_row").html(" ");
|
|
}
|
|
*/
|
|
|
|
/*
|
|
If Cancel button in dialog is clicked, action won't preceed.
|
|
i.e. doActionToMidMenu() won't get called => highlight won't be removd from middle menu.
|
|
So, we need to remove highlight here. Otherwise, it won't be consistent of selectedItemsInMidMenu which will be emptied soon.
|
|
*/
|
|
function removeHighlightInMiddleMenu(selectedItemsInMidMenu) {
|
|
for(var id in selectedItemsInMidMenu) {
|
|
var $midmenuItem1 = $("#midmenuItem_"+id);
|
|
$midmenuItem1.find("#content").removeClass("selected");
|
|
}
|
|
}
|
|
|
|
function copyActionInfoFromMidMenuToRightPanel($midmenuItem1) {
|
|
var $afterActionInfoContainer = $("#right_panel_content #after_action_info_container_on_top");
|
|
|
|
if($midmenuItem1.find("#info_icon").css("display") != "none") {
|
|
$afterActionInfoContainer.find("#after_action_info").text($midmenuItem1.data("afterActionInfo"));
|
|
if($midmenuItem1.find("#info_icon").hasClass("error"))
|
|
$afterActionInfoContainer.addClass("errorbox");
|
|
else
|
|
$afterActionInfoContainer.removeClass("errorbox");
|
|
$afterActionInfoContainer.show();
|
|
|
|
$midmenuItem1.find("#info_icon").hide(); //make info icon disappear after the middle menu item is clicked once
|
|
}
|
|
else {
|
|
$afterActionInfoContainer.find("#after_action_info").text("");
|
|
$afterActionInfoContainer.hide();
|
|
}
|
|
|
|
var $midMenuSpinningWheel = $midmenuItem1.find("#spinning_wheel");
|
|
if($midMenuSpinningWheel.css("display") != "none") {
|
|
var $detailsTabSpinningWheel = $("#right_panel_content #tab_content_details").find("#spinning_wheel");
|
|
if($detailsTabSpinningWheel.css("display") == "none") {
|
|
var inProcessText = $midMenuSpinningWheel.data("inProcessText");
|
|
$detailsTabSpinningWheel.find("#description").text(inProcessText);
|
|
$detailsTabSpinningWheel.show();
|
|
}
|
|
}
|
|
}
|
|
|
|
//***** actions for middle menu (end) **************************************************************************
|
|
|
|
|
|
function createURL(url) {
|
|
return url +"&response=json&sessionkey=" + g_sessionKey;
|
|
}
|
|
|
|
function fromdb(val) {
|
|
return sanitizeXSS(noNull(val));
|
|
}
|
|
|
|
function todb(val) {
|
|
return encodeURIComponent(val);
|
|
}
|
|
|
|
var midmenuItemCount = 20;
|
|
|
|
function setBooleanReadField(value, $field) {
|
|
if(value == "true" || value == true)
|
|
$field.text("Yes").show();
|
|
else if(value == "false" || value == false)
|
|
$field.text("No").show();
|
|
else
|
|
$field.hide();
|
|
}
|
|
|
|
function setBooleanEditField(value, $field) {
|
|
if(value == "true" || value == true)
|
|
$field.val("true");
|
|
else if(value == "false" || value == false)
|
|
$field.val("false");
|
|
else
|
|
$field.hide();
|
|
}
|
|
|
|
function clearMiddleMenu() {
|
|
$("#midmenu_container").empty();
|
|
$("#midmenu_action_link").hide();
|
|
clearAddButtonsOnTop();
|
|
}
|
|
|
|
function clearAddButtonsOnTop() {
|
|
$("#midmenu_add_link").unbind("click").hide();
|
|
|
|
$("#midmenu_add_zone_button").unbind("click").hide();
|
|
$("#midmenu_add_host_button").unbind("click").hide();
|
|
$("#midmenu_add_primarystorage_button").unbind("click").hide();
|
|
$("#midmenu_add_secondarystorage_button").unbind("click").hide();
|
|
$("#midmenu_add_pod_button").unbind("click").hide();
|
|
$("#midmenu_add_vlan_button").unbind("click").hide();
|
|
$("#midmenu_add_directIpRange_button").unbind("click").hide();
|
|
$("#midmenu_Update_SSL_Certificate_button").unbind("click").hide();
|
|
/*
|
|
$("#midmenu_add2_link").unbind("click").hide();
|
|
$("#midmenu_add3_link").unbind("click").hide();
|
|
*/
|
|
|
|
$("#midmenu_startvm_link").unbind("click").hide();
|
|
$("#midmenu_stopvm_link").unbind("click").hide();
|
|
$("#midmenu_rebootvm_link").unbind("click").hide();
|
|
$("#midmenu_destroyvm_link").unbind("click").hide();
|
|
}
|
|
|
|
function clearRightPanel() {
|
|
var $actionMenu = $("#right_panel_content #tab_content_details #action_link #action_menu");
|
|
$actionMenu.find("#action_list").empty();
|
|
$actionMenu.find("#action_list").append($("#no_available_actions").clone().show());
|
|
|
|
$("#right_panel_content #tab_content_details #spinning_wheel").hide();
|
|
$("#right_panel_content #after_action_info_container").hide();
|
|
}
|
|
|
|
|
|
var $selectedLeftMenu;
|
|
var $expandedLeftMenu;
|
|
function selectLeftMenu($menuToSelect, expandable) {
|
|
if ($selectedLeftMenu == null || ($menuToSelect.attr("id") != $selectedLeftMenu.attr("id"))) {
|
|
if($selectedLeftMenu != null) {
|
|
$selectedLeftMenu.removeClass("selected");
|
|
$selectedLeftMenu.find(".leftmenu_arrows_firstlevel_open").hide();
|
|
}
|
|
$menuToSelect.addClass("selected");
|
|
$menuToSelect.find(".leftmenu_arrows_firstlevel_open").show();
|
|
$selectedLeftMenu = $menuToSelect;
|
|
|
|
// collapse any current expanded menu
|
|
var $menuToExpand;
|
|
if (expandable != undefined && expandable) {
|
|
$menuToExpand = $selectedLeftMenu.siblings(".leftmenu_expandedbox");
|
|
}
|
|
|
|
if ($expandedLeftMenu != null) {
|
|
$expandedLeftMenu.slideUp(500, function() {
|
|
//if ($menuToExpand != null) $menuToExpand.slideDown(200);
|
|
});
|
|
if ($menuToExpand != null) $menuToExpand.slideDown(500);
|
|
$expandedLeftMenu = null;
|
|
} else if ($menuToExpand != null) {
|
|
$menuToExpand.slideDown(500);
|
|
}
|
|
$expandedLeftMenu = $menuToExpand;
|
|
|
|
// Close the help link if it's opened
|
|
$("#help_dropdown_dialog").hide();
|
|
$("#help_button").removeClass("selected");
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
var $selectedSubMenu;
|
|
function selectLeftSubMenu($menuToSelect) {
|
|
if ($selectedSubMenu == null || ($menuToSelect.attr("id") != $selectedSubMenu.attr("id"))) {
|
|
if($selectedSubMenu != null)
|
|
$selectedSubMenu.removeClass("selected");
|
|
$menuToSelect.addClass("selected");
|
|
$selectedSubMenu = $menuToSelect;
|
|
}
|
|
}
|
|
|
|
var selected_midmenu_id = null;
|
|
function hideMiddleMenu() {
|
|
$("#middle_menu, #search_panel, #middle_menu_pagination").hide();
|
|
$("#midmenu_container").empty();
|
|
$("#right_panel").removeClass("main_contentarea_with_midmenu").addClass("main_contentarea_without_midmenu");
|
|
}
|
|
function showMiddleMenu() {
|
|
$("#middle_menu, #search_panel, #middle_menu_pagination").show();
|
|
$("#right_panel").removeClass("main_contentarea_without_midmenu").addClass("main_contentarea_with_midmenu");
|
|
}
|
|
function isMiddleMenuShown() {
|
|
if($("#middle_menu").css("display") == "none")
|
|
return false;
|
|
else
|
|
return true;
|
|
}
|
|
|
|
// adding middle menu item ***
|
|
function beforeAddingMidMenuItem() {
|
|
var $midmenuItem1 = $("#midmenu_item").clone();
|
|
$midmenuItem1.find("#first_row").text("Adding....");
|
|
$midmenuItem1.find("#second_row").html(" ");
|
|
$midmenuItem1.find("#content").addClass("inaction");
|
|
$midmenuItem1.find("#spinning_wheel").show();
|
|
$midmenuItem1.find("#info_icon").removeClass("error").hide();
|
|
$("#midmenu_container").append($midmenuItem1.show());
|
|
return $midmenuItem1;
|
|
}
|
|
function afterAddingMidMenuItem($midmenuItem1, isSuccessful, extraMessage) {
|
|
$midmenuItem1.find("#content").removeClass("inaction");
|
|
$midmenuItem1.find("#spinning_wheel").hide();
|
|
|
|
if(isSuccessful == true) {
|
|
$midmenuItem1.find("#info_icon").removeClass("error").show();
|
|
$midmenuItem1.data("afterActionInfo", ("Adding succeeded."));
|
|
|
|
var $noItemsAvailable = $("#midmenu_container").find("#midmenu_container_no_items_available");
|
|
if($noItemsAvailable.length > 0) {
|
|
$noItemsAvailable.slideUp("slow", function() {
|
|
$(this).remove();
|
|
});
|
|
}
|
|
}
|
|
else {
|
|
$midmenuItem1.find("#content").addClass("addingfailed");
|
|
$midmenuItem1.find("#icon").attr("src", "images/addingfailed_icon.png");
|
|
$midmenuItem1.find("#icon_container").show();
|
|
$midmenuItem1.find("#first_row").text("Adding failed");
|
|
|
|
$midmenuItem1.find("#close_icon").show().bind("click", function(event) {
|
|
$midmenuItem1.slideUp("slow", function() {
|
|
$(this).remove();
|
|
});
|
|
return false;
|
|
});
|
|
}
|
|
|
|
if(extraMessage != null) {
|
|
$midmenuItem1.find("#second_row").text(extraMessage);
|
|
}
|
|
}
|
|
|
|
function bindClickToMidMenu($midmenuItem1, toRightPanelFn, getMidmenuIdFn) {
|
|
$midmenuItem1.bind("click", function(event){
|
|
var thisMidmenuItem = $(this);
|
|
|
|
if(selected_midmenu_id != null && selected_midmenu_id.length > 0)
|
|
$("#"+selected_midmenu_id).find("#content").removeClass("selected");
|
|
selected_midmenu_id = getMidmenuIdFn(thisMidmenuItem.data("jsonObj"));
|
|
|
|
thisMidmenuItem.find("#content").addClass("selected");
|
|
|
|
clearRightPanel();
|
|
toRightPanelFn(thisMidmenuItem);
|
|
return false;
|
|
});
|
|
}
|
|
|
|
function switchBetweenDifferentTabs(tabArray, tabContentArray, afterSwitchFnArray) {
|
|
for(var tabIndex=0; tabIndex<tabArray.length; tabIndex++) {
|
|
switchToTab(tabIndex, tabArray, tabContentArray, afterSwitchFnArray);
|
|
}
|
|
}
|
|
|
|
function switchToTab(tabIndex, tabArray, tabContentArray, afterSwitchFnArray) {
|
|
tabArray[tabIndex].bind("click", function(event){
|
|
tabArray[tabIndex].removeClass("off").addClass("on"); //current tab turns on
|
|
for(var k=0; k<tabArray.length; k++) {
|
|
if(k != tabIndex)
|
|
tabArray[k].removeClass("on").addClass("off"); //other tabs turns off
|
|
}
|
|
|
|
tabContentArray[tabIndex].show(); //current tab content shows
|
|
for(var k=0; k<tabContentArray.length; k++) {
|
|
if(k != tabIndex)
|
|
tabContentArray[k].hide(); //other tab content hide
|
|
}
|
|
|
|
if(afterSwitchFnArray != null) {
|
|
if(afterSwitchFnArray[tabIndex] != null)
|
|
afterSwitchFnArray[tabIndex]();
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
|
|
function updateVmStateInMidMenu(jsonObj, $midmenuItem1) {
|
|
if(jsonObj.state == "Running")
|
|
$midmenuItem1.find("#icon").attr("src", "images/status_green.png");
|
|
else if(jsonObj.state == "Stopped")
|
|
$midmenuItem1.find("#icon").attr("src", "images/status_red.png");
|
|
else //Destroyed, Creating, ~
|
|
$midmenuItem1.find("#icon").attr("src", "images/status_gray.png");
|
|
|
|
$midmenuItem1.find("#icon_container").show();
|
|
}
|
|
|
|
function updateHostStateInMidMenu(jsonObj, $midmenuItem1) {
|
|
if(jsonObj.state == "Up" || jsonObj.state == "Connecting")
|
|
$midmenuItem1.find("#icon").attr("src", "images/status_green.png");
|
|
else if(jsonObj.state == "Down" || jsonObj.state == "Alert")
|
|
$midmenuItem1.find("#icon").attr("src", "images/status_red.png");
|
|
else //ErrorInMaintenance, PrepareForMaintenance, Maintenance, Disconnected
|
|
$midmenuItem1.find("#icon").attr("src", "images/status_gray.png");
|
|
|
|
$midmenuItem1.find("#icon_container").show();
|
|
}
|
|
|
|
function enableConsoleHover($viewConsoleTemplate) {
|
|
var imgUrl = $viewConsoleTemplate.data("imgUrl");
|
|
var time = new Date();
|
|
|
|
$viewConsoleTemplate.find("#box0").css("background", "url("+imgUrl+"&t="+time.getTime()+")");
|
|
$viewConsoleTemplate.find("#box1").css("background", "url("+imgUrl+"&t="+time.getTime()+")");
|
|
|
|
var index = 0;
|
|
$viewConsoleTemplate.everyTime(2000, function() {
|
|
var time = new Date();
|
|
if ((index % 2) == 0) {
|
|
$viewConsoleTemplate.find("#box0").hide().css("background", "url("+imgUrl+"&t="+time.getTime()+")");
|
|
$viewConsoleTemplate.find("#box1").show();
|
|
} else {
|
|
$viewConsoleTemplate.find("#box1").hide().css("background", "url("+imgUrl+"&t="+time.getTime()+")");
|
|
$viewConsoleTemplate.find("#box0").show();
|
|
}
|
|
index++;
|
|
}, 0);
|
|
}
|
|
|
|
function disableConsoleHover($viewConsoleTemplate) {
|
|
$viewConsoleTemplate.stopTime();
|
|
}
|
|
|
|
function resetViewConsoleAction(jsonObj, $detailsTab) {
|
|
var $viewConsoleContainer = $detailsTab.find("#view_console_container").empty(); //reset view console panel
|
|
var $viewConsoleTemplate = $("#view_console_template").clone();
|
|
$viewConsoleContainer.append($viewConsoleTemplate.show());
|
|
if (jsonObj.state == 'Running') {
|
|
//console proxy thumbnail
|
|
var imgUrl = "console?cmd=thumbnail&vm=" + jsonObj.id + "&w=144&h=110";
|
|
$viewConsoleTemplate.data("imgUrl", imgUrl);
|
|
$viewConsoleTemplate.bind("mouseover", function(event) {
|
|
enableConsoleHover($(this));
|
|
});
|
|
$viewConsoleTemplate.bind("mouseout", function(event) {
|
|
disableConsoleHover($(this));
|
|
});
|
|
|
|
//console proxy popup
|
|
$viewConsoleTemplate.data("proxyUrl", "console?cmd=access&vm=" + jsonObj.id).data("vmId",jsonObj.id).click(function(event) {
|
|
var proxyUrl = $(this).data("proxyUrl");
|
|
//proxyUrl = "http://localhost:8080/client/" + proxyUrl; //***** temporary hack. This line will be removed after new UI code (/ui/new/*) moves to /ui/*
|
|
var viewer = window.open(proxyUrl, $(this).data("vmId"),"width=820,height=640,resizable=yes,menubar=no,status=no,scrollbars=no,toolbar=no,location=no");
|
|
viewer.focus();
|
|
return false;
|
|
});
|
|
}
|
|
}
|
|
|
|
function setVmStateInRightPanel(stateValue, $stateField) {
|
|
if(stateValue == "Running")
|
|
$stateField.text(stateValue).removeClass("red gray").addClass("green");
|
|
else if(stateValue == "Stopped")
|
|
$stateField.text(stateValue).removeClass("green gray").addClass("red");
|
|
else //Destroyed, Creating, ~
|
|
$stateField.text(stateValue).removeClass("green red").addClass("gray");
|
|
}
|
|
|
|
function setHostStateInRightPanel(stateValue, $stateField) {
|
|
if(stateValue == "Up" || stateValue == "Connecting")
|
|
$stateField.text(stateValue).removeClass("status_red status_gray").addClass("status_green");
|
|
else if(stateValue == "Down" || stateValue == "Alert" || stateValue == "ErrorInMaintenance")
|
|
$stateField.text(stateValue).removeClass("status_green status_gray").addClass("status_red");
|
|
else //"PrepareForMaintenance", "Maintenance", "Disconnected"
|
|
$stateField.text(stateValue).removeClass("status_green status_red").addClass("status_gray");
|
|
}
|
|
|
|
function setTemplateStateInRightPanel(stateValue, $stateField) {
|
|
$stateField.text(stateValue);
|
|
|
|
if(stateValue == "Ready")
|
|
$stateField.text(stateValue).removeClass("status_red").addClass("status_green");
|
|
else
|
|
$stateField.text(stateValue).removeClass("status_green").addClass("status_red");
|
|
}
|
|
|
|
function initDialog(elementId, width1, addToActive) {
|
|
if(width1 == null) {
|
|
activateDialog($("#"+elementId).dialog({
|
|
autoOpen: false,
|
|
modal: true,
|
|
zIndex: 2000
|
|
}), addToActive);
|
|
}
|
|
else {
|
|
activateDialog($("#"+elementId).dialog({
|
|
width: width1,
|
|
autoOpen: false,
|
|
modal: true,
|
|
zIndex: 2000
|
|
}), addToActive);
|
|
}
|
|
}
|
|
|
|
function initDialogWithOK(elementId, width1, addToActive) {
|
|
if(width1 == null) {
|
|
activateDialog($("#"+elementId).dialog({
|
|
autoOpen: false,
|
|
modal: true,
|
|
zIndex: 2000,
|
|
buttons: { "OK": function() { $(this).dialog("close"); } }
|
|
}), addToActive);
|
|
}
|
|
else {
|
|
activateDialog($("#"+elementId).dialog({
|
|
width: width1,
|
|
autoOpen: false,
|
|
modal: true,
|
|
zIndex: 2000,
|
|
buttons: { "OK": function() { $(this).dialog("close"); } }
|
|
}), addToActive);
|
|
}
|
|
}
|
|
|
|
function disableMultipleSelectionInMidMenu() {
|
|
$("#midmenu_container").selectable("destroy"); //Most pages don't need multiple selection in middle menu.
|
|
}
|
|
function enableMultipleSelectionInMidMenu() {
|
|
$("#midmenu_container").selectable({
|
|
selecting: function(event, ui) {
|
|
if(ui.selecting.id.indexOf("midmenuItem") != -1) {
|
|
var $midmenuItem1 = $("#"+ui.selecting.id);
|
|
if($midmenuItem1.find("#content").hasClass("inaction") == false) { //only items not in action are allowed to be selected
|
|
var id =$midmenuItem1.data("jsonObj").id;
|
|
selectedItemsInMidMenu[id] = $midmenuItem1;
|
|
$midmenuItem1.find("#content").addClass("selected");
|
|
}
|
|
clearRightPanel();
|
|
var toRightPanelFn = $midmenuItem1.data("toRightPanelFn");
|
|
toRightPanelFn($midmenuItem1);
|
|
}
|
|
},
|
|
unselecting: function(event, ui) {
|
|
if(ui.unselecting.id.indexOf("midmenuItem") != -1) {
|
|
var $midmenuItem1 = $("#"+ui.unselecting.id);
|
|
var id = $midmenuItem1.data("jsonObj").id;
|
|
if(id in selectedItemsInMidMenu) {
|
|
delete selectedItemsInMidMenu[id];
|
|
$midmenuItem1.find("#content").removeClass("selected");
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function getMidmenuId(jsonObj) {
|
|
return "midmenuItem_" + jsonObj.id;
|
|
}
|
|
|
|
function listMidMenuItems2(commandString, jsonResponse1, jsonResponse2, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu, clickFirstItem, $midMenuContainer) {
|
|
if(isMultipleSelectionInMidMenu == true)
|
|
enableMultipleSelectionInMidMenu();
|
|
else
|
|
disableMultipleSelectionInMidMenu();
|
|
|
|
var count = 0;
|
|
$.ajax({
|
|
cache: false,
|
|
data: createURL("command="+commandString+"&pagesize="+midmenuItemCount),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json) {
|
|
selectedItemsInMidMenu = {};
|
|
var items = json[jsonResponse1][jsonResponse2];
|
|
if(items != null && items.length > 0) {
|
|
for(var i=0; i<items.length;i++) {
|
|
var $midmenuItem1 = $("#midmenu_item").clone();
|
|
$midmenuItem1.data("toRightPanelFn", toRightPanelFn);
|
|
toMidmenuFn(items[i], $midmenuItem1);
|
|
bindClickToMidMenu($midmenuItem1, toRightPanelFn, getMidmenuIdFn);
|
|
|
|
if($midMenuContainer == null)
|
|
$midMenuContainer = $("#midmenu_container");
|
|
|
|
$midMenuContainer.append($midmenuItem1.show());
|
|
if(clickFirstItem == true && i == 0) { //click the 1st item in middle menu as default
|
|
$midmenuItem1.click();
|
|
if(isMultipleSelectionInMidMenu == true) {
|
|
$midmenuItem1.addClass("ui-selected"); //because instance page is using JQuery selectable widget to do multiple-selection
|
|
selectedItemsInMidMenu[items[i].id] = $midmenuItem1; //because instance page is using JQuery selectable widget to do multiple-selection
|
|
}
|
|
}
|
|
}
|
|
count = items.length;
|
|
}
|
|
else {
|
|
$("#midmenu_container").append($("#midmenu_container_no_items_available").clone().show());
|
|
}
|
|
$("#midmenu_container").show();
|
|
$("#midmenu_spinning_wheel").hide();
|
|
}
|
|
});
|
|
|
|
return count;
|
|
}
|
|
|
|
function listMidMenuItems(commandString, jsonResponse1, jsonResponse2, rightPanelJSP, afterLoadRightPanelJSPFn, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu, leftmenuId) {
|
|
clearMiddleMenu();
|
|
showMiddleMenu();
|
|
$("#midmenu_container").hide();
|
|
$("#midmenu_spinning_wheel").show();
|
|
|
|
$("#right_panel").data("onRefreshFn", function() {
|
|
$("#"+leftmenuId).click();
|
|
});
|
|
|
|
$("#right_panel").load(rightPanelJSP, function(){
|
|
var $actionLink = $("#right_panel_content #tab_content_details #action_link");
|
|
$actionLink.bind("mouseover", function(event) {
|
|
$(this).find("#action_menu").show();
|
|
return false;
|
|
});
|
|
$actionLink.bind("mouseout", function(event) {
|
|
$(this).find("#action_menu").hide();
|
|
return false;
|
|
});
|
|
removeDialogs();
|
|
afterLoadRightPanelJSPFn();
|
|
listMidMenuItems2(commandString, jsonResponse1, jsonResponse2, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu, true);
|
|
});
|
|
return false;
|
|
}
|
|
|
|
function bindAndListMidMenuItems($leftmenu, commandString, jsonResponse1, jsonResponse2, rightPanelJSP, afterLoadRightPanelJSPFn, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu) {
|
|
$leftmenu.bind("click", function(event) {
|
|
selectLeftSubMenu($(this));
|
|
listMidMenuItems(commandString, jsonResponse1, jsonResponse2, rightPanelJSP, afterLoadRightPanelJSPFn, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu, $(this).attr("id"));
|
|
return false;
|
|
});
|
|
}
|
|
|
|
function handleErrorInDialog(XMLHttpResponse, $thisDialog) {
|
|
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
|
|
handleErrorInDialog2(errorMsg, $thisDialog);
|
|
}
|
|
|
|
function handleErrorInDialog2(errorMsg, $thisDialog) {
|
|
var $infoContainer = $thisDialog.find("#info_container");
|
|
|
|
if(errorMsg != null && errorMsg.length > 0)
|
|
$infoContainer.find("#info").text(fromdb(errorMsg));
|
|
else
|
|
$infoContainer.find("#info").text("action failed");
|
|
|
|
$thisDialog.find("#spinning_wheel").hide();
|
|
$infoContainer.show();
|
|
}
|
|
|
|
function parseXMLHttpResponse(XMLHttpResponse) {
|
|
var start = XMLHttpResponse.responseText.indexOf("h1") + 3;
|
|
var end = XMLHttpResponse.responseText.indexOf("</h1");
|
|
var errorMsg = XMLHttpResponse.responseText.substring(start, end);
|
|
return fromdb(errorMsg);
|
|
}
|
|
|
|
function showLeftNavigationBasedOnRole() {
|
|
if (isAdmin()) {
|
|
$("#leftmenu_domain, #leftmenu_account, #leftmenu_system, #leftmenu_resources, #leftmenu_alert_container, #launch_test").show();
|
|
}
|
|
else if(isDomainAdmin()){
|
|
$("#leftmenu_domain, #leftmenu_account").show();
|
|
}
|
|
else{ //isUser() == true
|
|
}
|
|
}
|
|
|
|
function drawBarChart($capacity, percentused) { //percentused == "0.01%" (having % inside)
|
|
$capacity.find("#percentused").text(percentused);
|
|
|
|
var percentusedFloat;
|
|
if(percentused.indexOf("%") != -1) {
|
|
percentused = percentused.replace("%", "");
|
|
percentusedFloat = parseFloat(percentused);
|
|
percentusedFloat = percentusedFloat * 0.01; //because % is removed. percentusedFloat == 0.0001
|
|
}
|
|
else {
|
|
percentusedFloat = parseFloat(percentused);
|
|
}
|
|
|
|
if (percentusedFloat <= 0.6)
|
|
$capacity.find("#bar_chart").removeClass().addClass("db_barbox low").css("width", percentused);
|
|
else if (percentusedFloat > 0.6 && percentusedFloat <= 0.8 )
|
|
$capacity.find("#bar_chart").removeClass().addClass("db_barbox mid").css("width", percentused);
|
|
else if (percentusedFloat > 0.8 )
|
|
$capacity.find("#bar_chart").removeClass().addClass("db_barbox high").css("width", percentused);
|
|
}
|
|
|
|
function expandOrCollapseZoneTree() {
|
|
$arrowIcon = $("#leftmenu_physical_resource").find("#physical_resource_arrow");
|
|
if($arrowIcon.hasClass("expanded_close") == true) {
|
|
$arrowIcon.removeClass("expanded_close").addClass("expanded_open");
|
|
buildZoneTree();
|
|
} else {
|
|
$arrowIcon.removeClass("expanded_open").addClass("expanded_close");
|
|
$("#leftmenu_zone_tree").find("#tree_container").empty();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var g_mySession = null;
|
|
var g_sessionKey = null;
|
|
var g_role = null; // roles - root, domain-admin, ro-admin, user
|
|
var g_username = null;
|
|
var g_account = null;
|
|
var g_domainid = null;
|
|
var g_enableLogging = false;
|
|
var g_timezoneoffset = null;
|
|
var g_timezone = null;
|
|
|
|
// capabilities
|
|
var g_networkType = "vnet"; // vnet, vlan, direct
|
|
function getNetworkType() { return g_networkType; }
|
|
|
|
var g_hypervisorType = "kvm";
|
|
function getHypervisorType() { return g_hypervisorType; }
|
|
|
|
var g_directAttachNetworkGroupsEnabled = "false";
|
|
function getDirectAttachNetworkGroupsEnabled() { return g_directAttachNetworkGroupsEnabled; }
|
|
|
|
var g_directAttachedUntaggedEnabled = "false";
|
|
function getDirectAttachUntaggedEnabled() { return g_directAttachedUntaggedEnabled; }
|
|
|
|
var g_systemVmUseLocalStorage = "false";
|
|
function getSystemVmUseLocalStorage() { return g_systemVmUseLocalStorage; }
|
|
|
|
//keyboard keycode
|
|
var keycode_Enter = 13;
|
|
|
|
//dropdown field size
|
|
var maxPageSize = "&pagesize=500";
|
|
|
|
//XMLHttpResponse.status
|
|
var ERROR_ACCESS_DENIED_DUE_TO_UNAUTHORIZED = 401;
|
|
var ERROR_INTERNET_NAME_NOT_RESOLVED = 12007;
|
|
var ERROR_INTERNET_CANNOT_CONNECT = 12029;
|
|
var ERROR_VMOPS_ACCOUNT_ERROR = 531;
|
|
|
|
var g_logger = new Logger();
|
|
$(function() {
|
|
if(g_enableLogging)
|
|
g_logger.open();
|
|
});
|
|
|
|
// Test Tool. Please comment this out or remove this when going production.
|
|
// This is intended to provide a simple test tool to create user accounts and
|
|
// domains.
|
|
function initializeTestTool() {
|
|
$("#launch_test").click(function(event) {
|
|
testWindow = window.open('/client/test');
|
|
testWindow.g_sessionKey=g_sessionKey;
|
|
return false;
|
|
});
|
|
}
|
|
|
|
// Role Functions
|
|
function isAdmin() {
|
|
return (g_role == 1);
|
|
}
|
|
|
|
function isDomainAdmin() {
|
|
return (g_role == 2);
|
|
}
|
|
|
|
function isUser() {
|
|
return (g_role == 0);
|
|
}
|
|
|
|
function setDateField(dateValue, dateField, htmlMarkup) {
|
|
if (dateValue != null && dateValue.length > 0) {
|
|
var disconnected = new Date();
|
|
disconnected.setISO8601(dateValue);
|
|
var showDate;
|
|
if(g_timezoneoffset != null)
|
|
showDate = disconnected.getTimePlusTimezoneOffset(g_timezoneoffset);
|
|
else
|
|
showDate = disconnected.format("m/d/Y H:i:s");
|
|
if(htmlMarkup == null)
|
|
dateField.text(showDate);
|
|
else
|
|
dateField.html(htmlMarkup + showDate);
|
|
}
|
|
}
|
|
|
|
function initResizable(resizeElement, alsoResizeElement) {
|
|
var alsoResizeUi_originalHeight;
|
|
$("#"+resizeElement).resizable({
|
|
handles: 'e, w',
|
|
autoHide: true,
|
|
//containment: ".grid_header" ,
|
|
alsoResize: "."+alsoResizeElement
|
|
});
|
|
}
|
|
|
|
var sortBy = "";
|
|
var parseFunction = function() {}
|
|
var sortingOrder = "asc";
|
|
|
|
function sortArrayAlphabetically(a, b) {
|
|
if(a[sortBy] == null || b[sortBy] == null)
|
|
return 0;
|
|
|
|
var A = a[sortBy].toLowerCase();
|
|
var B = b[sortBy].toLowerCase();
|
|
|
|
if(sortingOrder == "asc") {
|
|
if (A < B)
|
|
return -1;
|
|
if (A > B)
|
|
return 1;
|
|
} else {
|
|
if (A < B)
|
|
return 1;
|
|
if (A > B)
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function sortArrayAlphabeticallyParse(a, b) {
|
|
if(a[sortBy] == null || b[sortBy] == null)
|
|
return 0;
|
|
|
|
var A = parseFunction(a[sortBy]).toLowerCase();
|
|
var B = parseFunction(b[sortBy]).toLowerCase();
|
|
|
|
if(sortingOrder == "asc") {
|
|
if (A < B)
|
|
return -1;
|
|
if (A > B)
|
|
return 1;
|
|
} else {
|
|
if (A < B)
|
|
return 1;
|
|
if (A > B)
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function sortArrayNumerically(a, b) {
|
|
if(a[sortBy] == null || b[sortBy] == null)
|
|
return 0;
|
|
|
|
var A = parseInt(a[sortBy]);
|
|
var B = parseInt(b[sortBy]);
|
|
|
|
if(sortingOrder == "asc") {
|
|
if (A < B)
|
|
return -1;
|
|
if (A > B)
|
|
return 1;
|
|
} else {
|
|
if (A < B)
|
|
return 1;
|
|
if (A > B)
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function sortArrayNumericallyParse(a, b) {
|
|
if(a[sortBy] == null || b[sortBy] == null)
|
|
return 0;
|
|
|
|
var A = parseFunction(parseInt(a[sortBy]));
|
|
var B = parseFunction(parseInt(b[sortBy]));
|
|
|
|
if(sortingOrder == "asc") {
|
|
if (A < B)
|
|
return -1;
|
|
if (A > B)
|
|
return 1;
|
|
} else {
|
|
if (A < B)
|
|
return 1;
|
|
if (A > B)
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function sortArrayByDate(a, b) {
|
|
if(a[sortBy] == null || b[sortBy] == null)
|
|
return 0;
|
|
|
|
var A = convertMilliseconds(a[sortBy]);
|
|
var B = convertMilliseconds(b[sortBy]);
|
|
|
|
if(sortingOrder == "asc") {
|
|
if (A < B)
|
|
return -1;
|
|
if (A > B)
|
|
return 1;
|
|
} else {
|
|
if (A < B)
|
|
return 1;
|
|
if (A > B)
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function convertMilliseconds(string) {
|
|
if (string != null && string.length > 0) {
|
|
var date1 = new Date();
|
|
date1.setISO8601(string);
|
|
return date1.getTime();
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function drawGrid(items, submenuContent, template, fnJSONToTemplate) {
|
|
var grid = submenuContent.find("#grid_content").empty();
|
|
if (items != null && items.length > 0) {
|
|
for (var i = 0; i < items.length; i++) {
|
|
var newTemplate = template.clone(true);
|
|
fnJSONToTemplate(items[i], newTemplate);
|
|
grid.append(newTemplate.show());
|
|
}
|
|
setGridRowsTotal(submenuContent.find("#grid_rows_total"), items.length);
|
|
if(items.length < pageSize)
|
|
submenuContent.find("#nextPage_div").hide();
|
|
else
|
|
submenuContent.find("#nextPage_div").show();
|
|
} else {
|
|
setGridRowsTotal(submenuContent.find("#grid_rows_total"), null);
|
|
submenuContent.find("#nextPage_div").hide();
|
|
}
|
|
}
|
|
|
|
//listItems() function takes care of loading image, pagination
|
|
var items = [];
|
|
function listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate ) {
|
|
if(currentPage==1)
|
|
submenuContent.find("#prevPage_div").hide();
|
|
else
|
|
submenuContent.find("#prevPage_div").show();
|
|
|
|
submenuContent.find("#loading_gridtable").show();
|
|
submenuContent.find("#pagination_panel").hide();
|
|
|
|
index = 0;
|
|
$.ajax({
|
|
data: createURL(commandString),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json) {
|
|
//IF jsonResponse1=="listaccountsresponse", jsonResponse2=="account", THEN json[jsonResponse1][jsonResponse2] == json.listaccountsresponse.account
|
|
items = json[jsonResponse1][jsonResponse2];
|
|
drawGrid(items, submenuContent, template, fnJSONToTemplate);
|
|
submenuContent.find("#loading_gridtable").hide();
|
|
submenuContent.find("#pagination_panel").show();
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
submenuContent.find("#loading_gridtable").hide();
|
|
handleError(XMLHttpResponse, function() {
|
|
if(XMLHttpResponse.status == ERROR_VMOPS_ACCOUNT_ERROR) {
|
|
submenuContent.find("#grid_content").empty();
|
|
setGridRowsTotal(submenuContent.find("#grid_rows_total"), null);
|
|
submenuContent.find("#nextPage_div").hide();
|
|
}
|
|
submenuContent.find("#loading_gridtable").hide();
|
|
submenuContent.find("#pagination_panel").show();
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
//event binder
|
|
var currentPage = 1;
|
|
var pageSize = 50; //consistent with server-side
|
|
function submenuContentEventBinder(submenuContent, listFunction) {
|
|
submenuContent.find("#nextPage").bind("click", function(event){
|
|
event.preventDefault();
|
|
currentPage++;
|
|
listFunction();
|
|
});
|
|
|
|
submenuContent.find("#prevPage").bind("click", function(event){
|
|
event.preventDefault();
|
|
currentPage--;
|
|
listFunction();
|
|
});
|
|
|
|
submenuContent.find("#refresh").bind("click", function(event){
|
|
event.preventDefault();
|
|
currentPage=1;
|
|
listFunction();
|
|
});
|
|
|
|
submenuContent.find("#search_button").bind("click", function(event) {
|
|
event.preventDefault();
|
|
currentPage = 1;
|
|
listFunction();
|
|
});
|
|
|
|
submenuContent.find("#adv_search_button").bind("click", function(event) {
|
|
event.preventDefault();
|
|
currentPage = 1;
|
|
listFunction();
|
|
submenuContent.find("#search_button").data("advanced", false);
|
|
submenuContent.find("#advanced_search").hide();
|
|
});
|
|
|
|
submenuContent.find("#search_input").bind("keypress", function(event) {
|
|
if(event.keyCode == keycode_Enter) {
|
|
event.preventDefault();
|
|
submenuContent.find("#search_button").click();
|
|
}
|
|
});
|
|
|
|
submenuContent.find("#advanced_search").bind("keypress", function(event) {
|
|
if(event.keyCode == keycode_Enter) {
|
|
event.preventDefault();
|
|
submenuContent.find("#adv_search_button").click();
|
|
}
|
|
});
|
|
|
|
submenuContent.find("#advanced_search_close").bind("click", function(event) {
|
|
event.preventDefault();
|
|
submenuContent.find("#search_button").data("advanced", false);
|
|
submenuContent.find("#advanced_search").hide();
|
|
});
|
|
|
|
submenuContent.find("#advanced_search_link").bind("click", function(event) {
|
|
event.preventDefault();
|
|
submenuContent.find("#search_button").data("advanced", true);
|
|
submenuContent.find("#advanced_search").show();
|
|
});
|
|
|
|
var zoneSelect = submenuContent.find("#advanced_search #adv_search_zone");
|
|
if(zoneSelect.length>0) { //if zone dropdown is found on Advanced Search dialog
|
|
$.ajax({
|
|
data: createURL("command=listZones&available=true&response=json"+maxPageSize),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var zones = json.listzonesresponse.zone;
|
|
zoneSelect.empty();
|
|
zoneSelect.append("<option value=''></option>");
|
|
if (zones != null && zones.length > 0) {
|
|
for (var i = 0; i < zones.length; i++) {
|
|
zoneSelect.append("<option value='" + zones[i].id + "'>" + fromdb(zones[i].name) + "</option>");
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
var podSelect = submenuContent.find("#advanced_search #adv_search_pod").empty();
|
|
var podLabel = submenuContent.find("#advanced_search #adv_search_pod_label");
|
|
if(podSelect.length>0 && isAdmin()) { //if pod dropdown is found on Advanced Search dialog and if its role is admin
|
|
zoneSelect.bind("change", function(event) {
|
|
var zoneId = $(this).val();
|
|
if (zoneId == null || zoneId.length == 0) {
|
|
podLabel.css("color", "gray");
|
|
podSelect.attr("disabled", "disabled");
|
|
podSelect.empty();
|
|
} else {
|
|
podLabel.css("color", "black");
|
|
podSelect.removeAttr("disabled");
|
|
$.ajax({
|
|
data: createURL("command=listPods&zoneId="+zoneId+"&response=json"+maxPageSize),
|
|
dataType: "json",
|
|
async: false,
|
|
success: function(json) {
|
|
var pods = json.listpodsresponse.pod;
|
|
podSelect.empty();
|
|
if (pods != null && pods.length > 0) {
|
|
for (var i = 0; i < pods.length; i++) {
|
|
podSelect.append("<option value='" + pods[i].id + "'>" + fromdb(pods[i].name) + "</option>");
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
return false;
|
|
});
|
|
|
|
zoneSelect.change();
|
|
}
|
|
}
|
|
|
|
var domainSelect = submenuContent.find("#advanced_search #adv_search_domain");
|
|
if(domainSelect.length>0 && isAdmin()) {
|
|
var domainSelect = domainSelect.empty();
|
|
$.ajax({
|
|
data: createURL("command=listDomains&available=true&response=json"+maxPageSize),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var domains = json.listdomainsresponse.domain;
|
|
if (domains != null && domains.length > 0) {
|
|
for (var i = 0; i < domains.length; i++) {
|
|
domainSelect.append("<option value='" + domains[i].id + "'>" + fromdb(domains[i].name) + "</option>");
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
var vmSelect = submenuContent.find("#advanced_search").find("#adv_search_vm");
|
|
if(vmSelect.length>0) {
|
|
vmSelect.empty();
|
|
vmSelect.append("<option value=''></option>");
|
|
$.ajax({
|
|
data: createURL("command=listVirtualMachines&response=json"+maxPageSize),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var items = json.listvirtualmachinesresponse.virtualmachine;
|
|
if (items != null && items.length > 0) {
|
|
for (var i = 0; i < items.length; i++) {
|
|
vmSelect.append("<option value='" + items[i].id + "'>" + fromdb(items[i].name) + "</option>");
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// Validation functions
|
|
function showError(isValid, field, errMsgField, errMsg) {
|
|
if(isValid) {
|
|
errMsgField.text("").hide();
|
|
field.addClass("text").removeClass("error_text");
|
|
}
|
|
else {
|
|
errMsgField.text(errMsg).show();
|
|
field.removeClass("text").addClass("error_text");
|
|
}
|
|
}
|
|
|
|
function showError2(isValid, field, errMsgField, errMsg, appendErrMsg) {
|
|
if(isValid) {
|
|
errMsgField.text("").hide();
|
|
field.addClass("text2").removeClass("error_text2");
|
|
}
|
|
else {
|
|
if(appendErrMsg) //append text
|
|
errMsgField.text(errMsgField.text()+errMsg).show();
|
|
else //reset text
|
|
errMsgField.text(errMsg).show();
|
|
field.removeClass("text2").addClass("error_text2");
|
|
}
|
|
}
|
|
|
|
function showErrorInDropdown(isValid, field, errMsgField, errMsg, appendErrMsg) {
|
|
if(isValid) {
|
|
errMsgField.text("").hide();
|
|
field.addClass("select").removeClass("error_select");
|
|
}
|
|
else {
|
|
if(appendErrMsg) //append text
|
|
errMsgField.text(errMsgField.text()+errMsg).show();
|
|
else //reset text
|
|
errMsgField.text(errMsg).show();
|
|
field.removeClass("select").addClass("error_select");
|
|
}
|
|
}
|
|
|
|
function validateDropDownBox(label, field, errMsgField, appendErrMsg) {
|
|
var isValid = true;
|
|
var errMsg = "";
|
|
var value = field.val();
|
|
if (value == null || value.length == 0) {
|
|
errMsg = label + " is a required value. ";
|
|
isValid = false;
|
|
}
|
|
showErrorInDropdown(isValid, field, errMsgField, errMsg, appendErrMsg);
|
|
return isValid;
|
|
}
|
|
|
|
function validateNumber(label, field, errMsgField, min, max, isOptional) {
|
|
var isValid = true;
|
|
var errMsg = "";
|
|
var value = field.val();
|
|
if (value != null && value.length != 0) {
|
|
if(isNaN(value)) {
|
|
errMsg = label + " must be a number";
|
|
isValid = false;
|
|
} else {
|
|
if (min != null && value < min) {
|
|
errMsg = label + " must be a value greater than or equal to " + min;
|
|
isValid = false;
|
|
}
|
|
if (max != null && value > max) {
|
|
errMsg = label + " must be a value less than or equal to " + max;
|
|
isValid = false;
|
|
}
|
|
}
|
|
} else if(isOptional!=true){ //required field
|
|
errMsg = label + " is a required value. ";
|
|
isValid = false;
|
|
}
|
|
showError(isValid, field, errMsgField, errMsg);
|
|
return isValid;
|
|
}
|
|
|
|
function validateString(label, field, errMsgField, isOptional, maxLength) {
|
|
var isValid = true;
|
|
var errMsg = "";
|
|
var value = field.val();
|
|
if (isOptional!=true && (value == null || value.length == 0)) { //required field
|
|
errMsg = label + " is a required value. ";
|
|
isValid = false;
|
|
}
|
|
else if (value!=null && value.length >= maxLength) {
|
|
errMsg = label + " must be less than " + maxLength + " characters";
|
|
isValid = false;
|
|
}
|
|
else if(value!=null && value.indexOf('"')!=-1) {
|
|
errMsg = "Double quotes are not allowed.";
|
|
isValid = false;
|
|
}
|
|
showError(isValid, field, errMsgField, errMsg);
|
|
return isValid;
|
|
}
|
|
|
|
function validateIp(label, field, errMsgField, isOptional) {
|
|
if(validateString(label, field, errMsgField, isOptional) == false)
|
|
return;
|
|
var isValid = true;
|
|
var errMsg = "";
|
|
var value = field.val();
|
|
if(value!=null && value.length>0) {
|
|
myregexp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
|
|
var isMatch = myregexp.test(value);
|
|
if(!isMatch) {
|
|
errMsg = label + " should be like 75.52.126.11";
|
|
isValid = false;
|
|
}
|
|
}
|
|
showError(isValid, field, errMsgField, errMsg);
|
|
return isValid;
|
|
}
|
|
|
|
function validateCIDR(label, field, errMsgField, isOptional) {
|
|
if(validateString(label, field, errMsgField, isOptional) == false)
|
|
return;
|
|
var isValid = true;
|
|
var errMsg = "";
|
|
var value = field.val();
|
|
if(value!=null && value.length>0) {
|
|
myregexp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}$/;
|
|
var isMatch = myregexp.test(value);
|
|
if(!isMatch) {
|
|
errMsg = label + " should be like 10.1.1.0/24";
|
|
isValid = false;
|
|
}
|
|
}
|
|
showError(isValid, field, errMsgField, errMsg);
|
|
return isValid;
|
|
}
|
|
|
|
function validateFilename(label, field, errMsgField, isOptional) {
|
|
if(validateString(label, field, errMsgField, isOptional) == false)
|
|
return;
|
|
var isValid = true;
|
|
var errMsg = "";
|
|
var value = field.val();
|
|
if(value!=null && value.length>0) {
|
|
myregexp = /[^a-zA-Z0-9_\-\.]/;
|
|
var isMatch = myregexp.test(value);
|
|
if(isMatch) {
|
|
errMsg = "Only alphanumeric, dot, dashes and underscore characters allowed";
|
|
isValid = false;
|
|
}
|
|
}
|
|
showError(isValid, field, errMsgField, errMsg);
|
|
return isValid;
|
|
}
|
|
|
|
function validatePath(label, field, errMsgField, isOptional) {
|
|
if(validateString(label, field, errMsgField, isOptional) == false)
|
|
return;
|
|
var isValid = true;
|
|
var errMsg = "";
|
|
var value = field.val();
|
|
if(value!=null && value.length>0) {
|
|
myregexp = /^\//;
|
|
var isMatch = myregexp.test(value);
|
|
if(!isMatch) {
|
|
errMsg = label + " should be like /aaa/bbb/ccc";
|
|
isValid = false;
|
|
}
|
|
}
|
|
showError(isValid, field, errMsgField, errMsg);
|
|
return isValid;
|
|
}
|
|
|
|
function cleanErrMsg(field, errMsgField) {
|
|
showError(true, field, errMsgField);
|
|
}
|
|
|
|
// setter
|
|
function setGridRowsTotal(field, gridRowsTotal) {
|
|
if(gridRowsTotal==null) {
|
|
field.text("");
|
|
return;
|
|
}
|
|
|
|
if(gridRowsTotal==1)
|
|
field.text(gridRowsTotal + " item");
|
|
else
|
|
field.text(gridRowsTotal + " items");
|
|
}
|
|
|
|
function changeGridRowsTotal(field, difference) {
|
|
var t = field.text();
|
|
var oldTotal = 0;
|
|
if(t.length>0 && t.indexOf(" item")!=-1) {
|
|
var s = t.substring(0, t.indexOf(" item"));
|
|
if(!isNaN(s))
|
|
oldTotal = parseInt(s);
|
|
}
|
|
var newTotal = oldTotal + difference;
|
|
setGridRowsTotal(field, newTotal);
|
|
}
|
|
|
|
|
|
// others
|
|
function trim(val) {
|
|
if(val == null)
|
|
return null;
|
|
return val.replace(/^\s*/, "").replace(/\s*$/, "");
|
|
}
|
|
|
|
function noNull(val) {
|
|
if(val == null)
|
|
return "";
|
|
else
|
|
return val;
|
|
}
|
|
|
|
// Prevent cross-site-script(XSS) attack.
|
|
// used right before adding user input to the DOM tree. e.g. DOM_element.html(fromdb(user_input));
|
|
function sanitizeXSS(val) {
|
|
if(val == null || typeof(val) != "string")
|
|
return val;
|
|
val = val.replace(/</g, "<"); //replace < whose unicode is \u003c
|
|
val = val.replace(/>/g, ">"); //replace > whose unicode is \u003e
|
|
return val;
|
|
}
|
|
|
|
function getVmName(p_vmName, p_vmDisplayname) {
|
|
if(p_vmDisplayname == null)
|
|
return fromdb(p_vmName);
|
|
var vmName = null;
|
|
if (isAdmin()) {
|
|
if (p_vmDisplayname != p_vmName) {
|
|
vmName = p_vmName + "(" + fromdb(p_vmDisplayname) + ")";
|
|
} else {
|
|
vmName = p_vmName;
|
|
}
|
|
} else {
|
|
vmName = fromdb(p_vmDisplayname);
|
|
}
|
|
return vmName;
|
|
}
|
|
|
|
// FUNCTION: Handles AJAX error callbacks. You can pass in an optional function to
|
|
// handle errors that are not already handled by this method.
|
|
function handleError(XMLHttpResponse, handleErrorCallback) {
|
|
// User Not authenticated
|
|
if (XMLHttpResponse.status == ERROR_ACCESS_DENIED_DUE_TO_UNAUTHORIZED) {
|
|
$("#dialog_session_expired").dialog("open");
|
|
}
|
|
else if (XMLHttpResponse.status == ERROR_INTERNET_NAME_NOT_RESOLVED) {
|
|
$("#dialog_error_internet_not_resolved").dialog("open");
|
|
}
|
|
else if (XMLHttpResponse.status == ERROR_INTERNET_CANNOT_CONNECT) {
|
|
$("#dialog_error_management_server_not_accessible").dialog("open");
|
|
}
|
|
else if (XMLHttpResponse.status == ERROR_VMOPS_ACCOUNT_ERROR && handleErrorCallback != undefined) {
|
|
handleErrorCallback();
|
|
}
|
|
else if (handleErrorCallback != undefined) {
|
|
handleErrorCallback();
|
|
}
|
|
else {
|
|
var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
|
|
$("#dialog_error").text(fromdb(errorMsg)).dialog("open");
|
|
}
|
|
}
|
|
|
|
// FUNCTION: Adds a Dialog to the list of active Dialogs so that
|
|
// when you shift from one tab to another, we clean out the dialogs
|
|
var activeDialogs = new Array();
|
|
function activateDialog(dialog, addToActive) {
|
|
if (addToActive == undefined || addToActive) {
|
|
activeDialogs[activeDialogs.length] = dialog;
|
|
}
|
|
|
|
//bind Enter-Key-pressing event handler to the dialog
|
|
dialog.keypress(function(event) {
|
|
if(event.keyCode == keycode_Enter) {
|
|
$('[aria-labelledby$='+dialog.attr("id")+']').find(":button:first").click();
|
|
return false; //event.preventDefault() + event.stopPropagation()
|
|
}
|
|
});
|
|
}
|
|
function removeDialogs() {
|
|
for (var i = 0; i < activeDialogs.length; i++) {
|
|
activeDialogs[i].remove();
|
|
}
|
|
activeDialogs = new Array();
|
|
}
|
|
|
|
function convertBytes(bytes) {
|
|
if (bytes < 1024 * 1024) {
|
|
return (bytes / 1024).toFixed(2) + " KB";
|
|
} else if (bytes < 1024 * 1024 * 1024) {
|
|
return (bytes / 1024 / 1024).toFixed(2) + " MB";
|
|
} else if (bytes < 1024 * 1024 * 1024 * 1024) {
|
|
return (bytes / 1024 / 1024 / 1024).toFixed(2) + " GB";
|
|
} else {
|
|
return (bytes / 1024 / 1024 / 1024 / 1024).toFixed(2) + " TB";
|
|
}
|
|
}
|
|
|
|
function convertHz(hz) {
|
|
if (hz < 1000) {
|
|
return hz + " MHZ";
|
|
} else {
|
|
return (hz / 1000).toFixed(2) + " GHZ";
|
|
}
|
|
}
|
|
|
|
function toDayOfMonthDesp(dayOfMonth) {
|
|
return "Day "+dayOfMonth +" of Month";
|
|
}
|
|
|
|
function toDayOfWeekDesp(dayOfWeek) {
|
|
if (dayOfWeek == "1")
|
|
return "Sunday";
|
|
else if (dayOfWeek == "2")
|
|
return "Monday";
|
|
else if (dayOfWeek == "3")
|
|
return "Tuesday";
|
|
else if (dayOfWeek == "4")
|
|
return "Wednesday";
|
|
else if (dayOfWeek == "5")
|
|
return "Thursday"
|
|
else if (dayOfWeek == "6")
|
|
return "Friday";
|
|
else if (dayOfWeek == "7")
|
|
return "Saturday";
|
|
}
|
|
|
|
function toBooleanText(booleanValue) {
|
|
if(booleanValue == true || booleanValue == "true")
|
|
return "Yes";
|
|
else if(booleanValue == false ||booleanValue == "false")
|
|
return "No";
|
|
}
|
|
|
|
function toBooleanValue(booleanText) {
|
|
if(booleanText == "Yes")
|
|
return "true";
|
|
else if(booleanText == "No")
|
|
return "false";
|
|
}
|
|
|
|
function toNetworkType(usevirtualnetwork) {
|
|
if(usevirtualnetwork == true || usevirtualnetwork == "true")
|
|
return "Public";
|
|
else
|
|
return "Direct";
|
|
}
|
|
|
|
var roleTypeUser = "0";
|
|
var roleTypeAdmin = "1";
|
|
var roleTypeDomainAdmin = "2";
|
|
function toRole(type) {
|
|
if (type == roleTypeUser) {
|
|
return "User";
|
|
} else if (type == roleTypeAdmin) {
|
|
return "Admin";
|
|
} else if (type == roleTypeDomainAdmin) {
|
|
return "Domain-Admin";
|
|
}
|
|
}
|
|
|
|
function toAlertType(alertCode) {
|
|
switch (alertCode) {
|
|
case 0 : return "Capacity Threshold - Memory";
|
|
case 1 : return "Capacity Threshold - CPU";
|
|
case 2 : return "Capacity Threshold - Storage Used";
|
|
case 3 : return "Capacity Threshold - Storage Allocated";
|
|
case 4 : return "Capacity Threshold - Public IP";
|
|
case 5 : return "Capacity Threshold - Private IP";
|
|
case 6 : return "Monitoring - Host";
|
|
case 7 : return "Monitoring - VM";
|
|
case 8 : return "Monitoring - Domain Router";
|
|
case 9 : return "Monitoring - Console Proxy";
|
|
case 10 : return "Monitoring - Routing Host";
|
|
case 11 : return "Monitoring - Storage";
|
|
case 12 : return "Monitoring - Usage Server";
|
|
case 13 : return "Monitoring - Management Server";
|
|
case 14 : return "Migration - Domain Router";
|
|
case 15 : return "Migration - Console Proxy";
|
|
case 16 : return "Migration - User VM";
|
|
case 17 : return "VLAN";
|
|
case 18 : return "Monitoring - Secondary Storage VM";
|
|
}
|
|
}
|
|
|
|
// Timezones
|
|
var timezones = new Object();
|
|
timezones['Etc/GMT+12']='[UTC-12:00] GMT-12:00';
|
|
timezones['Etc/GMT+11']='[UTC-11:00] GMT-11:00';
|
|
timezones['Pacific/Samoa']='[UTC-11:00] Samoa Standard Time';
|
|
timezones['Pacific/Honolulu']='[UTC-10:00] Hawaii Standard Time';
|
|
timezones['US/Alaska']='[UTC-09:00] Alaska Standard Time';
|
|
timezones['America/Los_Angeles']='[UTC-08:00] Pacific Standard Time';
|
|
timezones['Mexico/BajaNorte']='[UTC-08:00] Baja California';
|
|
timezones['US/Arizona']='[UTC-07:00] Arizona';
|
|
timezones['US/Mountain']='[UTC-07:00] Mountain Standard Time';
|
|
timezones['America/Chihuahua']='[UTC-07:00] Chihuahua, La Paz';
|
|
timezones['America/Chicago']='[UTC-06:00] Central Standard Time';
|
|
timezones['America/Costa_Rica']='[UTC-06:00] Central America';
|
|
timezones['America/Mexico_City']='[UTC-06:00] Mexico City, Monterrey';
|
|
timezones['Canada/Saskatchewan']='[UTC-06:00] Saskatchewan';
|
|
timezones['America/Bogota']='[UTC-05:00] Bogota, Lima';
|
|
timezones['America/New_York']='[UTC-05:00] Eastern Standard Time';
|
|
timezones['America/Caracas']='[UTC-04:00] Venezuela Time';
|
|
timezones['America/Asuncion']='[UTC-04:00] Paraguay Time';
|
|
timezones['America/Cuiaba']='[UTC-04:00] Amazon Time';
|
|
timezones['America/Halifax']='[UTC-04:00] Atlantic Standard Time';
|
|
timezones['America/La_Paz']='[UTC-04:00] Bolivia Time';
|
|
timezones['America/Santiago']='[UTC-04:00] Chile Time';
|
|
timezones['America/St_Johns']='[UTC-03:30] Newfoundland Standard Time';
|
|
timezones['America/Araguaina']='[UTC-03:00] Brasilia Time';
|
|
timezones['America/Argentina/Buenos_Aires']='[UTC-03:00] Argentine Time';
|
|
timezones['America/Cayenne']='[UTC-03:00] French Guiana Time';
|
|
timezones['America/Godthab']='[UTC-03:00] Greenland Time';
|
|
timezones['America/Montevideo']='[UTC-03:00] Uruguay Time]';
|
|
timezones['Etc/GMT+2']='[UTC-02:00] GMT-02:00';
|
|
timezones['Atlantic/Azores']='[UTC-01:00] Azores Time';
|
|
timezones['Atlantic/Cape_Verde']='[UTC-01:00] Cape Verde Time';
|
|
timezones['Africa/Casablanca']='[UTC] Casablanca';
|
|
timezones['Etc/UTC']='[UTC] Coordinated Universal Time';
|
|
timezones['Atlantic/Reykjavik']='[UTC] Reykjavik';
|
|
timezones['Europe/London']='[UTC] Western European Time';
|
|
timezones['CET']='[UTC+01:00] Central European Time';
|
|
timezones['Europe/Bucharest']='[UTC+02:00] Eastern European Time';
|
|
timezones['Africa/Johannesburg']='[UTC+02:00] South Africa Standard Time';
|
|
timezones['Asia/Beirut']='[UTC+02:00] Beirut';
|
|
timezones['Africa/Cairo']='[UTC+02:00] Cairo';
|
|
timezones['Asia/Jerusalem']='[UTC+02:00] Israel Standard Time';
|
|
timezones['Europe/Minsk']='[UTC+02:00] Minsk';
|
|
timezones['Europe/Moscow']='[UTC+03:00] Moscow Standard Time';
|
|
timezones['Africa/Nairobi']='[UTC+03:00] Eastern African Time';
|
|
timezones['Asia/Karachi']='[UTC+05:00] Pakistan Time';
|
|
timezones['Asia/Kolkata']='[UTC+05:30] India Standard Time';
|
|
timezones['Asia/Bangkok']='[UTC+05:30] Indochina Time';
|
|
timezones['Asia/Shanghai']='[UTC+08:00] China Standard Time';
|
|
timezones['Asia/Kuala_Lumpur']='[UTC+08:00] Malaysia Time';
|
|
timezones['Australia/Perth']='[UTC+08:00] Western Standard Time (Australia)';
|
|
timezones['Asia/Taipei']='[UTC+08:00] Taiwan';
|
|
timezones['Asia/Tokyo']='[UTC+09:00] Japan Standard Time';
|
|
timezones['Asia/Seoul']='[UTC+09:00] Korea Standard Time';
|
|
timezones['Australia/Adelaide']='[UTC+09:30] Central Standard Time (South Australia)';
|
|
timezones['Australia/Darwin']='[UTC+09:30] Central Standard Time (Northern Territory)';
|
|
timezones['Australia/Brisbane']='[UTC+10:00] Eastern Standard Time (Queensland)';
|
|
timezones['Australia/Canberra']='[UTC+10:00] Eastern Standard Time (New South Wales)';
|
|
timezones['Pacific/Guam']='[UTC+10:00] Chamorro Standard Time';
|
|
timezones['Pacific/Auckland']='[UTC+12:00] New Zealand Standard Time';
|