/**
* 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 .
*
*/
//***** actions for details tab in right panel (begin) ************************************************************************
function buildActionLinkForDetailsTab(label, actionMap, $actionMenu, $midmenuItem1, $detailsTab) {
var apiInfo = actionMap[label];
var $listItem = $("#action_list_item").clone();
$actionMenu.find("#action_list").append($listItem.show());
var $link = $listItem.find("#link").text(label);
$link.data("label", label);
$link.data("inProcessText", apiInfo.inProcessText);
$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);
var id = $detailsTab.data("jsonObj").id;
$link.bind("click", function(event) {
$actionMenu.hide();
var $actionLink = $(this);
var dialogBeforeActionFn = $actionLink.data("dialogBeforeActionFn");
if(dialogBeforeActionFn == null) {
var apiCommand = "command="+$actionLink.data("api")+"&id="+id;
doActionToDetailsTab(id, $actionLink, apiCommand, $midmenuItem1, $detailsTab);
}
else {
dialogBeforeActionFn($actionLink, $detailsTab, $midmenuItem1);
}
return false;
});
}
function doActionToDetailsTab(id, $actionLink, apiCommand, $midmenuItem1, $detailsTab) {
var label = $actionLink.data("label");
var inProcessText = $actionLink.data("inProcessText");
var isAsyncJob = $actionLink.data("isAsyncJob");
var asyncJobResponse = $actionLink.data("asyncJobResponse");
var afterActionSeccessFn = $actionLink.data("afterActionSeccessFn");
var $spinningWheel = $detailsTab.find("#spinning_wheel");
$spinningWheel.find("#description").text(inProcessText);
$spinningWheel.show();
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
$afterActionInfoContainer.find("#after_action_info").text(label + " action succeeded.");
$afterActionInfoContainer.removeClass("errorbox").show();
$midmenuItem1.data("afterActionInfo", (label + " action succeeded."));
$midmenuItem1.find("#info_icon").removeClass("error").show();
afterActionSeccessFn(json, $midmenuItem1, id);
} else if (result.jobstatus == 2) { // Failed
$afterActionInfoContainer.find("#after_action_info").text(label + " action failed. Reason: " + fromdb(result.jobresult));
$afterActionInfoContainer.addClass("errorbox").show();
$midmenuItem1.data("afterActionInfo", (label + " action failed. Reason: " + fromdb(result.jobresult)));
$midmenuItem1.find("#info_icon").addClass("error").show();
}
}
},
error: function(XMLHttpResponse) {
$("body").stopTime(timerKey);
handleErrorInDetailsTab(XMLHttpResponse, $detailsTab, label, $afterActionInfoContainer, $midmenuItem1);
}
});
},
0
);
},
error: function(XMLHttpResponse) {
handleErrorInDetailsTab(XMLHttpResponse, $detailsTab, label, $afterActionInfoContainer, $midmenuItem1);
}
});
}
//Async job (end) *****
//Sync job (begin) *****
else {
$.ajax({
data: createURL(apiCommand),
dataType: "json",
async: false,
success: function(json) {
$spinningWheel.hide();
$afterActionInfoContainer.find("#after_action_info").text(label + " action succeeded.");
$afterActionInfoContainer.removeClass("errorbox").show();
$midmenuItem1.data("afterActionInfo", (label + " action succeeded."));
$midmenuItem1.find("#info_icon").removeClass("error").show();
afterActionSeccessFn(json, $midmenuItem1, id);
},
error: function(XMLHttpResponse) {
handleErrorInDetailsTab(XMLHttpResponse, $detailsTab, label, $afterActionInfoContainer, $midmenuItem1);
}
});
}
//Sync job (end) *****
}
function handleErrorInDetailsTab(XMLHttpResponse, $detailsTab, label, $afterActionInfoContainer, $midmenuItem1) {
//details tab
$detailsTab.find("#spinning_wheel").hide();
var errorMsg = "";
if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) {
var start = XMLHttpResponse.responseText.indexOf("h1") + 3;
var end = XMLHttpResponse.responseText.indexOf(" 0)
afterActionInfo = label + " action failed. Reason: " + fromdb(errorMsg);
else
afterActionInfo = label + " action failed.";
$afterActionInfoContainer.find("#after_action_info").text(afterActionInfo);
$afterActionInfoContainer.addClass("errorbox").show();
//middle menu
$midmenuItem1.data("afterActionInfo", afterActionInfo);
$midmenuItem1.find("#info_icon").addClass("error").show();
}
//***** actions for details 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());
var $link = $listItem.find("#link").text(label);
$link.data("label", label);
$link.data("inProcessText", apiInfo.inProcessText);
$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);
var id = $subgridItem.data("jsonObj").id;
$link.bind("click", function(event) {
$actionMenu.hide();
var $actionLink = $(this);
var dialogBeforeActionFn = $actionLink.data("dialogBeforeActionFn");
if(dialogBeforeActionFn == null) {
var apiCommand = "command="+$actionLink.data("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 inProcessText = $actionLink.data("inProcessText");
var isAsyncJob = $actionLink.data("isAsyncJob");
var asyncJobResponse = $actionLink.data("asyncJobResponse");
var afterActionSeccessFn = $actionLink.data("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));
$subgridItem.find("#after_action_info_container").removeClass("success").addClass("error").show();
}
}
},
error: function(XMLHttpResponse) {
$("body").stopTime(timerKey);
handleErrorInSubgridItem(XMLHttpResponse, $subgridItem, label);
}
});
},
0
);
},
error: function(XMLHttpResponse) {
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) {
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) {
var start = XMLHttpResponse.responseText.indexOf("h1") + 3;
var end = XMLHttpResponse.responseText.indexOf(" 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;
doActionForMidMenu(id, apiInfo, apiCommand);
}
}
else {
dialogBeforeActionFn(apiInfo, selectedItemsInMidMenu);
}
selectedItemsInMidMenu = {}; //clear selected items for action
return false;
});
}
function doActionForMidMenu(id, apiInfo, apiCommand) {
var label = apiInfo.label;
var isAsyncJob = apiInfo.isAsyncJob;
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("#info_icon").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);
$midmenuItem1.find("#content").removeClass("inaction");
$midmenuItem1.find("#spinning_wheel").hide();
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)));
}
}
},
error: function(XMLHttpResponse) {
$("body").stopTime(timerKey);
handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1);
}
});
},
0
);
},
error: function(XMLHttpResponse) {
handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1);
}
});
}
//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."));
afterActionSeccessFn(json, $midmenuItem1, id);
},
error: function(XMLHttpResponse) {
handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1);
}
});
}
//Sync job (end) *****
}
function handleErrorInMidMenu(XMLHttpResponse, $midmenuItem1) {
$midmenuItem1.find("#content").removeClass("inaction");
$midmenuItem1.find("#spinning_wheel").hide();
$midmenuItem1.find("#info_icon").addClass("error").show();
$midmenuItem1.find("#first_row").text("Action failed");
var errorMsg = "";
if(XMLHttpResponse.responseText != null & XMLHttpResponse.responseText.length > 0) {
var start = XMLHttpResponse.responseText.indexOf("h1") + 3;
var end = XMLHttpResponse.responseText.indexOf(" 0)
$midmenuItem1.find("#second_row").text(fromdb(errorMsg));
else
$midmenuItem1.find("#second_row").html(" ");
}
/*
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. doActionForMidMenu() 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 copyAfterActionInfoToRightPanel($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();
}
else {
$afterActionInfoContainer.find("#after_action_info").text("");
$afterActionInfoContainer.hide();
}
}
//***** actions for middle menu (end) **************************************************************************
function createURL(url) {
return url +"&response=json&sessionkey=" + g_sessionKey;
}
function fromdb(val) {
return sanitizeXSS(unescape(noNull(val)));
}
function todb(val) {
return encodeURIComponent(escape(val));
}
var midmenuItemCount = 20;
function setBooleanField(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 clearMiddleMenu() {
$("#midmenu_container").empty();
$("#midmenu_action_link").hide();
$("#midmenu_add_link").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");
}
}
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");
}
// 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."));
}
else {
$midmenuItem1.find("#info_icon").addClass("error").show();
$midmenuItem1.find("#first_row").text("Adding failed");
}
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 initializeEditFunction($readonlyFields, $editFields, doUpdateFn) {
$("#edit_button").bind("click", function(event){
$readonlyFields.hide();
$editFields.show();
$("#cancel_button, #save_button").show()
return false;
});
$("#cancel_button").bind("click", function(event){
$editFields.hide();
$readonlyFields.show();
$("#save_button, #cancel_button").hide();
return false;
});
$("#save_button").bind("click", function(event){
doUpdateFn();
$editFields.hide();
$readonlyFields.show();
$("#save_button, #cancel_button").hide();
return false;
});
}
function switchBetweenDifferentTabs(tabArray, tabContentArray, afterSwitchFnArray) {
for(var tabIndex=0; tabIndex