cloudstack/ui/scripts/cloud.core.configuration.js
Manuel Amador (Rudd-O) 05c020e1f6 Source code committed
2010-08-11 09:13:29 -07:00

1754 lines
77 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/>.
*
*/
// Version: @VERSION@
function showConfigurationTab() {
var forceLogout = true; // We force a logout only if the user has first added a POD for the very first time
var currentSubMenu = $("#submenu_global");
activateDialog($("#dialog_edit_global").dialog({
autoOpen: false,
modal: true,
zIndex: 2000
}));
$("#global_template").bind("click", function(event) {
var template = $(this);
var link = $(event.target);
var linkAction = link.attr("id");
var name = template.data("name");
switch (linkAction) {
case "global_action_edit" :
$("#edit_global_name").text(name);
$("#edit_global_value").val(template.find("#global_value").text());
$("#dialog_edit_global")
.dialog('option', 'buttons', {
"Confirm": function() {
var thisDialog = $(this);
// validate values
var isValid = true;
isValid &= validateString("Value", thisDialog.find("#edit_global_value"), thisDialog.find("#edit_global_value_errormsg"), true);
if (!isValid) return;
var value = trim(thisDialog.find("#edit_global_value").val());
thisDialog.dialog("close");
$.ajax({
data: createURL("command=updateConfiguration&name="+encodeURIComponent(name)+"&value="+encodeURIComponent(value)+"&response=json"),
dataType: "json",
success: function(json) {
template.find("#global_value").text(value);
$("#dialog_alert").html("<p><b>PLEASE RESTART YOUR MGMT SERVER!!</b><br/><b>PLEASE RESTART YOUR MGMT SERVER!!</b><br/><br/>You have successfully change a global configuration value. Please <b>RESTART</b> your management server for your new settings to take effect. Refer to the install guide for instructions on how to restart the mgmt server.</p>").dialog("open");
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
}
return false;
});
function globalJSONToTemplate(json, template) {
template.data("name", sanitizeXSS(noNull(json.name))).attr("id", "global_"+noNull(json.name));
(index++ % 2 == 0)? template.addClass("smallrow_even"): template.addClass("smallrow_odd");
template.find("#global_name").text(noNull(json.name));
template.find("#global_value").text(noNull(json.value));
template.find("#global_desc").text(noNull(json.description));
}
$("#submenu_content_global .grid_container .grid_header .grid_genheader_cell").bind("click", function(event) {
var headerColumn = $(this);
var sortingIcon = headerColumn.find(".gridsorting_arrow");
if (sortingIcon.hasClass("up") == false) { //If it's not in ascending order, sort it ascending.
$("#submenu_content_global .grid_container .grid_header .grid_genheader_cell .gridsorting_arrow").removeClass("down up"); //remove arrow from all header columns first
sortingIcon.addClass("up"); //add up arrow to this specific header column
sortingOrder = "asc";
}
else if (sortingIcon.hasClass("up") == true) { //If it's in ascending order, sort it descending.
$("#submenu_content_global .grid_container .grid_header .grid_genheader_cell .gridsorting_arrow").removeClass("down up"); //remove arrow from all header columns first
sortingIcon.addClass("down"); //add down arrow to this specific header column
sortingOrder = "desc";
}
switch(headerColumn[0].id) {
case "name_header":
sortBy = "name";
items.sort(sortArrayAlphabetically);
break;
case "value_header":
sortBy = "value";
items.sort(sortArrayAlphabetically);
break;
case "description_header":
sortBy = "description";
items.sort(sortArrayAlphabetically);
break;
}
drawGrid(items, $("#submenu_content_global"), $("#global_template"), globalJSONToTemplate);
return false;
});
function listConfigurations() {
var submenuContent = $("#submenu_content_global");
var commandString;
var advanced = submenuContent.find("#search_button").data("advanced");
if (advanced != null && advanced) {
var name = submenuContent.find("#advanced_search #adv_search_name").val();
var moreCriteria = [];
if (name!=null && trim(name).length > 0)
moreCriteria.push("&name="+encodeURIComponent(trim(name)));
commandString = "command=listConfigurations&page="+currentPage+moreCriteria.join("")+"&response=json";
} else {
var searchInput = submenuContent.find("#search_input").val();
if (searchInput != null && searchInput.length > 0)
commandString = "command=listConfigurations&page="+currentPage+"&keyword="+searchInput+"&response=json";
else
commandString = "command=listConfigurations&page="+currentPage+"&response=json";
}
//listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate);
listItems(submenuContent, commandString, "listconfigurationsresponse", "configuration", $("#global_template"), globalJSONToTemplate);
}
submenuContentEventBinder($("#submenu_content_global"), listConfigurations);
$("#submenu_global").bind("click", function(event) {
event.preventDefault();
$(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off");
currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on");
currentSubMenu = $(this);
var submenuContent = $("#submenu_content_global").show();
$("#submenu_content_zones, #submenu_content_service, #submenu_content_disk").hide();
currentPage = 1;
listConfigurations();
});
//zone
var rightPanel = $("#submenu_content_zones #right_panel_detail_title");
var rightContent = $("#submenu_content_zones #right_panel_detail_content");
function clearRightPanel() {
rightPanel.empty();
rightContent.empty();
$("#submenu_content_zones").find("#action_edit_zone, #action_add_pod, #action_edit_pod, #action_add_publicip_vlan, #action_add_directip_vlan, #action_delete").hide();
}
function zoneObjectToRightPanel(obj) {
rightPanel.html("<strong>Zone:</strong> "+sanitizeXSS(obj.name));
var rightContentHtml =
"<p><span>ZONE:</span> "+sanitizeXSS(obj.name)+"</p>"
+ "<p><span>DNS 1:</span> "+obj.dns1+"</p>"
+ "<p><span>DNS 2:</span> "+((obj.dns2 == null) ? "" : obj.dns2) +"</p>"
+ "<p><span>Internal DNS 1:</span> "+obj.internaldns1+"</p>"
+ "<p><span>Internal DNS 2:</span> "+((obj.internaldns2 == null) ? "" : obj.internaldns2) +"</p>";
if (getNetworkType() != "vnet")
rightContentHtml += "<p><span>VLAN:</span> "+((obj.vlan == null) ? "" : obj.vlan) +"</p>";
rightContentHtml += "<p><span>Guest CIDR:</span> "+obj.guestcidraddress+"</p>";
rightContent.data("id", obj.id).html(rightContentHtml);
$("#submenu_content_zones").find("#action_edit_pod, #action_add_directip_vlan").hide();
var buttons = $("#submenu_content_zones #action_delete, #submenu_content_zones #action_edit_zone, #submenu_content_zones #action_add_pod, #submenu_content_zones #action_add_publicip_vlan").data("type", "zone").show();
buttons.data("id", obj.id);
buttons.data("name", obj.name);
buttons.data("dns1", obj.dns1);
buttons.data("dns2", obj.dns2);
buttons.data("internaldns1", obj.internaldns1);
buttons.data("internaldns2", obj.internaldns2);
buttons.data("vlan", obj.vlan);
buttons.data("guestcidraddress", obj.guestcidraddress);
}
function podObjectToRightPanel(obj) {
rightPanel.html("<strong>Pod:</strong> " + sanitizeXSS(obj.name));
var rightContentHtml =
"<p><span>POD:</span> "+sanitizeXSS(obj.name)+"</p>"
+ "<p><span>Private CIDR:</span> "+obj.cidr+"</p>"
+ "<p><span>Private IP Range:</span> "+obj.ipRange+"</p>"
+ "<p><span>Gateway:</span> "+obj.gateway+"</p>";
rightContent.data("id", obj.id).html(rightContentHtml);
$("#submenu_content_zones").find("#action_edit_zone, #action_add_pod, #action_add_publicip_vlan").hide();
var buttons = $("#submenu_content_zones").find("#action_delete, #action_edit_pod").data("type", "pod").show();
buttons.data("id", obj.id);
buttons.data("zoneid", obj.zoneid);
buttons.data("name", obj.name);
buttons.data("cidr", obj.cidr);
buttons.data("startip", obj.startip);
buttons.data("endip", obj.endip);
buttons.data("ipRange", obj.ipRange);
buttons.data("gateway", obj.gateway);
if (getDirectAttachUntaggedEnabled() == "true") {
$("#submenu_content_zones #action_add_directip_vlan").data("type", "pod").data("id", obj.id).data("name", obj.name).data("zoneid", obj.zoneid).show();
}
}
$("#submenu_content_zones #action_delete").bind("click", function(event) {
var deleteButton = $(this);
var confirmMessage = null;
var id = deleteButton.data("id");
var type = deleteButton.data("type");
var command = null;
if (type == "zone") {
confirmMessage = "Please confirm you want to delete the zone : <b>" + deleteButton.data("name") +"</b>";
command = "deleteZone";
} else if (type == "pod") {
confirmMessage = "Please confirm you want to delete the pod : <b>" + deleteButton.data("name") + "</b>";
command = "deletePod"
} else {
confirmMessage = "Please confirm you want to delete the public vlan IP range : <b>" + deleteButton.data("name") + "</b>";
command = "deleteVlanIpRange";
}
$("#dialog_confirmation")
.html(confirmMessage)
.dialog('option', 'buttons', {
"Confirm": function() {
$(this).dialog("close");
$.ajax({
data: createURL("command="+command+"&id="+id+"&response=json"),
dataType: "json",
success: function(json) {
var target = null;
if (type == "zone") {
target = $("#submenu_content_zones #zone_" + id);
} else if (type == "pod") {
target = $("#submenu_content_zones #pod_" + id);
} else {
target = $("#submenu_content_zones #publicip_range_" + id);
}
target.fadeOut("slow", function() {
$(this).remove();
});
rightPanel.empty();
rightContent.empty();
$("#submenu_content_zones #action_delete").hide();
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
});
$("#submenu_content_zones #action_edit_zone").bind("click", function(event) {
var id = $(this).data("id");
var dialogEditZone = $("#dialog_edit_zone");
dialogEditZone.find("#edit_zone_name").val($(this).data("name"));
dialogEditZone.find("#edit_zone_dns1").val($(this).data("dns1"));
dialogEditZone.find("#edit_zone_dns2").val($(this).data("dns2"));
dialogEditZone.find("#edit_zone_internaldns1").val($(this).data("internaldns1"));
dialogEditZone.find("#edit_zone_internaldns2").val($(this).data("internaldns2"));
dialogEditZone.find("#edit_zone_guestcidraddress").val($(this).data("guestcidraddress"));
var guestcidraddress = $(this).data("guestcidraddress");
// If the network type is vnet, don't show any vlan stuff.
if (getNetworkType() != "vnet") {
dialogEditZone.find("#edit_zone_startvlan").val("");
dialogEditZone.find("#edit_zone_endvlan").val("");
var vlan = $(this).data("vlan");
if(vlan != null) {
if(vlan.indexOf("-")!==-1) {
var startVlan = vlan.substring(0, vlan.indexOf("-"));
var endVlan = vlan.substring((vlan.indexOf("-")+1));
dialogEditZone.find("#edit_zone_startvlan").val(startVlan);
dialogEditZone.find("#edit_zone_endvlan").val(endVlan);
}
else {
dialogEditZone.find("#edit_zone_startvlan").val(vlan);
}
}
}
dialogEditZone
.dialog('option', 'buttons', {
"Change": function() {
var thisDialog = $(this);
// validate values
var isValid = true;
isValid &= validateString("Name", thisDialog.find("#edit_zone_name"), thisDialog.find("#edit_zone_name_errormsg"));
isValid &= validateIp("DNS 1", thisDialog.find("#edit_zone_dns1"), thisDialog.find("#edit_zone_dns1_errormsg"), false); //required
isValid &= validateIp("DNS 2", thisDialog.find("#edit_zone_dns2"), thisDialog.find("#edit_zone_dns2_errormsg"), true); //optional
isValid &= validateIp("Internal DNS 1", thisDialog.find("#edit_zone_internaldns1"), thisDialog.find("#edit_zone_internaldns1_errormsg"), false); //required
isValid &= validateIp("Internal DNS 2", thisDialog.find("#edit_zone_internaldns2"), thisDialog.find("#edit_zone_internaldns2_errormsg"), true); //optional
if (getNetworkType() != "vnet") {
isValid &= validateString("Zone - Start VLAN Range", thisDialog.find("#edit_zone_startvlan"), thisDialog.find("#edit_zone_startvlan_errormsg"), false); //required
isValid &= validateString("Zone - End VLAN Range", thisDialog.find("#edit_zone_endvlan"), thisDialog.find("#edit_zone_endvlan_errormsg"), true); //optional
}
isValid &= validateCIDR("Guest CIDR", thisDialog.find("#edit_zone_guestcidraddress"), thisDialog.find("#edit_zone_guestcidraddress_errormsg"), false); //required
if (!isValid) return;
var moreCriteria = [];
var name = trim(thisDialog.find("#edit_zone_name").val());
moreCriteria.push("&name="+encodeURIComponent(name));
var dns1 = trim(thisDialog.find("#edit_zone_dns1").val());
moreCriteria.push("&dns1="+encodeURIComponent(dns1));
var dns2 = trim(thisDialog.find("#edit_zone_dns2").val());
if (dns2 != null & dns2.length > 0)
moreCriteria.push("&dns2="+encodeURIComponent(dns2));
var internaldns1 = trim(thisDialog.find("#edit_zone_internaldns1").val());
moreCriteria.push("&internaldns1="+encodeURIComponent(internaldns1));
var internaldns2 = trim(thisDialog.find("#edit_zone_internaldns2").val());
if (internaldns2 != null & internaldns2.length > 0)
moreCriteria.push("&internaldns2="+encodeURIComponent(internaldns2));
var vlan;
if (getNetworkType() != "vnet") {
var vlanStart = trim(thisDialog.find("#edit_zone_startvlan").val());
var vlanEnd = trim(thisDialog.find("#edit_zone_endvlan").val());
if (vlanEnd != null && vlanEnd.length > 0)
vlan = vlanStart + "-" + vlanEnd;
else
vlan = vlanStart;
moreCriteria.push("&vlan=" + encodeURIComponent(vlan));
}
var guestcidraddress = trim(thisDialog.find("#edit_zone_guestcidraddress").val());
moreCriteria.push("&guestcidraddress="+encodeURIComponent(guestcidraddress));
thisDialog.dialog("close");
var template = $("#zone_"+id);
var loadingImg = template.find(".adding_loading").find(".adding_text").text("Updating zone....");
var row_container = template.find("#row_container");
loadingImg.show();
row_container.hide();
$.ajax({
data: createURL("command=updateZone&id="+id+moreCriteria.join("")+"&response=json"),
dataType: "json",
success: function(json) {
var obj = {"id": id, "name": name, "dns1": dns1, "dns2": dns2, "internaldns1": internaldns1, "internaldns2": internaldns2, "vlan": vlan, "guestcidraddress": guestcidraddress };
zoneObjectToRightPanel(obj);
var zoneName = $("#zone_"+id).find("#zone_name").text(name);
zoneName.data("id", id).data("name", sanitizeXSS(name)).data("dns1", dns1).data("internaldns1", internaldns1).data("guestcidraddress", guestcidraddress);
if (dns2 != "")
zoneName.data("dns2", dns2);
if (internaldns2 != "")
zoneName.data("internaldns2", internaldns2);
if (vlan != "")
zoneName.data("vlan", vlan);
loadingImg.hide();
row_container.show();
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
loadingImg.hide();
row_container.show();
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
});
$("#submenu_content_zones #action_add_pod").bind("click", function(event) {
var id = $(this).data("id");
$("#dialog_add_pod").find("#add_pod_zone_name").text($(this).data("name"));
$("#dialog_add_pod #add_pod_name, #dialog_add_pod #add_pod_cidr, #dialog_add_pod #add_pod_startip, #dialog_add_pod #add_pod_endip, #add_pod_gateway").val("");
$("#dialog_add_pod")
.dialog('option', 'buttons', {
"Add": function() {
var thisDialog = $(this);
// validate values
var isValid = true;
isValid &= validateString("Name", thisDialog.find("#add_pod_name"), thisDialog.find("#add_pod_name_errormsg"));
isValid &= validateCIDR("CIDR", thisDialog.find("#add_pod_cidr"), thisDialog.find("#add_pod_cidr_errormsg"));
isValid &= validateIp("Start IP Range", thisDialog.find("#add_pod_startip"), thisDialog.find("#add_pod_startip_errormsg")); //required
isValid &= validateIp("End IP Range", thisDialog.find("#add_pod_endip"), thisDialog.find("#add_pod_endip_errormsg"), true); //optional
isValid &= validateIp("Gateway", thisDialog.find("#add_pod_gateway"), thisDialog.find("#add_pod_gateway_errormsg")); //required when creating
if (!isValid) return;
var name = trim(thisDialog.find("#add_pod_name").val());
var cidr = trim(thisDialog.find("#add_pod_cidr").val());
var startip = trim(thisDialog.find("#add_pod_startip").val());
var endip = trim(thisDialog.find("#add_pod_endip").val()); //optional
var gateway = trim(thisDialog.find("#add_pod_gateway").val());
var array1 = [];
array1.push("&zoneId="+id);
array1.push("&name="+encodeURIComponent(name));
array1.push("&cidr="+encodeURIComponent(cidr));
array1.push("&startIp="+encodeURIComponent(startip));
if (endip != null && endip.length > 0)
array1.push("&endIp="+encodeURIComponent(endip));
array1.push("&gateway="+encodeURIComponent(gateway));
thisDialog.dialog("close");
var template = $("#pod_template").clone(true);
var loadingImg = template.find(".adding_loading");
var row_container = template.find("#row_container");
$("#zone_"+id+" #zone_content").show();
$("#zone_" + id + " #pods_container").prepend(template.show());
$("#zone_" + id + " #zone_expand").removeClass().addClass("zonetree_openarrows");
loadingImg.show();
row_container.hide();
template.fadeIn("slow");
$.ajax({
data: createURL("command=createPod&response=json"+array1.join("")),
dataType: "json",
success: function(json) {
var pod = json.createpodresponse;
template.attr("id", "pod_"+pod.id);
podJSONToTemplate(pod, template);
loadingImg.hide();
row_container.show();
if (forceLogout) {
$("#dialog_confirmation")
.html("<p>You have successfully added your first Zone and Pod. After clicking 'OK', this UI will automatically refresh to give you access to the rest of cloud features.</p>")
.dialog('option', 'buttons', {
"OK": function() {
$(this).dialog("close");
window.location.reload();
}
}).dialog("open");
}
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
template.slideUp("slow", function() {
$(this).remove();
});
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
});
$("#submenu_content_zones #action_add_directip_vlan").bind("click", function(event) {
var thisLink = $(this);
var podid = thisLink.data("id");
var podname = thisLink.data("name");
var zoneid = thisLink.data("zoneid");
$("#dialog_add_vlan_for_pod").find("#pod_name_label").text(podname);
$("#dialog_add_vlan_for_pod")
.dialog('option', 'buttons', {
"Add": function() {
var thisDialog = $(this);
// validate values
var isValid = true;
isValid &= validateIp("Gateway", thisDialog.find("#gateway"), thisDialog.find("#gateway_errormsg"));
isValid &= validateIp("Netmask", thisDialog.find("#netmask"), thisDialog.find("#netmask_errormsg"));
isValid &= validateIp("Start IP Range", thisDialog.find("#startip"), thisDialog.find("#startip_errormsg")); //required
isValid &= validateIp("End IP Range", thisDialog.find("#endip"), thisDialog.find("#endip_errormsg"), true); //optional
if (!isValid) return;
var gateway = trim(thisDialog.find("#gateway").val());
var netmask = trim(thisDialog.find("#netmask").val());
var startip = trim(thisDialog.find("#startip").val());
var endip = trim(thisDialog.find("#endip").val());
var array1 = [];
array1.push("&vlan=untagged");
array1.push("&zoneid=" + zoneid);
array1.push("&podId=" + podid);
array1.push("&forVirtualNetwork=false"); //direct VLAN
array1.push("&gateway="+encodeURIComponent(gateway));
array1.push("&netmask="+encodeURIComponent(netmask));
array1.push("&startip="+encodeURIComponent(startip));
if(endip != null && endip.length > 0)
array1.push("&endip="+encodeURIComponent(endip));
thisDialog.dialog("close");
var template = $("#vlan_ip_range_template").clone(true);
//direct untagged VLAN is under pod(2nd level). So, make direct untagged VLAN 3rd level.
template.find("#row_container .zonetree_secondlevel").removeClass().addClass("zonetree_thirdlevel");
var loadingImg = template.find(".adding_loading");
loadingImg.find(".adding_text").text("Adding a direct IP range....");
var row_container = template.find("#row_container");
$("#zone_" + zoneid).find("#pod_" + podid).find("#directip_ranges_container").prepend(template.show());
loadingImg.show();
row_container.hide();
template.fadeIn("slow");
$.ajax({
data: createURL("command=createVlanIpRange&response=json" + array1.join("")),
dataType: "json",
success: function(json) {
var vlan = json.createvlaniprangeresponse;
template.attr("id", "publicip_range_"+vlan.id);
vlanIpRangeJSONToTemplate(vlan, template);
loadingImg.hide();
row_container.show();
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
template.slideUp("slow", function() {
$(this).remove();
});
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
return false;
});
$("#submenu_content_zones #action_edit_pod").bind("click", function(event) {
var id = $(this).data("id");
var zoneid = $(this).data("zoneid");
var dialogEditPod = $("#dialog_edit_pod");
var oldName = $(this).data("name");
dialogEditPod.find("#edit_pod_name").val(oldName);
var oldCidr = $(this).data("cidr");
dialogEditPod.find("#edit_pod_cidr").val(oldCidr);
var oldStartip = $(this).data("startip");
dialogEditPod.find("#edit_pod_startip").val(oldStartip);
var oldEndip = $(this).data("endip");
dialogEditPod.find("#edit_pod_endip").val(oldEndip);
var oldGateway = $(this).data("gateway");
dialogEditPod.find("#edit_pod_gateway").val(oldGateway);
dialogEditPod
.dialog('option', 'buttons', {
"Change": function() {
var thisDialog = $(this);
// validate values
var isValid = true;
isValid &= validateString("Name", thisDialog.find("#edit_pod_name"), thisDialog.find("#edit_pod_name_errormsg"));
isValid &= validateCIDR("CIDR", thisDialog.find("#edit_pod_cidr"), thisDialog.find("#edit_pod_cidr_errormsg"));
isValid &= validateIp("Start IP Range", thisDialog.find("#edit_pod_startip"), dialogEditPod.find("#edit_pod_startip_errormsg")); //required
isValid &= validateIp("End IP Range", dialogEditPod.find("#edit_pod_endip"), thisDialog.find("#edit_pod_endip_errormsg"), true); //optional
isValid &= validateIp("Gateway", thisDialog.find("#edit_pod_gateway"), thisDialog.find("#edit_pod_gateway_errormsg"), true); //optional when editing
if (!isValid) return;
var newName = trim(thisDialog.find("#edit_pod_name").val());
var newCidr = trim(thisDialog.find("#edit_pod_cidr").val());
var newStartip = trim(thisDialog.find("#edit_pod_startip").val());
var newEndip = trim(thisDialog.find("#edit_pod_endip").val());
var newIpRange = getIpRange(newStartip, newEndip);
var newGateway = trim(thisDialog.find("#edit_pod_gateway").val());
var array1 = [];
array1.push("&id="+id);
if(newName != oldName)
array1.push("&name="+encodeURIComponent(newName));
if(newCidr != oldCidr)
array1.push("&cidr="+encodeURIComponent(newCidr));
if(newStartip != oldStartip)
array1.push("&startIp="+encodeURIComponent(newStartip));
if(newEndip != oldEndip && newEndip != null && newEndip.length > 0)
array1.push("&endIp="+encodeURIComponent(newEndip));
if(newGateway != oldGateway && newGateway != null && newGateway.length > 0)
array1.push("&gateway="+encodeURIComponent(newGateway));
$(this).dialog("close");
var template = $("#pod_"+id);
var loadingImg = template.find(".adding_loading");
loadingImg.find(".adding_text").text("Updating a pod....");
var row_container = template.find("#row_container");
loadingImg.show();
row_container.hide();
template.fadeIn("slow");
$.ajax({
data: createURL("command=updatePod&response=json"+array1.join("")),
dataType: "json",
success: function(json) {
var newIpRange = getIpRange(newStartip, newEndip);
var obj = {"id": id, "zoneid": zoneid, "name": newName, "cidr": newCidr, "startip": newStartip, "endip": newEndip, "ipRange": newIpRange, "gateway": newGateway};
podObjectToRightPanel(obj);
var podName = $("#pod_"+id).find("#pod_name").text(newName);
podName.data("id", id).data("name", sanitizeXSS(newName)).data("cidr", newCidr).data("startip", newStartip).data("endip", newEndip).data("ipRange", newIpRange).data("gateway", newGateway);
loadingImg.hide();
row_container.show();
},
error: function(XMLHttpResponse) {
loadingImg.hide();
row_container.show();
handleError(XMLHttpResponse);
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
});
$("#submenu_content_zones #action_add_publicip_vlan").bind("click", function(event) {
var id = $(this).data("id");
// reset dialog
dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container, #add_publicip_vlan_domain_container, #add_publicip_vlan_account_container").hide();
dialogAddVlanForZone.find("#add_publicip_vlan_tagged, #add_publicip_vlan_vlan, #add_publicip_vlan_gateway, #add_publicip_vlan_netmask, #add_publicip_vlan_startip, #add_publicip_vlan_endip, #add_publicip_vlan_account").val("");
dialogAddVlanForZone.find("#add_publicip_vlan_zone_name").text($(this).data("name"));
if (getNetworkType() == 'vnet') {
$("#add_publicip_vlan_type_container").hide();
} else {
dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").show();
dialogAddVlanForZone.find("#add_publicip_vlan_type").change();
$("#add_publicip_vlan_type_container").show();
var podSelect = dialogAddVlanForZone.find("#add_publicip_vlan_pod").empty();
$.ajax({
data: createURL("command=listPods&zoneId="+id+"&response=json"+maxPageSize),
dataType: "json",
async: false,
success: function(json) {
var pods = json.listpodsresponse.pod;
if (pods != null && pods.length > 0) {
for (var i = 0; i < pods.length; i++) {
podSelect.append("<option value='" + pods[i].id + "'>" + sanitizeXSS(pods[i].name) + "</option>");
}
} else {
podSelect.append("<option value=''>No available pods</option>");
}
}
});
var domainSelect = dialogAddVlanForZone.find("#add_publicip_vlan_domain").empty();
$.ajax({
data: createURL("command=listDomains&response=json"+maxPageSize),
dataType: "json",
async: false,
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 + "'>" + sanitizeXSS(domains[i].name) + "</option>");
}
}
}
});
}
dialogAddVlanForZone
.dialog('option', 'buttons', {
"Add": function() {
var thisDialog = $(this);
// validate values
var isValid = true;
var isTagged = false;
var isDirect = false;
if (getNetworkType() == "vlan") {
isDirect = thisDialog.find("#add_publicip_vlan_type").val() == "false";
isTagged = thisDialog.find("#add_publicip_vlan_tagged").val() == "tagged";
}
if (isDirect && isTagged)
isValid &= validateString("Account", thisDialog.find("#add_publicip_vlan_account"), thisDialog.find("#add_publicip_vlan_account_errormsg"), false); //required
else
isValid &= validateString("Account", thisDialog.find("#add_publicip_vlan_account"), thisDialog.find("#add_publicip_vlan_account_errormsg"), true); //optional
if (isTagged) {
isValid &= validateNumber("VLAN", thisDialog.find("#add_publicip_vlan_vlan"), thisDialog.find("#add_publicip_vlan_vlan_errormsg"), 2, 4095);
}
isValid &= validateIp("Gateway", thisDialog.find("#add_publicip_vlan_gateway"), thisDialog.find("#add_publicip_vlan_gateway_errormsg"));
isValid &= validateIp("Netmask", thisDialog.find("#add_publicip_vlan_netmask"), thisDialog.find("#add_publicip_vlan_netmask_errormsg"));
isValid &= validateIp("Start IP Range", thisDialog.find("#add_publicip_vlan_startip"), thisDialog.find("#add_publicip_vlan_startip_errormsg")); //required
isValid &= validateIp("End IP Range", thisDialog.find("#add_publicip_vlan_endip"), thisDialog.find("#add_publicip_vlan_endip_errormsg"), true); //optional
if (!isValid) return;
var vlan = trim(thisDialog.find("#add_publicip_vlan_vlan").val());
if (isTagged) {
vlan = "&vlan="+vlan;
} else {
vlan = "&vlan=untagged";
}
var directParams = "";
if (isDirect && isTagged) {
directParams = "&domainId="+trim(thisDialog.find("#add_publicip_vlan_domain").val())+"&account="+trim(thisDialog.find("#add_publicip_vlan_account").val());
} else if (isDirect && !isTagged) {
directParams = "&podId="+trim(thisDialog.find("#add_publicip_vlan_pod").val());
} else if (!isDirect && (dialogAddVlanForZone.find("#add_publicip_vlan_scope").val()=="account-specific")) { //public VLAN, account-specific
directParams = "&domainId="+trim(thisDialog.find("#add_publicip_vlan_domain").val())+"&account="+trim(thisDialog.find("#add_publicip_vlan_account").val());
}
var type = "true";
if (getNetworkType() == "vlan") type = trim(thisDialog.find("#add_publicip_vlan_type").val());
var gateway = trim(thisDialog.find("#add_publicip_vlan_gateway").val());
var netmask = trim(thisDialog.find("#add_publicip_vlan_netmask").val());
var startip = trim(thisDialog.find("#add_publicip_vlan_startip").val());
var endip = trim(thisDialog.find("#add_publicip_vlan_endip").val());
thisDialog.dialog("close");
var template = $("#vlan_ip_range_template").clone(true);
var loadingImg = template.find(".adding_loading");
var row_container = template.find("#row_container");
$("#zone_" + id + " #zone_content").show();
$("#zone_" + id + " #publicip_ranges_container").prepend(template.show());
$("#zone_" + id + " #zone_expand").removeClass().addClass("zonetree_openarrows");
loadingImg.show();
row_container.hide();
template.fadeIn("slow");
$.ajax({
data: createURL("command=createVlanIpRange&forVirtualNetwork="+type+"&zoneId="+id+vlan+directParams+"&gateway="+encodeURIComponent(gateway)+"&netmask="+encodeURIComponent(netmask)+"&startip="+encodeURIComponent(startip)+"&endip="+encodeURIComponent(endip)+"&response=json"),
dataType: "json",
success: function(json) {
var vlan = json.createvlaniprangeresponse;
template.attr("id", "publicip_range_"+vlan.id);
vlanIpRangeJSONToTemplate(vlan, template);
loadingImg.hide();
row_container.show();
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
template.slideUp("slow", function() {
$(this).remove();
});
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
});
$("#zone_template").bind("click", function(event) {
var template = $(this);
var target = $(event.target);
var action = target.attr("id");
var id = template.data("id");
var name = template.data("name");
switch (action) {
case "zone_expand" :
if (target.hasClass("zonetree_closedarrows")) {
$("#zone_"+id+" #zone_content").show();
target.removeClass().addClass("zonetree_openarrows");
} else {
$("#zone_"+id+" #zone_content").hide();
target.removeClass().addClass("zonetree_closedarrows");
}
break;
case "zone_name" :
$("#submenu_content_zones .zonetree_firstlevel_selected").removeClass().addClass("zonetree_firstlevel");
$("#submenu_content_zones .zonetree_secondlevel_selected").removeClass().addClass("zonetree_secondlevel");
template.find(".zonetree_firstlevel").removeClass().addClass("zonetree_firstlevel_selected");
var obj = {"id": target.data("id"), "name": target.data("name"), "dns1": target.data("dns1"), "dns2": target.data("dns2"), "internaldns1": target.data("internaldns1"), "internaldns2": target.data("internaldns2"), "vlan": target.data("vlan"), "guestcidraddress": target.data("guestcidraddress")};
zoneObjectToRightPanel(obj);
break;
case "pod_name" :
$("#submenu_content_zones .zonetree_firstlevel_selected").removeClass().addClass("zonetree_firstlevel");
$("#submenu_content_zones .zonetree_secondlevel_selected").removeClass().addClass("zonetree_secondlevel");
target.parent(".zonetree_secondlevel").removeClass().addClass("zonetree_secondlevel_selected");
var obj = {"id": target.data("id"), "zoneid": target.data("zoneid"), "name": target.data("name"), "cidr": target.data("cidr"), "startip": target.data("startip"), "endip": target.data("endip"), "ipRange": target.data("ipRange"), "gateway": target.data("gateway")};
podObjectToRightPanel(obj);
break;
case "vlan_ip_range_name" :
$("#submenu_content_zones .zonetree_firstlevel_selected").removeClass().addClass("zonetree_firstlevel");
$("#submenu_content_zones .zonetree_secondlevel_selected").removeClass().addClass("zonetree_secondlevel");
target.parent(".zonetree_secondlevel").removeClass().addClass("zonetree_secondlevel_selected");
var title = "<strong>Public VLAN IP Range</strong>";
var isDirect = target.data("forVirtualNetwork") == "false";
var isTagged = target.data("vlan") != "untagged";
if (isDirect) {
title = "<strong>Direct VLAN IP Range</strong>";
}
var rightPanelHtmlForDirect = "";
if (isDirect && isTagged) {
rightPanelHtmlForDirect = "<p><span>Domain ID:</span> "+target.data("domainId")+"</p><p><span>Account:</span> "+target.data("account")+"</p>"
} else if (isDirect && !isTagged) {
rightPanelHtmlForDirect = "<p><span>Pod:</span> "+target.data("podname")+"</p>";
}
rightPanel.html(title);
var rightContentHtml =
"<p><span>VLAN ID:</span> "+target.data("vlan")+"</p>"
+ rightPanelHtmlForDirect
+ "<p><span>Gateway:</span> "+target.data("gateway")+"</p>"
+ "<p><span>Netmask:</span> "+target.data("netmask")+"</p>"
+ "<p><span>IP Range:</span> "+target.data("name")+"</p>";
if(target.data("domain")!=null)
rightContentHtml += "<p><span>Domain:</span> "+target.data("domain")+"</p>";
if(target.data("account")!=null)
rightContentHtml += "<p><span>Account:</span> "+target.data("account")+"</p>";
rightContent.data("id", target.data("id")).html(rightContentHtml);
$("#submenu_content_zones").find("#action_edit_zone, #action_add_pod, #action_edit_pod, #action_add_publicip_vlan, #action_add_directip_vlan").hide();
$("#submenu_content_zones #action_delete").data("id", target.data("id")).data("name", target.data("name")).data("type", "publicip_range").show();
break;
default:
break;
}
return false;
});
function vlanIpRangeJSONToTemplate(json, template) {
template.data("id", json.id);
var vlanName = json.id;
var vlanDisplayName = vlanName;
if (json.description != undefined) {
if (json.description.indexOf("-") == -1) {
vlanName = json.description;
vlanDisplayName = vlanName;
} else {
var ranges = json.description.split("-");
vlanName = ranges[0] + " -" + ranges[1];
vlanDisplayName = ranges[0] + " - " + ranges[1];
}
}
var isDirect = json.forvirtualnetwork == "false";
var isTagged = json.vlan != "untagged";
if (isDirect) {
template.find(".zonetree_ipicon").removeClass().addClass("zonetree_directipicon");
template.find("#vlan_ip_range_type").text("Direct IP Range:");
}
else {
template.find("#vlan_ip_range_type").text("Public IP Range:");
}
template.find("#vlan_ip_range_name")
.html(vlanName)
.data("id", json.id)
.data("name", vlanDisplayName)
.data("vlan", json.vlan)
.data("forVirtualNetwork", json.forvirtualnetwork)
.data("gateway", json.gateway)
.data("netmask", json.netmask);
template.find("#vlan_ip_range_name").data("domainId", json.domainid); //json.domainid might be null.
template.find("#vlan_ip_range_name").data("domain", json.domain); //json.domain might be null.
template.find("#vlan_ip_range_name").data("account", json.account); //json.account might be null.
template.find("#vlan_ip_range_name").data("podname", json.podname); //json.podname might be null.
}
function getIpRange(startip, endip) {
var ipRange = "";
if (startip != null && startip.length > 0) {
ipRange = startip;
}
if (endip != null && endip.length > 0) {
ipRange = ipRange + "-" + endip;
}
return ipRange;
}
function podJSONToTemplate(json, template) {
var ipRange = getIpRange(json.startip, json.endip);
template.data("id", json.id).data("name", json.name);
var podName = template.find("#pod_name").text(json.name);
podName.data("id", json.id);
podName.data("zoneid", json.zoneid);
podName.data("name", json.name);
podName.data("cidr", json.cidr);
podName.data("startip", json.startip);
podName.data("endip", json.endip);
podName.data("ipRange", ipRange);
podName.data("gateway", json.gateway);
$.ajax({
data: createURL("command=listVlanIpRanges&zoneid="+json.zoneid+"&podid="+json.id+"&response=json"),
dataType: "json",
success: function(json) {
var ranges = json.listvlaniprangesresponse.vlaniprange;
var grid = template.find("#directip_ranges_container").empty();
if (ranges != null && ranges.length > 0) {
for (var i = 0; i < ranges.length; i++) {
if(ranges[i].forvirtualnetwork == "false" && ranges[i].vlan == "untagged") { //direct untagged VLAN should be under pod, instead of under zone.
var rangeTemplate = $("#vlan_ip_range_template").clone(true).attr("id", "publicip_range_"+ranges[i].id);
vlanIpRangeJSONToTemplate(ranges[i], rangeTemplate);
grid.append(rangeTemplate.show());
//direct untagged VLAN is under pod(2nd level). So, make direct untagged VLAN 3rd level.
rangeTemplate.find("#row_container .zonetree_secondlevel").removeClass().addClass("zonetree_thirdlevel");
}
}
}
}
});
}
function zoneJSONToTemplate(json, template) {
var zoneid = json.id;
template.data("id", zoneid).data("name", sanitizeXSS(json.name));
template.find("#zone_name")
.text(json.name)
.data("id", zoneid)
.data("name", sanitizeXSS(json.name))
.data("dns1", json.dns1)
.data("internaldns1", json.internaldns1)
.data("guestcidraddress", json.guestcidraddress);
if (json.dns2 != undefined) {
template.find("#zone_name").data("dns2", json.dns2);
}
if (json.internaldns2 != undefined) {
template.find("#zone_name").data("internaldns2", json.internaldns2);
}
if (json.vlan != undefined) {
template.find("#zone_name").data("vlan", json.vlan);
}
$.ajax({
data: createURL("command=listPods&zoneid="+zoneid+"&response=json"),
dataType: "json",
success: function(json) {
var pods = json.listpodsresponse.pod;
var grid = template.find("#pods_container").empty();
if (pods != null && pods.length > 0) {
for (var i = 0; i < pods.length; i++) {
var podTemplate = $("#pod_template").clone(true).attr("id", "pod_"+pods[i].id);
podJSONToTemplate(pods[i], podTemplate);
grid.append(podTemplate.show());
forceLogout = false;
}
}
}
});
$.ajax({
data: createURL("command=listVlanIpRanges&zoneId="+zoneid+"&response=json"),
dataType: "json",
success: function(json) {
var ranges = json.listvlaniprangesresponse.vlaniprange;
var grid = template.find("#publicip_ranges_container").empty();
if (ranges != null && ranges.length > 0) {
for (var i = 0; i < ranges.length; i++) {
if(ranges[i].forvirtualnetwork == "false" && ranges[i].vlan == "untagged") //direct untagged VLAN should be under pod, instead of under zone.
continue;
var rangeTemplate = $("#vlan_ip_range_template").clone(true).attr("id", "publicip_range_"+ranges[i].id);
vlanIpRangeJSONToTemplate(ranges[i], rangeTemplate);
grid.append(rangeTemplate.show());
}
}
}
});
}
// If the network type is vnet, don't show any vlan stuff.
if (getNetworkType() == "vnet") {
$("#action_add_publicip_vlan").removeClass().addClass("zonedetails_addpublicipbutton");
$("#dialog_add_vlan_for_zone").attr("title", "Add Public IP Range");
$("#dialog_edit_zone #edit_zone_container, #dialog_add_zone #add_zone_container").hide();
}
activateDialog($("#dialog_add_zone").dialog({
autoOpen: false,
modal: true,
zIndex: 2000
}));
activateDialog($("#dialog_edit_zone").dialog({
autoOpen: false,
modal: true,
zIndex: 2000
}));
activateDialog($("#dialog_add_pod").dialog({
autoOpen: false,
modal: true,
width:320,
zIndex: 2000
}));
activateDialog($("#dialog_edit_pod").dialog({
autoOpen: false,
width: 320,
modal: true,
zIndex: 2000
}));
activateDialog($("#dialog_add_vlan_for_zone").dialog({
autoOpen: false,
modal: true,
zIndex: 2000
}));
activateDialog($("#dialog_add_vlan_for_pod").dialog({
autoOpen: false,
modal: true,
zIndex: 2000
}));
//direct VLAN shows only "tagged" option while public VLAN shows both "tagged" and "untagged" option.
var dialogAddVlanForZone = $("#dialog_add_vlan_for_zone");
dialogAddVlanForZone.find("#add_publicip_vlan_type").change(function(event) {
var addPublicipVlanTagged = dialogAddVlanForZone.find("#add_publicip_vlan_tagged").empty();
if ($(this).val() == "false") { //direct VLAN (only tagged option)
dialogAddVlanForZone.find("#add_publicip_vlan_scope_container").hide();
addPublicipVlanTagged.append('<option value="tagged">tagged</option>');
dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container").show();
dialogAddVlanForZone.find("#add_publicip_vlan_domain_container").show();
dialogAddVlanForZone.find("#add_publicip_vlan_account_container").show();
dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").hide();
} else { //public VLAN
dialogAddVlanForZone.find("#add_publicip_vlan_scope_container").show();
// default value of "#add_publicip_vlan_scope" is "zone-wide". Calling change() will hide "#add_publicip_vlan_domain_container", "#add_publicip_vlan_account_container".
dialogAddVlanForZone.find("#add_publicip_vlan_scope").change();
addPublicipVlanTagged.append('<option value="untagged">untagged</option>').append('<option value="tagged">tagged</option>');
if (dialogAddVlanForZone.find("#add_publicip_vlan_tagged") == "tagged") {
dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container").show();
dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").hide();
} else {
dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container").hide();
dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").hide();
}
}
return false;
});
if (getNetworkType() != "vnet") {
dialogAddVlanForZone.find("#add_publicip_vlan_tagged").change(function(event) {
if (dialogAddVlanForZone.find("#add_publicip_vlan_type").val() == "false") { //direct VLAN (only tagged option)
dialogAddVlanForZone.find("#add_publicip_vlan_scope_container").hide();
dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container").show();
dialogAddVlanForZone.find("#add_publicip_vlan_domain_container").show();
dialogAddVlanForZone.find("#add_publicip_vlan_account_container").show();
dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").hide();
} else { //public VLAN
dialogAddVlanForZone.find("#add_publicip_vlan_scope_container").show();
// default value of "#add_publicip_vlan_scope" is "zone-wide". Calling change() will hide "#add_publicip_vlan_domain_container", "#add_publicip_vlan_account_container".
dialogAddVlanForZone.find("#add_publicip_vlan_scope").change();
if ($(this).val() == "tagged") {
dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container").show();
dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").hide();
} else {
dialogAddVlanForZone.find("#add_publicip_vlan_vlan_container").hide();
dialogAddVlanForZone.find("#add_publicip_vlan_pod_container").hide();
}
}
return false;
});
} else {
dialogAddVlanForZone.find("#add_publicip_vlan_container").hide();
}
dialogAddVlanForZone.find("#add_publicip_vlan_scope").change(function(event) {
if($(this).val() == "zone-wide") {
dialogAddVlanForZone.find("#add_publicip_vlan_domain_container").hide();
dialogAddVlanForZone.find("#add_publicip_vlan_account_container").hide();
} else { // account-specific
dialogAddVlanForZone.find("#add_publicip_vlan_domain_container").show();
dialogAddVlanForZone.find("#add_publicip_vlan_account_container").show();
}
return false;
});
$("#action_add_zone").bind("click", function(event) {
var thisDialog = $(this);
thisDialog.find("#add_zone_name, #add_zone_dns1, #add_zone_dns2, #add_zone_internaldns1, #add_zone_internaldns2, #add_zone_startvlan, #add_zone_endvlan, #add_zone_guestcidraddress").val("");
$("#dialog_add_zone")
.dialog('option', 'buttons', {
"Add": function() {
var thisDialog = $(this);
// validate values
var isValid = true;
isValid &= validateString("Name", thisDialog.find("#add_zone_name"), thisDialog.find("#add_zone_name_errormsg"));
isValid &= validateIp("DNS 1", thisDialog.find("#add_zone_dns1"), thisDialog.find("#add_zone_dns1_errormsg"), false); //required
isValid &= validateIp("DNS 2", thisDialog.find("#add_zone_dns2"), thisDialog.find("#add_zone_dns2_errormsg"), true); //optional
isValid &= validateIp("Internal DNS 1", thisDialog.find("#add_zone_internaldns1"), thisDialog.find("#add_zone_internaldns1_errormsg"), false); //required
isValid &= validateIp("Internal DNS 2", thisDialog.find("#add_zone_internaldns2"), thisDialog.find("#add_zone_internaldns2_errormsg"), true); //optional
if (getNetworkType() != "vnet") {
isValid &= validateString("Zone - Start VLAN Range", thisDialog.find("#add_zone_startvlan"), thisDialog.find("#add_zone_startvlan_errormsg"), false); //required
isValid &= validateString("Zone - End VLAN Range", thisDialog.find("#add_zone_endvlan"), thisDialog.find("#add_zone_endvlan_errormsg"), true); //optional
}
isValid &= validateCIDR("Guest CIDR", thisDialog.find("#add_zone_guestcidraddress"), thisDialog.find("#add_zone_guestcidraddress_errormsg"), false); //required
if (!isValid) return;
var moreCriteria = [];
var name = trim(thisDialog.find("#add_zone_name").val());
moreCriteria.push("&name="+encodeURIComponent(name));
var dns1 = trim(thisDialog.find("#add_zone_dns1").val());
moreCriteria.push("&dns1="+encodeURIComponent(dns1));
var dns2 = trim(thisDialog.find("#add_zone_dns2").val());
if (dns2 != null && dns2.length > 0)
moreCriteria.push("&dns2="+encodeURIComponent(dns2));
var internaldns1 = trim(thisDialog.find("#add_zone_internaldns1").val());
moreCriteria.push("&internaldns1="+encodeURIComponent(internaldns1));
var internaldns2 = trim(thisDialog.find("#add_zone_internaldns2").val());
if (internaldns2 != null && internaldns2.length > 0)
moreCriteria.push("&internaldns2="+encodeURIComponent(internaldns2));
if (getNetworkType() != "vnet") {
var vlanStart = trim(thisDialog.find("#add_zone_startvlan").val());
var vlanEnd = trim(thisDialog.find("#add_zone_endvlan").val());
if (vlanEnd != null && vlanEnd.length > 0)
moreCriteria.push("&vlan=" + encodeURIComponent(vlanStart + "-" + vlanEnd));
else
moreCriteria.push("&vlan=" + encodeURIComponent(vlanStart));
}
var guestcidraddress = trim(thisDialog.find("#add_zone_guestcidraddress").val());
moreCriteria.push("&guestcidraddress="+encodeURIComponent(guestcidraddress));
thisDialog.dialog("close");
var template = $("#zone_template").clone(true);
var loadingImg = template.find(".adding_loading");
var row_container = template.find("#row_container");
$("#submenu_content_zones #zones_container").prepend(template.show());
loadingImg.show();
row_container.hide();
template.fadeIn("slow");
$.ajax({
data: createURL("command=createZone"+moreCriteria.join("")+"&response=json"),
dataType: "json",
success: function(json) {
var zone = json.createzoneresponse;
template.attr("id", "zone_"+zone.id);
zoneJSONToTemplate(zone, template);
loadingImg.hide();
row_container.show();
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
template.slideUp("slow", function() {
thisDialog.remove();
});
}
});
},
"Cancel": function() {
var thisDialog = $(this);
thisDialog.dialog("close");
cleanErrMsg(thisDialog.find("#add_zone_name"), thisDialog.find("#add_zone_name_errormsg"));
cleanErrMsg(thisDialog.find("#add_zone_dns1"), thisDialog.find("#add_zone_dns1_errormsg"));
cleanErrMsg(thisDialog.find("#add_zone_dns2"), thisDialog.find("#add_zone_dns2_errormsg"));
cleanErrMsg(thisDialog.find("#add_zone_internaldns1"), thisDialog.find("#add_zone_internaldns1_errormsg"));
cleanErrMsg(thisDialog.find("#add_zone_internaldns2"), thisDialog.find("#add_zone_internaldns2_errormsg"));
cleanErrMsg(thisDialog.find("#add_zone_startvlan"), thisDialog.find("#add_zone_startvlan_errormsg"));
cleanErrMsg(thisDialog.find("#add_zone_guestcidraddress"), thisDialog.find("#add_zone_guestcidraddress_errormsg"));
}
}).dialog("open");
});
$("#submenu_zones").bind("click", function(event) {
event.preventDefault();
$(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off");
currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on");
currentSubMenu = $(this);
var container = $("#submenu_content_zones").show();
$("#submenu_content_global, #submenu_content_service, #submenu_content_disk").hide();
clearRightPanel();
$.ajax({
data: createURL("command=listZones&available=true&response=json"+maxPageSize),
dataType: "json",
success: function(json) {
var zones = json.listzonesresponse.zone;
var grid = $("#submenu_content_zones #zones_container").empty();
if (zones != null && zones.length > 0) {
for (var i = 0; i < zones.length; i++) {
var template = $("#zone_template").clone(true).attr("id", "zone_"+zones[i].id);
zoneJSONToTemplate(zones[i], template);
grid.append(template.show());
}
}
}
});
});
$("#service_template").bind("click", function(event) {
var template = $(this);
var link = $(event.target);
var linkAction = link.attr("id");
var svcId = template.data("svcId");
var svcName = template.data("svcName");
var submenuContent = $("#submenu_content_service");
switch (linkAction) {
case "service_action_edit" :
var dialogEditService = $("#dialog_edit_service");
dialogEditService.find("#service_name").text(svcName);
dialogEditService.find("#edit_service_name").val(svcName);
dialogEditService.find("#edit_service_display").val(template.find("#service_display").text());
dialogEditService.find("#edit_service_offerha").val(toBooleanValue(template.find("#service_offerha").text()));
dialogEditService
.dialog('option', 'buttons', {
"Confirm": function() {
var thisDialog = $(this);
// validate values
var isValid = true;
isValid &= validateString("Name", thisDialog.find("#edit_service_name"), thisDialog.find("#edit_service_name_errormsg"));
isValid &= validateString("Display Text", thisDialog.find("#edit_service_display"), thisDialog.find("#edit_service_display_errormsg"));
if (!isValid) return;
var moreCriteria = [];
var name = trim(thisDialog.find("#edit_service_name").val());
moreCriteria.push("&name="+encodeURIComponent(name));
var displaytext = trim(thisDialog.find("#edit_service_display").val());
moreCriteria.push("&displayText="+encodeURIComponent(displaytext));
var offerha = trim(thisDialog.find("#edit_service_offerha").val());
moreCriteria.push("&offerha="+offerha);
thisDialog.dialog("close");
$.ajax({
data: createURL("command=updateServiceOffering&id="+svcId+moreCriteria.join("")+"&response=json"),
dataType: "json",
success: function(json) {
template.find("#service_displaytext").text(displaytext);
template.find("#service_name").text(name);
template.find("#service_offerha").text(toBooleanText(offerha));
template.data("svcName", name);
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
break;
case "service_action_delete" :
$("#dialog_confirmation")
.html("<p>Please confirm you want to remove the service offering: <b>"+svcName+"</b> from the management server. </p>")
.dialog('option', 'buttons', {
"Confirm": function() {
var dialogBox = $(this);
$.ajax({
data: createURL("command=deleteServiceOffering&id="+svcId+"&response=json"),
dataType: "json",
success: function(json) {
dialogBox.dialog("close");
template.slideUp("slow", function() {
$(this).remove();
changeGridRowsTotal(submenuContent.find("#grid_rows_total"), -1);
});
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
break;
default :
break;
}
return false;
});
function serviceJSONToTemplate(json, template) {
template.attr("id", "service_"+json.id);
(index++ % 2 == 0)? template.addClass("smallrow_even"): template.addClass("smallrow_odd");
template.data("svcId", json.id).data("svcName", sanitizeXSS(json.name));
template.find("#service_id").text(json.id);
template.find("#service_name").text(json.name);
template.find("#service_displaytext").text(json.displaytext);
template.find("#service_storagetype").text(json.storagetype);
template.find("#service_cpu").text(json.cpunumber + " x " + convertHz(json.cpuspeed));
template.find("#service_memory").text(convertBytes(parseInt(json.memory)*1024*1024));
template.find("#service_offerha").text(toBooleanText(json.offerha));
template.find("#service_networktype").text(toNetworkType(json.usevirtualnetwork));
template.find("#service_tags").text(json.tags);
setDateField(json.created, template.find("#service_created"));
}
$("#submenu_content_service .grid_container .grid_header .grid_genheader_cell").bind("click", function(event) {
var headerColumn = $(this);
var sortingIcon = headerColumn.find(".gridsorting_arrow");
if (sortingIcon.hasClass("up") == false) { //If it's not in ascending order, sort it ascending.
$("#submenu_content_service .grid_container .grid_header .grid_genheader_cell .gridsorting_arrow").removeClass("down up"); //remove arrow from all header columns first
sortingIcon.addClass("up"); //add up arrow to this specific header column
sortingOrder = "asc";
}
else if (sortingIcon.hasClass("up") == true) { //If it's in ascending order, sort it descending.
$("#submenu_content_service .grid_container .grid_header .grid_genheader_cell .gridsorting_arrow").removeClass("down up"); //remove arrow from all header columns first
sortingIcon.addClass("down"); //add down arrow to this specific header column
sortingOrder = "desc";
}
switch(headerColumn[0].id) {
case "id_header":
sortBy = "id";
items.sort(sortArrayNumerically);
break;
case "name_header":
sortBy = "name";
items.sort(sortArrayAlphabetically);
break;
case "displaytext_header":
sortBy = "displaytext";
items.sort(sortArrayAlphabetically);
break;
case "storagetype_header":
sortBy = "storagetype";
items.sort(sortArrayAlphabetically);
break;
case "cpu_header":
//sortBy = "???";
//items.sort(sortArray???);
break;
case "memory_header":
sortBy = "memory";
parseFunction = parseInt;
items.sort(sortArrayNumericallyParse);
break;
case "offerha_header":
sortBy = "offerha";
parseFunction = toBooleanText;
items.sort(sortArrayAlphabetically);
break;
case "networktype_header":
sortBy = "usevirtualnetwork";
parseFunction = toNetworkType;
items.sort(sortArrayAlphabeticallyParse);
break;
case "tags_header":
sortBy = "tags";
items.sort(sortArrayAlphabetically);
break;
case "created_header":
sortBy = "created";
items.sort(sortArrayByDate);
break;
}
drawGrid(items, $("#submenu_content_service"), $("#service_template"), serviceJSONToTemplate);
return false;
});
activateDialog($("#dialog_add_service").dialog({
autoOpen: false,
modal: true,
zIndex: 2000
}));
activateDialog($("#dialog_edit_service").dialog({
autoOpen: false,
modal: true,
zIndex: 2000
}));
activateDialog($("#dialog_edit_disk").dialog({
autoOpen: false,
modal: true,
zIndex: 2000
}));
$("#service_add_service").bind("click", function(event) {
var dialogAddService = $("#dialog_add_service");
dialogAddService.find("#add_service_name").val("");
dialogAddService.find("#add_service_display").val("");
dialogAddService.find("#add_service_cpucore").val("");
dialogAddService.find("#add_service_cpu").val("");
dialogAddService.find("#add_service_memory").val("");
dialogAddService.find("#add_service_offerha").val("false");
(g_hypervisorType == "kvm")? dialogAddService.find("#add_service_offerha_container").hide():dialogAddService.find("#add_service_offerha_container").show();
var submenuContent = $("#submenu_content_service");
dialogAddService
.dialog('option', 'buttons', {
"Add": function() {
var thisDialog = $(this);
// validate values
var isValid = true;
isValid &= validateString("Name", thisDialog.find("#add_service_name"), thisDialog.find("#add_service_name_errormsg"));
isValid &= validateString("Display Text", thisDialog.find("#add_service_display"), thisDialog.find("#add_service_display_errormsg"));
isValid &= validateNumber("# of CPU Core", thisDialog.find("#add_service_cpucore"), thisDialog.find("#add_service_cpucore_errormsg"), 1, 1000);
isValid &= validateNumber("CPU", thisDialog.find("#add_service_cpu"), thisDialog.find("#add_service_cpu_errormsg"), 100, 100000);
isValid &= validateNumber("Memory", thisDialog.find("#add_service_memory"), thisDialog.find("#add_service_memory_errormsg"), 64, 1000000);
isValid &= validateString("Tags", thisDialog.find("#add_service_tags"), thisDialog.find("#add_service_tags_errormsg"), true); //optional
if (!isValid) return;
var submenuContent = $("#submenu_content_service");
var template = $("#service_template").clone(true);
var loadingImg = template.find(".adding_loading");
var rowContainer = template.find("#row_container");
loadingImg.find(".adding_text").text("Adding....");
loadingImg.show();
rowContainer.hide();
submenuContent.find("#grid_content").prepend(template.fadeIn("slow"));
var array1 = [];
var name = trim(thisDialog.find("#add_service_name").val());
array1.push("&name="+encodeURIComponent(name));
var display = trim(thisDialog.find("#add_service_display").val());
array1.push("&displayText="+encodeURIComponent(display));
var storagetype = trim(thisDialog.find("#add_service_storagetype").val());
array1.push("&storageType="+storagetype);
var core = trim(thisDialog.find("#add_service_cpucore").val());
array1.push("&cpuNumber="+core);
var cpu = trim(thisDialog.find("#add_service_cpu").val());
array1.push("&cpuSpeed="+cpu);
var memory = trim(thisDialog.find("#add_service_memory").val());
array1.push("&memory="+memory);
var offerha = thisDialog.find("#add_service_offerha").val();
array1.push("&offerha="+offerha);
var networkType = thisDialog.find("#add_service_networktype").val();
var useVirtualNetwork = (networkType=="direct")? false:true;
array1.push("&usevirtualnetwork="+useVirtualNetwork);
var tags = trim(thisDialog.find("#add_service_tags").val());
if(tags != null && tags.length > 0)
array1.push("&tags="+encodeURIComponent(tags));
thisDialog.dialog("close");
$.ajax({
data: createURL("command=createServiceOffering"+array1.join("")+"&response=json"),
dataType: "json",
success: function(json) {
var offering = json.createserviceofferingresponse;
serviceJSONToTemplate(offering, template);
changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1);
loadingImg.hide();
rowContainer.show();
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
template.slideUp("slow", function(){ $(this).remove(); } );
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
return false;
});
//add a new disk offering
activateDialog($("#dialog_add_disk").dialog({
autoOpen: false,
modal: true,
zIndex: 2000
}));
$("#disk_add_disk").bind("click", function(event) {
var dialogAddDisk = $("#dialog_add_disk");
dialogAddDisk.find("#disk_name").val("");
dialogAddDisk.find("#disk_description").val("");
dialogAddDisk.find("#disk_disksize").val("");
var submenuContent = $("#submenu_content_disk");
dialogAddDisk
.dialog('option', 'buttons', {
"Add": function() {
var thisDialog = $(this);
// validate values
var isValid = true;
isValid &= validateString("Name", thisDialog.find("#add_disk_name"), thisDialog.find("#add_disk_name_errormsg"));
isValid &= validateString("Description", thisDialog.find("#add_disk_description"), thisDialog.find("#add_disk_description_errormsg"));
isValid &= validateNumber("Disk size", thisDialog.find("#add_disk_disksize"), thisDialog.find("#add_disk_disksize_errormsg"), 1, null);
isValid &= validateString("Tags", thisDialog.find("#add_disk_tags"), thisDialog.find("#add_disk_tags_errormsg"), true); //optional
if (!isValid) return;
var submenuContent = $("#submenu_content_disk");
var template = $("#disk_template").clone(true);
var loadingImg = template.find(".adding_loading");
var rowContainer = template.find("#row_container");
loadingImg.find(".adding_text").text("Adding....");
loadingImg.show();
rowContainer.hide();
submenuContent.find("#grid_content").prepend(template.fadeIn("slow"));
var array1 = [];
var name = trim(thisDialog.find("#add_disk_name").val());
array1.push("&name="+encodeURIComponent(name));
var description = trim(thisDialog.find("#add_disk_description").val());
array1.push("&displaytext="+encodeURIComponent(description));
var disksize = trim(thisDialog.find("#add_disk_disksize").val());
array1.push("&disksize="+disksize);
var tags = trim(thisDialog.find("#add_disk_tags").val());
if(tags != null && tags.length > 0)
array1.push("&tags="+encodeURIComponent(tags));
thisDialog.dialog("close");
$.ajax({
data: createURL("command=createDiskOffering&isMirrored=false&response=json" + array1.join("")),
dataType: "json",
success: function(json) {
var offering = json.creatediskofferingresponse;
diskJSONToTemplate(offering, template);
changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1);
loadingImg.hide();
rowContainer.show();
},
error: function(XMLHttpResponse) {
handleError(XMLHttpResponse);
template.slideUp("slow", function(){ $(this).remove(); } );
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
return false;
});
function listServiceOfferings() {
var submenuContent = $("#submenu_content_service");
var commandString;
var advanced = submenuContent.find("#search_button").data("advanced");
if (advanced != null && advanced) {
var name = submenuContent.find("#advanced_search #adv_search_name").val();
var moreCriteria = [];
if (name!=null && trim(name).length > 0)
moreCriteria.push("&name="+encodeURIComponent(trim(name)));
commandString = "command=listServiceOfferings&page="+currentPage+moreCriteria.join("")+"&response=json";
} else {
var searchInput = submenuContent.find("#search_input").val();
if (searchInput != null && searchInput.length > 0)
commandString = "command=listServiceOfferings&page="+currentPage +"&keyword="+searchInput+"&response=json";
else
commandString = "command=listServiceOfferings&page="+currentPage+"&response=json";
}
//listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate);
listItems(submenuContent, commandString, "listserviceofferingsresponse", "serviceoffering", $("#service_template"), serviceJSONToTemplate);
}
submenuContentEventBinder($("#submenu_content_service"), listServiceOfferings);
$("#submenu_service").bind("click", function(event) {
event.preventDefault();
$(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off");
currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on");
currentSubMenu = $(this);
var submenuContent = $("#submenu_content_service").show();
$("#submenu_content_zones, #submenu_content_global, #submenu_content_disk").hide();
currentPage = 1;
listServiceOfferings();
});
//Disk Offering
$("#disk_template").bind("click", function(event) {
var template = $(this);
var link = $(event.target);
var linkAction = link.attr("id");
var diskId = template.data("diskId");
var diskName = template.data("diskName");
var submenuContent = $("#submenu_content_disk");
switch (linkAction) {
case "disk_action_edit" :
var dialogEditDisk = $("#dialog_edit_disk");
dialogEditDisk.find("#edit_disk_name").val(template.find("#disk_name").text());
dialogEditDisk.find("#edit_disk_display").val(template.find("#disk_description").text());
dialogEditDisk
.dialog('option', 'buttons', {
"Confirm": function() {
// validate values
var isValid = true;
isValid &= validateString("Name", dialogEditDisk.find("#edit_disk_name"), dialogEditDisk.find("#edit_disk_name_errormsg"));
isValid &= validateString("Display Text", dialogEditDisk.find("#edit_disk_display"), dialogEditDisk.find("#edit_disk_display_errormsg"));
if (!isValid) return;
var name = trim(dialogEditDisk.find("#edit_disk_name").val());
var display = trim(dialogEditDisk.find("#edit_disk_display").val());
var dialogBox = $(this);
dialogBox.dialog("close");
$.ajax({
data: createURL("command=updateDiskOffering&name="+encodeURIComponent(name)+"&displayText="+encodeURIComponent(display)+"&id="+diskId+"&response=json"),
dataType: "json",
success: function(json) {
template.find("#disk_description").text(display);
template.find("#disk_name").text(name);
template.data("diskName", name);
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
break;
case "disk_action_delete" :
$("#dialog_confirmation")
.html("<p>Please confirm you want to remove the disk offering: <b>"+diskName+"</b> from the management server. </p>")
.dialog('option', 'buttons', {
"Confirm": function() {
var dialogBox = $(this);
$.ajax({
data: createURL("command=deleteDiskOffering&id="+diskId+"&response=json"),
dataType: "json",
success: function(json) {
dialogBox.dialog("close");
template.slideUp("slow", function() {
$(this).remove();
changeGridRowsTotal(submenuContent.find("#grid_rows_total"), -1);
});
}
});
},
"Cancel": function() {
$(this).dialog("close");
}
}).dialog("open");
break;
default :
break;
}
return false;
});
function diskJSONToTemplate(json, template) {
template.attr("id", "disk_"+json.id);
if (index++ % 2 == 0) {
template.addClass("smallrow_even");
} else {
template.addClass("smallrow_odd");
}
template.data("diskId", json.id).data("diskName", sanitizeXSS(json.name));
template.find("#disk_id").text(json.id);
template.find("#disk_name").text(json.name);
template.find("#disk_description").text(json.displaytext);
template.find("#disk_disksize").text(convertBytes(json.disksize));
template.find("#disk_tags").text(json.tags);
template.find("#disk_domain").text(json.domain);
template.find("#disk_ismirrored").text(json.ismirrored);
}
function listDiskOfferings() {
var submenuContent = $("#submenu_content_disk");
var commandString;
var advanced = submenuContent.find("#search_button").data("advanced");
if (advanced != null && advanced) {
var name = submenuContent.find("#advanced_search #adv_search_name").val();
var moreCriteria = [];
if (name!=null && trim(name).length > 0)
moreCriteria.push("&name="+encodeURIComponent(trim(name)));
commandString = "command=listDiskOfferings&page="+currentPage+moreCriteria.join("")+"&response=json"; //moreCriteria.join("")
} else {
var searchInput = submenuContent.find("#search_input").val();
if (searchInput != null && searchInput.length > 0)
commandString = "command=listDiskOfferings&page="+currentPage+"&keyword="+searchInput+"&response=json";
else
commandString = "command=listDiskOfferings&page="+currentPage+"&response=json";
}
//listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate);
listItems(submenuContent, commandString, "listdiskofferingsresponse", "diskoffering", $("#disk_template"), diskJSONToTemplate);
}
submenuContentEventBinder($("#submenu_content_disk"), listDiskOfferings);
$("#submenu_disk").bind("click", function(event) {
event.preventDefault();
$(this).toggleClass("submenu_links_on").toggleClass("submenu_links_off");
currentSubMenu.toggleClass("submenu_links_off").toggleClass("submenu_links_on");
currentSubMenu = $(this);
var submenuContent = $("#submenu_content_disk").show();
$("#submenu_content_zones, #submenu_content_service, #submenu_content_global").hide();
currentPage=1;
listDiskOfferings();
});
$("#submenu_global").click();
}