/**
* 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 .
*
*/
function volumeGetSearchParams() {
var moreCriteria = [];
var searchInput = $("#basic_search").find("#search_input").val();
if (searchInput != null && searchInput.length > 0) {
moreCriteria.push("&keyword="+todb(searchInput));
}
var $advancedSearchPopup = getAdvancedSearchPopupInSearchContainer();
if ($advancedSearchPopup.length > 0 && $advancedSearchPopup.css("display") != "none" ) {
var zone = $advancedSearchPopup.find("#adv_search_zone").val();
if (zone!=null && zone.length > 0)
moreCriteria.push("&zoneId="+zone);
if ($advancedSearchPopup.find("#adv_search_domain_li").css("display") != "none"
&& $advancedSearchPopup.find("#domain").hasClass("textwatermark") == false) {
var domainName = $advancedSearchPopup.find("#domain").val();
if (domainName != null && domainName.length > 0) {
var domainId;
if(autoCompleteDomains != null && autoCompleteDomains.length > 0) {
for(var i=0; i < autoCompleteDomains.length; i++) {
if(fromdb(autoCompleteDomains[i].name).toLowerCase() == domainName.toLowerCase()) {
domainId = autoCompleteDomains[i].id;
break;
}
}
}
if(domainId == null) {
showError(false, $advancedSearchPopup.find("#domain"), $advancedSearchPopup.find("#domain_errormsg"), g_dictionary["label.not.found"]);
}
else { //e.g. domainId == 5 (number)
showError(true, $advancedSearchPopup.find("#domain"), $advancedSearchPopup.find("#domain_errormsg"), null)
moreCriteria.push("&domainid="+todb(domainId));
}
}
}
if ($advancedSearchPopup.find("#adv_search_account_li").css("display") != "none"
&& $advancedSearchPopup.find("#adv_search_account").hasClass("textwatermark") == false) {
var account = $advancedSearchPopup.find("#adv_search_account").val();
if (account!=null && account.length > 0)
moreCriteria.push("&account="+account);
}
}
return moreCriteria.join("");
}
function afterLoadVolumeJSP() {
initDialog("dialog_create_template", 420);
initDialog("dialog_create_snapshot");
initDialog("dialog_recurring_snapshot", 420);
initDialog("dialog_add_volume");
initDialog("dialog_attach_volume");
initDialog("dialog_add_volume_from_snapshot");
initDialog("dialog_create_template_from_snapshot", 450);
initDialog("dialog_download_volume");
if(isAdmin())
$("#dialog_create_template_from_snapshot").find("#isfeatured_container").show();
else
$("#dialog_create_template_from_snapshot").find("#isfeatured_container").hide();
$.ajax({
data: createURL("command=listOsTypes"),
dataType: "json",
success: function(json) {
types = json.listostypesresponse.ostype;
if (types != null && types.length > 0) {
var osTypeField1 = $("#dialog_create_template #create_template_os_type").empty();
var osTypeField2 = $("#dialog_create_template_from_snapshot #os_type").empty();
for (var i = 0; i < types.length; i++) {
osTypeField1.append("");
osTypeField2.append("");
}
}
}
});
$.ajax({
data: createURL("command=listZones&available=true"),
dataType: "json",
success: function(json) {
var zones = json.listzonesresponse.zone;
var volumeZoneSelect = $("#dialog_add_volume").find("#volume_zone").empty();
if (zones != null && zones.length > 0) {
for (var i = 0; i < zones.length; i++) {
volumeZoneSelect.append("");
}
}
}
});
$.ajax({
data: createURL("command=listDiskOfferings"),
dataType: "json",
success: function(json) {
var offerings = json.listdiskofferingsresponse.diskoffering;
var volumeDiskOfferingSelect = $("#dialog_add_volume").find("#volume_diskoffering").empty();
if (offerings != null && offerings.length > 0) {
for (var i = 0; i < offerings.length; i++) {
var $option = $("");
$option.data("jsonObj", offerings[i]);
volumeDiskOfferingSelect.append($option);
}
$("#dialog_add_volume").find("#volume_diskoffering").change();
}
}
});
$("#dialog_add_volume").find("#volume_diskoffering").unbind("change").bind("change", function(event) {
var jsonObj = $(this).find("option:selected").data("jsonObj");
if(jsonObj != null && jsonObj.iscustomized == true) {
$("#dialog_add_volume").find("#size_container").show();
}
else {
$("#dialog_add_volume").find("#size_container").hide();
$("#dialog_add_volume").find("#size").val("");
}
});
//add volume button ***
$("#add_volume_button").unbind("click").bind("click", function(event) {
$("#dialog_add_volume")
.dialog('option', 'buttons', {
"Add": function() {
var thisDialog = $(this);
// validate values
var isValid = true;
isValid &= validateString("Name", thisDialog.find("#add_volume_name"), thisDialog.find("#add_volume_name_errormsg"));
if(thisDialog.find("#size_container").css("display") != "none")
isValid &= validateInteger("Size", thisDialog.find("#size"), thisDialog.find("#size_errormsg"));
if (!isValid) return;
thisDialog.dialog("close");
var array1 = [];
var name = thisDialog.find("#add_volume_name").val();
array1.push("&name="+todb(name));
var zoneId = thisDialog.find("#volume_zone").val();
array1.push("&zoneId="+zoneId);
var diskofferingId = thisDialog.find("#volume_diskoffering").val();
array1.push("&diskOfferingId="+diskofferingId);
if(thisDialog.find("#size_container").css("display") != "none") {
var size = thisDialog.find("#size").val()
array1.push("&size="+size);
}
var $midmenuItem1 = beforeAddingMidMenuItem() ;
$.ajax({
data: createURL("command=createVolume"+array1.join("")),
dataType: "json",
success: function(json) {
var jobId = json.createvolumeresponse.jobid;
var timerKey = "createVolumeJob_"+jobId;
$("body").everyTime(2000, 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);
if (result.jobstatus == 1) {
// Succeeded
volumeToMidmenu(result.jobresult.volume, $midmenuItem1);
bindClickToMidMenu($midmenuItem1, volumeToRightPanel, getMidmenuId);
afterAddingMidMenuItem($midmenuItem1, true);
} else if (result.jobstatus == 2) {
//afterAddingMidMenuItem($midmenuItem1, false, g_dictionary["label.adding.failed"]);
afterAddingMidMenuItem($midmenuItem1, false, fromdb(result.jobresult.errortext));
}
}
},
error: function(XMLHttpResponse) {
$("body").stopTime(timerKey);
handleError(XMLHttpResponse, function() {
afterAddingMidMenuItem($midmenuItem1, false, parseXMLHttpResponse(XMLHttpResponse));
});
}
});
}, 0);
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse, function() {
afterAddingMidMenuItem($midmenuItem1, false, parseXMLHttpResponse(XMLHttpResponse));
});
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
return false;
});
$("#snapshot_interval").change(function(event) {
var thisElement = $(this);
var snapshotInterval = thisElement.val();
var $snapshotIntervalOption = thisElement.find("#snapshot_interval_"+snapshotInterval);
var jsonObj = $snapshotIntervalOption.data("jsonObj");
var $dialog = $("#dialog_recurring_snapshot");
if (jsonObj == undefined || jsonObj == null) {
$dialog.find("#policy_enabled").text("Disabled");
} else {
$dialog.find("#policy_enabled").text("Enabled");
}
$dialog.find("#info_container").hide();
switch (snapshotInterval) {
case "0":
$dialog.find("#edit_time_colon, #edit_hour_container, #edit_meridiem_container, #edit_day_of_week_container, #edit_day_of_month_container").hide();
$dialog.find("#edit_past_the_hour, #edit_minute_container").show();
if (jsonObj != null) {
$dialog.find("#edit_minute").val(jsonObj.schedule);
$dialog.find("#edit_max").val(jsonObj.maxsnaps);
$dialog.find("#edit_timezone").val(jsonObj.timezone);
} else {
$dialog.find("#edit_minute").val("");
$dialog.find("#edit_max").val("");
$dialog.find("#edit_timezone").val("");
}
$dialog.find("#snapshot_form").show();
break;
case "1":
$dialog.find("#edit_past_the_hour, #edit_day_of_week_container, #edit_day_of_month_container").hide();
$dialog.find("#edit_minute_container, #edit_hour_container, #edit_meridiem_container").show();
if (jsonObj != null) {
var parts = jsonObj.schedule.split(":");
var hour12, meridiem;
var hour24 = parts[1];
if(hour24 < 12) {
hour12 = hour24;
meridiem = "AM";
}
else {
hour12 = hour24 - 12;
meridiem = "PM"
}
if (hour12 < 10 && hour12.toString().length==1)
hour12 = "0"+hour12.toString();
$dialog.find("#edit_minute").val(parts[0]);
$dialog.find("#edit_hour").val(hour12);
$dialog.find("#edit_meridiem").val(meridiem);
$dialog.find("#edit_max").val(jsonObj.maxsnaps);
$dialog.find("#edit_timezone").val(jsonObj.timezone);
} else {
$dialog.find("#edit_minute").val("");
$dialog.find("#edit_hour").val("");
$dialog.find("#edit_meridiem").val("");
$dialog.find("#edit_max").val("");
$dialog.find("#edit_timezone").val("");
}
$dialog.find("#snapshot_form").show();
break;
case "2":
$dialog.find("#edit_past_the_hour, #edit_day_of_month_container").hide();
$dialog.find("#edit_minute_container, #edit_hour_container, #edit_meridiem_container, #edit_day_of_week_container").show();
if (jsonObj != null) {
var parts = jsonObj.schedule.split(":");
var hour12, meridiem;
var hour24 = parts[1];
if(hour24 < 12) {
hour12 = hour24;
meridiem = "AM";
}
else {
hour12 = hour24 - 12;
meridiem = "PM"
}
if (hour12 < 10 && hour12.toString().length==1)
hour12 = "0"+hour12.toString();
$dialog.find("#edit_minute").val(parts[0]);
$dialog.find("#edit_hour").val(hour12);
$dialog.find("#edit_meridiem").val(meridiem);
$dialog.find("#edit_day_of_week").val(parts[2]);
$dialog.find("#edit_max").val(jsonObj.maxsnaps);
$dialog.find("#edit_timezone").val(jsonObj.timezone);
} else {
$dialog.find("#edit_minute").val("");
$dialog.find("#edit_hour").val("");
$dialog.find("#edit_meridiem").val("");
$dialog.find("#edit_day_of_week").val("");
$dialog.find("#edit_max").val("");
$dialog.find("#edit_timezone").val("");
}
$dialog.find("#snapshot_form").show();
break;
case "3":
$dialog.find("#edit_past_the_hour, #edit_day_of_week_container").hide();
$dialog.find("#edit_minute_container, #edit_hour_container, #edit_meridiem_container, #edit_day_of_month_container").show();
if (jsonObj != null) {
var parts = jsonObj.schedule.split(":");
var hour12, meridiem;
var hour24 = parts[1];
if(hour24 < 12) {
hour12 = hour24;
meridiem = "AM";
}
else {
hour12 = hour24 - 12;
meridiem = "PM"
}
if (hour12 < 10 && hour12.toString().length==1)
hour12 = "0"+hour12.toString();
$dialog.find("#edit_minute").val(parts[0]);
$dialog.find("#edit_hour").val(hour12);
$dialog.find("#edit_meridiem").val(meridiem);
$dialog.find("#edit_day_of_month").val(parts[2]);
$dialog.find("#edit_max").val(jsonObj.maxsnaps);
$dialog.find("#edit_timezone").val(jsonObj.timezone);
} else {
$dialog.find("#edit_minute").val("");
$dialog.find("#edit_hour").val("");
$dialog.find("#edit_meridiem").val("");
$dialog.find("#edit_day_of_month").val("");
$dialog.find("#edit_max").val("");
$dialog.find("#edit_timezone").val("");
}
$dialog.find("#snapshot_form").show();
break;
}
});
// *** recurring snapshot dialog - event binding (end) ******************************
//***** switch between different tabs (begin) ********************************************************************
var tabArray = [$("#tab_details"), $("#tab_snapshot")];
var tabContentArray = [$("#tab_content_details"), $("#tab_content_snapshot")];
var afterSwitchFnArray = [volumeJsonToDetailsTab, volumeJsonToSnapshotTab];
switchBetweenDifferentTabs(tabArray, tabContentArray, afterSwitchFnArray);
//***** switch between different tabs (end) **********************************************************************
}
function volumeToMidmenu(jsonObj, $midmenuItem1) {
$midmenuItem1.attr("id", getMidmenuId(jsonObj));
$midmenuItem1.data("jsonObj", jsonObj);
var $iconContainer = $midmenuItem1.find("#icon_container").show();
$iconContainer.find("#icon").attr("src", "images/midmenuicon_storage_volume.png");
var firstRowText = fromdb(jsonObj.name);
$midmenuItem1.find("#first_row").text(firstRowText.substring(0,midMenuFirstRowLength));
$midmenuItem1.find("#first_row_container").attr("title", firstRowText);
var secondRowText = fromdb(jsonObj.type);
$midmenuItem1.find("#second_row").text(secondRowText.substring(0,midMenuSecondRowLength));
$midmenuItem1.find("#second_row_container").attr("title", secondRowText);
}
function volumeToRightPanel($midmenuItem1) {
copyActionInfoFromMidMenuToRightPanel($midmenuItem1);
$("#right_panel_content").data("$midmenuItem1", $midmenuItem1);
$("#tab_details").click();
}
function volumeJsonToDetailsTab(){
var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1");
if($midmenuItem1 == null) {
volumeJsonClearDetailsTab();
return;
}
var jsonObj = $midmenuItem1.data("jsonObj");
if(jsonObj == null) {
volumeJsonClearDetailsTab();
return;
}
var $thisTab = $("#right_panel_content #tab_content_details");
$thisTab.find("#tab_container").hide();
$thisTab.find("#tab_spinning_wheel").show();
var id = jsonObj.id;
$.ajax({
data: createURL("command=listVolumes&id="+id),
dataType: "json",
async: false,
success: function(json) {
var items = json.listvolumesresponse.volume;
if(items != null && items.length > 0) {
jsonObj = items[0];
$midmenuItem1.data("jsonObj", jsonObj);
}
}
});
$thisTab.find("#id").text(fromdb(jsonObj.id));
$thisTab.find("#name").text(fromdb(jsonObj.name));
$thisTab.find("#zonename").text(fromdb(jsonObj.zonename));
$thisTab.find("#device_id").text(fromdb(jsonObj.deviceid));
$thisTab.find("#state").text(fromdb(jsonObj.state));
$thisTab.find("#account").text(fromdb(jsonObj.account));
$thisTab.find("#domain").text(fromdb(jsonObj.domain));
$thisTab.find("#type").text(fromdb(jsonObj.type) + " (" + fromdb(jsonObj.storagetype) + " storage)");
$thisTab.find("#size").text((jsonObj.size == "0") ? "" : convertBytes(jsonObj.size));
if (jsonObj.virtualmachineid == null)
$thisTab.find("#vm_name").text("detached");
else
$thisTab.find("#vm_name").text(getVmName(jsonObj.vmname, jsonObj.vmdisplayname) + " (" + fromdb(jsonObj.vmstate) + ")");
setDateField(jsonObj.created, $thisTab.find("#created"));
if(isAdmin()) {
$thisTab.find("#storage").text(fromdb(jsonObj.storage));
$thisTab.find("#storage_container").show();
}
else {
$thisTab.find("#storage").text("");
$thisTab.find("#storage_container").hide();
}
//actions ***
var $actionMenu = $("#right_panel_content #tab_content_details #action_link #action_menu");
$actionMenu.find("#action_list").empty();
buildActionLinkForTab("label.action.take.snapshot", volumeActionMap, $actionMenu, $midmenuItem1, $thisTab); //show take snapshot
buildActionLinkForTab("label.action.recurring.snapshot", volumeActionMap, $actionMenu, $midmenuItem1, $thisTab); //show Recurring Snapshot
if(jsonObj.state != "Allocated")
buildActionLinkForTab("label.action.download.volume", volumeActionMap, $actionMenu, $midmenuItem1, $thisTab);
if(jsonObj.state != "Creating" && jsonObj.state != "Corrupted" && jsonObj.name != "attaching") {
if(jsonObj.type=="ROOT") {
if (jsonObj.vmstate == "Stopped") {
buildActionLinkForTab("label.action.create.template", volumeActionMap, $actionMenu, $midmenuItem1, $thisTab);
}
}
else {
if (jsonObj.virtualmachineid != null) {
if (jsonObj.storagetype == "shared" && (jsonObj.vmstate == "Running" || jsonObj.vmstate == "Stopped")) {
buildActionLinkForTab("label.action.detach.disk", volumeActionMap, $actionMenu, $midmenuItem1, $thisTab);
}
} else {
// Disk not attached
if (jsonObj.storagetype == "shared") {
buildActionLinkForTab("label.action.attach.disk", volumeActionMap, $actionMenu, $midmenuItem1, $thisTab);
if(jsonObj.vmname == null || jsonObj.vmname == "none")
buildActionLinkForTab("label.action.delete.volume", volumeActionMap, $actionMenu, $midmenuItem1, $thisTab);
}
}
}
}
$thisTab.find("#tab_spinning_wheel").hide();
$thisTab.find("#tab_container").show();
}
function volumeJsonToSnapshotTab() {
var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1");
if($midmenuItem1 == null) {
volumeClearSnapshotTab();
return;
}
var jsonObj = $midmenuItem1.data("jsonObj");
if(jsonObj == null) {
volumeClearSnapshotTab();
return;
}
var $thisTab = $("#right_panel_content").find("#tab_content_snapshot");
$thisTab.find("#tab_container").hide();
$thisTab.find("#tab_spinning_wheel").show();
$.ajax({
cache: false,
data: createURL("command=listSnapshots&volumeid="+fromdb(jsonObj.id)),
dataType: "json",
success: function(json) {
var $container = $thisTab.find("#tab_container").empty();
var items = json.listsnapshotsresponse.snapshot;
if (items != null && items.length > 0) {
var template = $("#snapshot_tab_template");
for (var i = 0; i < items.length; i++) {
var newTemplate = template.clone(true);
volumeSnapshotJSONToTemplate(items[i], newTemplate);
$container.append(newTemplate.show());
}
}
$thisTab.find("#tab_spinning_wheel").hide();
$thisTab.find("#tab_container").show();
}
});
}
function volumeClearSnapshotTab() {
var $thisTab = $("#right_panel_content").find("#tab_content_snapshot");
$thisTab.find("#tab_container").empty();
}
function volumeSnapshotJSONToTemplate(jsonObj, template) {
template.data("jsonObj", jsonObj);
template.attr("id", "volume_snapshot_"+fromdb(jsonObj.id)).data("volumeSnapshotId", fromdb(jsonObj.id));
template.find("#grid_header_title").text(fromdb(jsonObj.name));
template.find("#id").text(fromdb(jsonObj.id));
template.find("#name").text(fromdb(jsonObj.name));
template.find("#volumename").text(fromdb(jsonObj.volumename));
template.find("#state").text(fromdb(jsonObj.state));
template.find("#intervaltype").text(fromdb(jsonObj.intervaltype));
template.find("#account").text(fromdb(jsonObj.account));
template.find("#domain").text(fromdb(jsonObj.domain));
setDateField(jsonObj.created, template.find("#created"));
var $actionLink = template.find("#action_link");
bindActionLink($actionLink);
var $actionMenu = $actionLink.find("#action_menu");
$actionMenu.find("#action_list").empty();
if(jsonObj.state == "BackedUp") {
buildActionLinkForSubgridItem("label.action.create.volume", volumeSnapshotActionMap, $actionMenu, template);
buildActionLinkForSubgridItem("label.action.create.template", volumeSnapshotActionMap, $actionMenu, template);
}
buildActionLinkForSubgridItem("label.action.delete.snapshot", volumeSnapshotActionMap, $actionMenu, template);
}
function volumeClearRightPanel() {
volumeJsonClearDetailsTab();
}
function volumeJsonClearDetailsTab(){
var $thisTab = $("#right_panel_content").find("#tab_content_details");
$thisTab.find("#id").text("");
$thisTab.find("#name").text("");
$thisTab.find("#zonename").text("");
$thisTab.find("#device_id").text("");
$thisTab.find("#state").text("");
$thisTab.find("#storage").text("");
$thisTab.find("#account").text("");
$thisTab.find("#type").text("");
$thisTab.find("#size").text("");
$thisTab.find("#vm_name").text("");
$thisTab.find("#created").text("");
$thisTab.find("#domain").text("");
}
var volumeActionMap = {
"label.action.attach.disk": {
isAsyncJob: true,
asyncJobResponse: "attachvolumeresponse",
dialogBeforeActionFn : doAttachDisk,
inProcessText: "label.action.attach.disk.processing",
afterActionSeccessFn: function(json, $midmenuItem1, id) {
var jsonObj = json.queryasyncjobresultresponse.jobresult.volume;
volumeToMidmenu(jsonObj, $midmenuItem1);
}
},
"label.action.detach.disk": {
api: "detachVolume",
isAsyncJob: true,
asyncJobResponse: "detachvolumeresponse",
inProcessText: "label.action.detach.disk.processing",
afterActionSeccessFn: function(json, $midmenuItem1, id){
var jsonObj = json.queryasyncjobresultresponse.jobresult.volume;
volumeToMidmenu(jsonObj, $midmenuItem1);
}
},
"label.action.create.template": {
isAsyncJob: true,
asyncJobResponse: "createtemplateresponse",
dialogBeforeActionFn : doCreateTemplateFromVolume,
inProcessText: "label.action.create.template.processing",
afterActionSeccessFn: function(json, $midmenuItem1, id) {}
},
"label.action.delete.volume": {
api: "deleteVolume",
isAsyncJob: false,
dialogBeforeActionFn : doDeleteVolume,
inProcessText: "label.action.delete.volume.processing",
afterActionSeccessFn: function(json, $midmenuItem1, id) {
$midmenuItem1.remove();
if(id.toString() == $("#right_panel_content").find("#tab_content_details").find("#id").text()) {
clearRightPanel();
volumeClearRightPanel();
}
}
},
"label.action.take.snapshot": {
isAsyncJob: true,
asyncJobResponse: "createsnapshotresponse",
dialogBeforeActionFn : doTakeSnapshot,
inProcessText: "label.action.take.snapshot.processing",
afterActionSeccessFn: function(json, $midmenuItem1, id) {}
},
"label.action.recurring.snapshot": {
dialogBeforeActionFn : doRecurringSnapshot
},
"label.action.download.volume": {
dialogBeforeActionFn : doDownloadVolume
}
}
function doDownloadVolume($actionLink, $detailsTab, $midmenuItem1) {
var jsonObj = $midmenuItem1.data("jsonObj");
var id = jsonObj.id;
var zoneId = jsonObj.zoneid;
var apiCommand = "command=extractVolume&id="+id+"&zoneid="+zoneId+"&mode=HTTP_DOWNLOAD";
var $dialogDownloadVolume = $("#dialog_download_volume");
$spinningWheel = $dialogDownloadVolume.find("#spinning_wheel");
$spinningWheel.show();
var $infoContainer = $dialogDownloadVolume.find("#info_container");
$infoContainer.hide();
$dialogDownloadVolume
.dialog('option', 'buttons', {
"Close": function() {
$(this).dialog("close");
}
}).dialog("open");
$.ajax({
data: createURL(apiCommand),
dataType: "json",
success: function(json) {
var jobId = json.extractvolumeresponse.jobid;
var timerKey = "asyncJob_" + jobId;
$("body").everyTime(
2000, //this API returns fast. So, set 2 seconds instead of 10 seconds.
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
$infoContainer.removeClass("error");
$infoContainer.find("#icon,#info").removeClass("error");
var url = decodeURIComponent(json.queryasyncjobresultresponse.jobresult.volume.url);
var htmlMsg = dictionary["message.download.volume"];
var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url);
$infoContainer.find("#info").html(htmlMsg2);
$infoContainer.show();
} else if (result.jobstatus == 2) { // Failed
//var errorMsg = g_dictionary["label.failed"] + " - " + g_dictionary["label.error.code"] + " " + fromdb(result.jobresult.errorcode);
var errorMsg = g_dictionary["label.failed"] + " - " + fromdb(result.jobresult.errortext);
handleErrorInDialog2(errorMsg, $dialogDownloadVolume);
}
}
},
error: function(XMLHttpResponse) {
$("body").stopTime(timerKey);
handleError(XMLHttpResponse, function() {
handleErrorInDialog(XMLHttpResponse, $dialogDownloadVolume);
});
}
});
},
0
);
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse, function() {
handleErrorInDialog(XMLHttpResponse, $dialogDownloadVolume);
});
}
});
}
function doCreateTemplateFromVolume($actionLink, $detailsTab, $midmenuItem1) {
if (getUserPublicTemplateEnabled() == "true" || isAdmin()) {
$("#dialog_create_template #create_template_public_container").show();
}
var jsonObj = $midmenuItem1.data("jsonObj");
$("#dialog_create_template").find("#volume_name").text(jsonObj.name);
$("#dialog_create_template")
.dialog('option', 'buttons', {
"Create": function() {
var thisDialog = $(this);
thisDialog.dialog("close");
// validate values
var isValid = true;
isValid &= validateString("Name", thisDialog.find("#create_template_name"), thisDialog.find("#create_template_name_errormsg"));
isValid &= validateString("Display Text", thisDialog.find("#create_template_desc"), thisDialog.find("#create_template_desc_errormsg"));
if (!isValid) return;
var name = trim(thisDialog.find("#create_template_name").val());
var desc = trim(thisDialog.find("#create_template_desc").val());
var osType = thisDialog.find("#create_template_os_type").val();
var isPublic = thisDialog.find("#create_template_public").val();
var password = thisDialog.find("#create_template_password").val();
var id = $midmenuItem1.data("jsonObj").id;
var apiCommand = "command=createTemplate&volumeId="+id+"&name="+todb(name)+"&displayText="+todb(desc)+"&osTypeId="+osType+"&isPublic="+isPublic+"&passwordEnabled="+password;
doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $detailsTab);
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
}
function doDeleteVolume($actionLink, $detailsTab, $midmenuItem1) {
var jsonObj = $midmenuItem1.data("jsonObj");
var id = jsonObj.id;
$("#dialog_confirmation")
.text(dictionary["message.action.delete.volume"])
.dialog('option', 'buttons', {
"Confirm": function() {
$(this).dialog("close");
var apiCommand = "command=deleteVolume&id="+id;
doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $detailsTab);
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
}
function doTakeSnapshot($actionLink, $detailsTab, $midmenuItem1) {
$("#dialog_confirmation")
.text(dictionary["message.action.take.snapshot"])
.dialog('option', 'buttons', {
"Confirm": function() {
$(this).dialog("close");
var id = $midmenuItem1.data("jsonObj").id;
var apiCommand = "command=createSnapshot&volumeid="+id;
doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $detailsTab);
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
}
function clearTopPanel(target) { // "target == null" means target at all (hourly + daily + weekly + monthly)
var dialogBox = $("#dialog_recurring_snapshot");
if(target == "hourly" || target == null) {
dialogBox.find("#dialog_snapshot_hourly_info_unset").show();
dialogBox.find("#dialog_snapshot_hourly_info_set").hide();
dialogBox.find("#read_hourly_max, #read_hourly_minute").text("N/A");
dialogBox.find("#hourly_edit_link, #hourly_delete_link").data("intervalType", "hourly").data("max", "").data("timezone", (g_timezone==null)?"Etc/GMT+12":g_timezone).data("minute", "00");
}
if(target == "daily" || target == null) {
dialogBox.find("#dialog_snapshot_daily_info_unset").show();
dialogBox.find("#dialog_snapshot_daily_info_set").hide();
dialogBox.find("#read_daily_max, #read_daily_minute, #read_daily_hour, #read_daily_meridiem").text("N/A");
dialogBox.find("#daily_edit_link, #daily_delete_link").data("intervalType", "daily").data("max", "").data("timezone", (g_timezone==null)?"Etc/GMT+12":g_timezone).data("minute", "00").data("hour12", "00").data("meridiem", "AM");
}
if(target == "weekly" || target == null) {
dialogBox.find("#dialog_snapshot_weekly_info_unset").show();
dialogBox.find("#dialog_snapshot_weekly_info_set").hide();
dialogBox.find("#read_weekly_max, #read_weekly_minute, #read_weekly_hour, #read_weekly_meridiem, #read_weekly_day_of_week").text("N/A");
dialogBox.find("#weekly_edit_link, #weekly_delete_link").data("intervalType", "weekly").data("max", "").data("timezone", (g_timezone==null)?"Etc/GMT+12":g_timezone).data("minute", "00").data("hour12", "00").data("meridiem", "AM").data("dayOfWeek", "1");
}
if(target == "monthly" || target == null) {
dialogBox.find("#dialog_snapshot_monthly_info_unset").show();
dialogBox.find("#dialog_snapshot_monthly_info_set").hide();
dialogBox.find("#read_monthly_max, #read_monthly_minute, #read_monthly_hour, #read_monthly_meridiem, #read_monthly_day_of_month").text("N/A");
dialogBox.find("#monthly_edit_link, #monthly_delete_link").data("intervalType", "monthly").data("max", "").data("timezone", (g_timezone==null)?"Etc/GMT+12":g_timezone).data("minute", "00").data("hour12", "00").data("meridiem", "AM").data("dayOfMonth", "1");
}
}
function clearBottomPanel() {
var dialogBox = $("#dialog_recurring_snapshot");
dialogBox.find("#edit_hour").val("00");
cleanErrMsg(dialogBox.find("#edit_hour"), dialogBox.find("#edit_time_errormsg"));
dialogBox.find("#edit_minute").val("00");
cleanErrMsg(dialogBox.find("#edit_minute"), dialogBox.find("#edit_time_errormsg"));
dialogBox.find("#edit_meridiem").val("AM");
dialogBox.find("#edit_max").val("");
cleanErrMsg(dialogBox.find("#edit_max"), dialogBox.find("#edit_max_errormsg"));
dialogBox.find("#edit_timezone").val((g_timezone==null)?"Etc/GMT+12":g_timezone);
cleanErrMsg(dialogBox.find("#edit_timezone"), dialogBox.find("#edit_timezone_errormsg"));
dialogBox.find("#edit_day_of_week").val("1");
cleanErrMsg(dialogBox.find("#edit_day_of_week"), dialogBox.find("#edit_day_of_week_errormsg"));
dialogBox.find("#edit_day_of_month").val("1");
cleanErrMsg(dialogBox.find("#edit_day_of_month"), dialogBox.find("#edit_day_of_month_errormsg"));
}
function doRecurringSnapshot($actionLink, $detailsTab, $midmenuItem1) {
var volumeId = $midmenuItem1.data("jsonObj").id;
var dialogBox = $("#dialog_recurring_snapshot");
clearTopPanel();
$.ajax({
data: createURL("command=listSnapshotPolicies&volumeid="+volumeId),
dataType: "json",
async: false,
success: function(json) {
var items = json.listsnapshotpoliciesresponse.snapshotpolicy;
var $snapInterval = dialogBox.find("#snapshot_interval");
$snapInterval.find("#snapshot_interval_0,#snapshot_interval_1,#snapshot_interval_2,#snapshot_interval_3").data("jsonObj", null);
if(items!=null && items.length>0) {
for (var i = 0; i < items.length; i++) {
var item = items[i];
$snapInterval.find("#snapshot_interval_"+item.intervaltype).data("jsonObj", item);
}
}
clearBottomPanel();
$snapInterval.val("0"); //default to hourly
$snapInterval.change();
dialogBox.dialog('option', 'buttons', {
"Apply": function() {
var thisDialog = $(this);
var volumeId = thisDialog.data("volumeId");
var bottomPanel = thisDialog.find("#dialog_snapshotright");
var intervalType = thisDialog.find("#snapshot_interval").val();
var minute, hour12, hour24, meridiem, dayOfWeek, dayOfWeekString, dayOfMonth, schedule, max, timezone;
switch(intervalType) {
case "0":
var isValid = true;
isValid &= validateInteger("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg"));
if (!isValid) return;
intervalType = "hourly";
minute = bottomPanel.find("#edit_minute").val();
schedule = minute;
max = bottomPanel.find("#edit_max").val();
timezone = bottomPanel.find("#edit_timezone").val();
break;
case "1":
var isValid = true;
isValid &= validateInteger("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg"));
if (!isValid) return;
intervalType = "daily";
minute = bottomPanel.find("#edit_minute").val();
hour12 = bottomPanel.find("#edit_hour").val();
meridiem = bottomPanel.find("#edit_meridiem").val();
if(meridiem=="AM")
hour24 = hour12;
else //meridiem=="PM"
hour24 = (parseInt(hour12,10)+12).toString(); //specify number base to be 10. Otherwise, "08" and "09" will be treated as octal numbers (base 8).
schedule = minute + ":" + hour24;
max = bottomPanel.find("#edit_max").val();
timezone = bottomPanel.find("#edit_timezone").val();
break;
case "2":
var isValid = true;
isValid &= validateInteger("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg"));
if (!isValid) return;
intervalType = "weekly";
minute = bottomPanel.find("#edit_minute").val();
hour12 = bottomPanel.find("#edit_hour").val();
meridiem = bottomPanel.find("#edit_meridiem").val();
if(meridiem=="AM")
hour24 = hour12;
else //meridiem=="PM"
hour24 = (parseInt(hour12,10)+12).toString(); //specify number base to be 10. Otherwise, "08" and "09" will be treated as octal numbers (base 8).
dayOfWeek = bottomPanel.find("#edit_day_of_week").val();
dayOfWeekString = bottomPanel.find("#edit_day_of_week option:selected").text();
schedule = minute + ":" + hour24 + ":" + dayOfWeek;
max = bottomPanel.find("#edit_max").val();
timezone = bottomPanel.find("#edit_timezone").val();
break;
case "3":
var isValid = true;
isValid &= validateInteger("Keep # of snapshots", bottomPanel.find("#edit_max"), bottomPanel.find("#edit_max_errormsg"));
if (!isValid) return;
intervalType = "monthly";
minute = bottomPanel.find("#edit_minute").val();
hour12 = bottomPanel.find("#edit_hour").val();
meridiem = bottomPanel.find("#edit_meridiem").val();
if(meridiem=="AM")
hour24 = hour12;
else //meridiem=="PM"
hour24 = (parseInt(hour12,10)+12).toString(); //specify number base to be 10. Otherwise, "08" and "09" will be treated as octal numbers (base 8).
dayOfMonth = bottomPanel.find("#edit_day_of_month").val();
schedule = minute + ":" + hour24 + ":" + dayOfMonth;
max = bottomPanel.find("#edit_max").val();
timezone = bottomPanel.find("#edit_timezone").val();
break;
}
var thisLink;
var $snapshotInterval = thisDialog.find("#snapshot_interval");
var $snapshotIntervalOption = thisDialog.find("#snapshot_interval_"+$snapshotInterval.val());
$.ajax({
data: createURL("command=createSnapshotPolicy&intervaltype="+intervalType+"&schedule="+schedule+"&volumeid="+volumeId+"&maxsnaps="+max+"&timezone="+todb(timezone)),
dataType: "json",
success: function(json) {
$snapshotIntervalOption.data("jsonObj", json.createsnapshotpolicyresponse.snapshotpolicy);
$snapshotInterval.change();
thisDialog.find("#info").text(dictionary["message.apply.snapshot.policy"]);
thisDialog.find("#info_container").show();
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
}
});
},
"Disable": function() {
var thisDialog = $(this);
var $snapshotInterval = thisDialog.find("#snapshot_interval");
var $snapshotIntervalOption = thisDialog.find("#snapshot_interval_"+$snapshotInterval.val());
var jsonObj = $snapshotIntervalOption.data("jsonObj");
if(jsonObj != null) {
$.ajax({
data: createURL("command=deleteSnapshotPolicies&id="+jsonObj.id),
dataType: "json",
success: function(json) {
$snapshotIntervalOption.data("jsonObj", null);
$snapshotInterval.change();
thisDialog.find("#info").text(dictionary["message.disable.snapshot.policy"]);
thisDialog.find("#info_container").show();
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
}
});
}
},
"Close": function() {
$(this).dialog("close");
}
}).dialog("open").data("volumeId", volumeId);
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
}
});
}
function populateVirtualMachineField(domainId, account, zoneId) {
$.ajax({
cache: false,
data: createURL("command=listVirtualMachines&state=Running&zoneid="+zoneId+"&domainid="+domainId+"&account="+account),
dataType: "json",
success: function(json) {
var instances = json.listvirtualmachinesresponse.virtualmachine;
var volumeVmSelect = $("#dialog_attach_volume").find("#volume_vm").empty();
if (instances != null && instances.length > 0) {
for (var i = 0; i < instances.length; i++) {
volumeVmSelect.append("");
}
}
$.ajax({
cache: false,
data: createURL("command=listVirtualMachines&state=Stopped&zoneid="+zoneId+"&domainid="+domainId+"&account="+account),
dataType: "json",
success: function(json) {
var instances = json.listvirtualmachinesresponse.virtualmachine;
if (instances != null && instances.length > 0) {
for (var i = 0; i < instances.length; i++) {
volumeVmSelect.append("");
}
}
}
});
}
});
}
function doAttachDisk($actionLink, $detailsTab, $midmenuItem1) {
var jsonObj = $midmenuItem1.data("jsonObj");
populateVirtualMachineField(jsonObj.domainid, jsonObj.account, jsonObj.zoneid);
$("#dialog_attach_volume")
.dialog('option', 'buttons', {
"OK": function() {
var $thisDialog = $(this);
var isValid = true;
isValid &= validateDropDownBox("Virtual Machine", $thisDialog.find("#volume_vm"), $thisDialog.find("#volume_vm_errormsg"));
if (!isValid)
return;
$thisDialog.dialog("close");
var virtualMachineId = $thisDialog.find("#volume_vm").val();
var id = jsonObj.id;
var apiCommand = "command=attachVolume&id="+id+'&virtualMachineId='+virtualMachineId;
doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $detailsTab);
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
}
//Snapshot tab actions
var volumeSnapshotActionMap = {
"label.action.create.volume": {
isAsyncJob: true,
asyncJobResponse: "createvolumeresponse",
dialogBeforeActionFn : doCreateVolumeFromSnapshotInVolumePage,
inProcessText: "label.action.create.volume.processing",
afterActionSeccessFn: function(json, id, $subgridItem) {
var $midmenuItem1 = $("#midmenu_item").clone();
var item = json.queryasyncjobresultresponse.jobresult.volume;
volumeToMidmenu(item, $midmenuItem1);
bindClickToMidMenu($midmenuItem1, volumeToRightPanel, getMidmenuId);
$midmenuItem1.find("#info_icon").removeClass("error").show();
$midmenuItem1.data("afterActionInfo", ("Creating volume from snapshot succeeded."));
$("#midmenu_container").append($midmenuItem1.fadeIn("slow"));
}
}
,
"label.action.delete.snapshot": {
api: "deleteSnapshot",
isAsyncJob: true,
asyncJobResponse: "deletesnapshotresponse",
dialogBeforeActionFn : doSnapshotDelete,
inProcessText: "label.action.delete.snapshot.processing",
afterActionSeccessFn: function(json, id, $subgridItem) {
$subgridItem.slideUp("slow", function() {
$(this).remove();
});
}
}
,
"label.action.create.template": {
isAsyncJob: true,
asyncJobResponse: "createtemplateresponse",
dialogBeforeActionFn : doCreateTemplateFromSnapshotInVolumePage,
inProcessText: "label.action.create.template.processing",
afterActionSeccessFn: function(json, id, $subgridItem) {}
}
}
function doSnapshotDelete($actionLink, $subgridItem) {
$("#dialog_confirmation")
.text(dictionary["message.action.delete.snapshot"])
.dialog('option', 'buttons', {
"Confirm": function() {
$(this).dialog("close");
var id = $subgridItem.data("jsonObj").id;
var apiCommand = "command=deleteSnapshot&id="+id;
doActionToSubgridItem(id, $actionLink, apiCommand, $subgridItem);
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
}
function doCreateVolumeFromSnapshotInVolumePage($actionLink, $subgridItem) {
var jsonObj = $subgridItem.data("jsonObj");
$("#dialog_add_volume_from_snapshot")
.dialog("option", "buttons", {
"Add": function() {
var thisDialog = $(this);
var isValid = true;
isValid &= validateString("Name", thisDialog.find("#name"), thisDialog.find("#name_errormsg"));
if (!isValid) return;
thisDialog.dialog("close");
var name = thisDialog.find("#name").val();
var id = jsonObj.id;
var apiCommand = "command=createVolume&snapshotid="+id+"&name="+fromdb(name);
doActionToSubgridItem(id, $actionLink, apiCommand, $subgridItem);
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
}
function doCreateTemplateFromSnapshotInVolumePage($actionLink, $subgridItem) {
if (getUserPublicTemplateEnabled() == "true" || isAdmin()) {
$("#dialog_create_template_from_snapshot #create_template_public_container").show();
}
var jsonObj = $subgridItem.data("jsonObj");
$("#dialog_create_template_from_snapshot")
.dialog("option", "buttons", {
"Add": function() {
var thisDialog = $(this);
var isValid = true;
isValid &= validateString("Name", thisDialog.find("#name"), thisDialog.find("#name_errormsg"), false);
isValid &= validateString("Display Text", thisDialog.find("#display_text"), thisDialog.find("#display_text_errormsg"), false);
if (!isValid)
return;
thisDialog.dialog("close");
var array1 = [];
var name = thisDialog.find("#name").val();
array1.push("&name="+todb(name));
var displayText = thisDialog.find("#display_text").val();
array1.push("&displaytext="+todb(displayText));
var osTypeId = thisDialog.find("#os_type").val();
array1.push("&ostypeid="+osTypeId);
var isPublic = thisDialog.find("#ispublic").val();
array1.push("&isPublic="+isPublic);
var password = thisDialog.find("#password").val();
array1.push("&passwordEnabled="+password);
if(thisDialog.find("#isfeatured_container").css("display")!="none") {
var isFeatured = thisDialog.find("#isfeatured").val();
array1.push("&isfeatured="+isFeatured);
}
var id = jsonObj.id;
var apiCommand = "command=createTemplate&snapshotid="+id+array1.join("");
doActionToSubgridItem(id, $actionLink, apiCommand, $subgridItem);
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
}