diff --git a/ui/css/main.css b/ui/css/main.css index 0789854041b..7b3962db9fd 100644 --- a/ui/css/main.css +++ b/ui/css/main.css @@ -1293,7 +1293,7 @@ a:hover.vm_create_close { border-bottom:2px solid #b1b1b1; margin:0; padding:0; - z-index:1004; + z-index:30000; } .adv_searchformbox { diff --git a/ui/scripts/cloud.core.ipaddress.js b/ui/scripts/cloud.core.ipaddress.js new file mode 100644 index 00000000000..889bd34f310 --- /dev/null +++ b/ui/scripts/cloud.core.ipaddress.js @@ -0,0 +1,1952 @@ + /** + * 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 ipGetSearchParams() { + 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") { + var domainId = $advancedSearchPopup.find("#adv_search_domain").val(); + if (domainId!=null && domainId.length > 0) + moreCriteria.push("&domainid="+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 afterLoadIpJSP() { + //***** switch between different tabs (begin) ******************************************************************** + var tabArray = [$("#tab_details"), $("#tab_port_range"), $("#tab_port_forwarding"), $("#tab_load_balancer"), $("#tab_vpn")]; + var tabContentArray = [$("#tab_content_details"), $("#tab_content_port_range"), $("#tab_content_port_forwarding"), $("#tab_content_load_balancer"), $("#tab_content_vpn")]; + var afterSwitchFnArray = [ipJsonToDetailsTab, ipJsonToPortRangeTab, ipJsonToPortForwardingTab, ipJsonToLoadBalancerTab, ipJsonToVPNTab]; + switchBetweenDifferentTabs(tabArray, tabContentArray, afterSwitchFnArray); + //***** switch between different tabs (end) ********************************************************************** + + //dialogs + initDialog("dialog_acquire_public_ip", 325); + initDialog("dialog_enable_vpn"); + initDialog("dialog_disable_vpn"); + initDialog("dialog_add_vpnuser"); + initDialog("dialog_confirmation_remove_vpnuser"); + initDialog("dialog_enable_static_NAT"); + + //*** Acquire New IP (begin) *** + $.ajax({ + data: createURL("command=listZones&available=true"), + dataType: "json", + success: function(json) { + var zones = json.listzonesresponse.zone; + var zoneSelect = $("#dialog_acquire_public_ip #acquire_zone").empty(); + if (zones != null && zones.length > 0) { + for (var i = 0; i < zones.length; i++) { + zoneSelect.append(""); + } + } + } + }); + + $("#acquire_new_ip_button").unbind("click").bind("click", function(event) { + var submenuContent = $("#submenu_content_network"); + $("#dialog_acquire_public_ip").dialog('option', 'buttons', { + "Acquire": function() { + var thisDialog = $(this); + thisDialog.dialog("close"); + + var zoneid = thisDialog.find("#acquire_zone").val(); + + var $midmenuItem1 = beforeAddingMidMenuItem() ; + + $.ajax({ + data: createURL("command=associateIpAddress&zoneid="+zoneid), + dataType: "json", + success: function(json) { + var jobId = json.associateipaddressresponse.jobid; + var timerKey = "associateIpJob_"+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 + ipToMidmenu(result.jobresult.ipaddress, $midmenuItem1); + bindClickToMidMenu($midmenuItem1, ipToRightPanel, ipGetMidmenuId); + afterAddingMidMenuItem($midmenuItem1, true); + } else if (result.jobstatus == 2) { + 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; + }); + //*** Acquire New IP (end) *** + + //*** Port Range tab (begin) *** + var $createPortRangeRow = $("#tab_content_port_range").find("#create_port_range_row"); + + $createPortRangeRow.find("#add_link").bind("click", function(event){ + var isValid = true; + isValid &= validateInteger("Start Port", $createPortRangeRow.find("#start_port"), $createPortRangeRow.find("#start_port_errormsg"), 1, 65535); + isValid &= validateInteger("End Port", $createPortRangeRow.find("#end_port"), $createPortRangeRow.find("#end_port_errormsg"), 1, 65535); + if (!isValid) + return; + + var $template = $("#port_range_template").clone(); + $("#tab_content_port_range #grid_content").append($template.show()); + + var $spinningWheel = $template.find("#row_container").find("#spinning_wheel"); + $spinningWheel.find("#description").text(g_dictionary["label.adding.processing"]); + $spinningWheel.show(); + + var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); + var ipObj = $midmenuItem1.data("jsonObj"); + + var startPort = $createPortRangeRow.find("#start_port").val(); + var endPort = $createPortRangeRow.find("#end_port").val(); + var protocol = $createPortRangeRow.find("#protocol").val(); + + var array1 = []; + array1.push("&ipaddressid="+ipObj.id); + array1.push("&startPort="+startPort); + array1.push("&endPort="+endPort); + array1.push("&protocol="+protocol); + + $.ajax({ + data: createURL("command=createIpForwardingRule"+array1.join("")), + dataType: "json", + success: function(json) { + var jobId = json.createipforwardingruleresponse.jobid; + var timerKey = "asyncJob_" + jobId; + $("body").everyTime( + 10000, + timerKey, + function() { + $.ajax({ + data: createURL("command=queryAsyncJobResult&jobId="+jobId), + dataType: "json", + success: function(json) { + var result = json.queryasyncjobresultresponse; + if (result.jobstatus == 0) { + return; //Job has not completed + } else { + $("body").stopTime(timerKey); + $spinningWheel.hide(); + if (result.jobstatus == 1) { // Succeeded + var item = json.queryasyncjobresultresponse.jobresult.ipforwardingrule; + portRangeJsonToTemplate(item, $template); + $spinningWheel.hide(); + refreshCreatePortRangeRow(); + } else if (result.jobstatus == 2) { // Failed + $template.slideUp("slow", function() { + $(this).remove(); + }); + //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); + $("#dialog_error").text(errorMsg).dialog("open"); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + handleError(XMLHttpResponse, function() { + $template.slideUp("slow", function() { + $(this).remove(); + }); + var errorMsg = parseXMLHttpResponse(XMLHttpResponse); + $("#dialog_error").text(fromdb(errorMsg)).dialog("open"); + }); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + handleError(XMLHttpResponse, function() { + $template.slideUp("slow", function() { + $(this).remove(); + }); + var errorMsg = parseXMLHttpResponse(XMLHttpResponse); + $("#dialog_error").text(fromdb(errorMsg)).dialog("open"); + }); + } + }); + + return false; + }); + //*** Port Range tab (end) *** + + //*** Port Forwarding tab (begin) *** + var $createPortForwardingRow = $("#tab_content_port_forwarding").find("#create_port_forwarding_row"); + + $createPortForwardingRow.find("#add_link").bind("click", function(event){ + var isValid = true; + isValid &= validateDropDownBox("Instance", $createPortForwardingRow.find("#vm"), $createPortForwardingRow.find("#vm_errormsg")); + isValid &= validateInteger("Public Port", $createPortForwardingRow.find("#public_port"), $createPortForwardingRow.find("#public_port_errormsg"), 1, 65535); + isValid &= validateInteger("Private Port", $createPortForwardingRow.find("#private_port"), $createPortForwardingRow.find("#private_port_errormsg"), 1, 65535); + if (!isValid) + return; + + var $template = $("#port_forwarding_template").clone(); + $("#tab_content_port_forwarding #grid_content").append($template.show()); + + var $spinningWheel = $template.find("#row_container").find("#spinning_wheel"); + $spinningWheel.find("#description").text(g_dictionary["label.adding.processing"]); + $spinningWheel.show(); + + var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); + var ipObj = $midmenuItem1.data("jsonObj"); + + var publicPort = $createPortForwardingRow.find("#public_port").val(); + var privatePort = $createPortForwardingRow.find("#private_port").val(); + var protocol = $createPortForwardingRow.find("#protocol").val(); + var virtualMachineId = $createPortForwardingRow.find("#vm").val(); + + var array1 = []; + array1.push("&ipaddressid="+ipObj.id); + array1.push("&publicport="+publicPort); + array1.push("&privateport="+privatePort); + array1.push("&protocol="+protocol); + array1.push("&virtualmachineid=" + virtualMachineId); + + $.ajax({ + data: createURL("command=createPortForwardingRule"+array1.join("")), + dataType: "json", + success: function(json) { + var jobId = json.createportforwardingruleresponse.jobid; + var timerKey = "asyncJob_" + jobId; + $("body").everyTime( + 10000, + timerKey, + function() { + $.ajax({ + data: createURL("command=queryAsyncJobResult&jobId="+jobId), + dataType: "json", + success: function(json) { + var result = json.queryasyncjobresultresponse; + if (result.jobstatus == 0) { + return; //Job has not completed + } else { + $("body").stopTime(timerKey); + $spinningWheel.hide(); + if (result.jobstatus == 1) { // Succeeded + var item = json.queryasyncjobresultresponse.jobresult.portforwardingrule; + portForwardingJsonToTemplate(item,$template); + $spinningWheel.hide(); + refreshCreatePortForwardingRow(); + } else if (result.jobstatus == 2) { // Failed + $template.slideUp("slow", function() { + $(this).remove(); + }); + //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); + $("#dialog_error").text(errorMsg).dialog("open"); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + handleError(XMLHttpResponse, function() { + $template.slideUp("slow", function() { + $(this).remove(); + }); + var errorMsg = parseXMLHttpResponse(XMLHttpResponse); + $("#dialog_error").text(fromdb(errorMsg)).dialog("open"); + }); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + handleError(XMLHttpResponse, function() { + $template.slideUp("slow", function() { + $(this).remove(); + }); + var errorMsg = parseXMLHttpResponse(XMLHttpResponse); + $("#dialog_error").text(fromdb(errorMsg)).dialog("open"); + }); + } + }); + + return false; + }); + //*** Port Forwarding tab (end) *** + + //*** Load Balancer tab (begin) *** + var createLoadBalancerRow = $("#tab_content_load_balancer #create_load_balancer_row"); + + createLoadBalancerRow.find("#add_link").bind("click", function(event){ + // validate values + var isValid = true; + isValid &= validateString("Name", createLoadBalancerRow.find("#name"), createLoadBalancerRow.find("#name_errormsg")); + isValid &= validateInteger("Public Port", createLoadBalancerRow.find("#public_port"), createLoadBalancerRow.find("#public_port_errormsg"), 1, 65535); + isValid &= validateInteger("Private Port", createLoadBalancerRow.find("#private_port"), createLoadBalancerRow.find("#private_port_errormsg"), 1, 65535); + if (!isValid) return; + + var $template = $("#load_balancer_template").clone(); + $("#tab_content_load_balancer #grid_content").append($template.show()); + + var $spinningWheel = $template.find("#row_container").find("#spinning_wheel"); + $spinningWheel.find("#description").text(g_dictionary["label.adding.processing"]); + $spinningWheel.show(); + + var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); + var ipObj = $midmenuItem1.data("jsonObj"); + + var name = createLoadBalancerRow.find("#name").val(); + var publicPort = createLoadBalancerRow.find("#public_port").val(); + var privatePort = createLoadBalancerRow.find("#private_port").val(); + var algorithm = createLoadBalancerRow.find("#algorithm_select").val(); + + var array1 = []; + array1.push("&publicipid="+ipObj.id); + array1.push("&name="+todb(name)); + array1.push("&publicport="+publicPort); + array1.push("&privateport="+privatePort); + array1.push("&algorithm="+algorithm); + + $.ajax({ + data: createURL("command=createLoadBalancerRule"+array1.join("")), + dataType: "json", + success: function(json) { + var item = json.createloadbalancerruleresponse.loadbalancer; + loadBalancerJsonToTemplate(item, $template); + $spinningWheel.hide(); + refreshCreateLoadBalancerRow(); + }, + error: function(XMLHttpResponse) { + handleError(XMLHttpResponse, function() { + $template.slideUp("slow", function() { + $(this).remove(); + }); + var errorMsg = parseXMLHttpResponse(XMLHttpResponse); + $("#dialog_error").text(fromdb(errorMsg)).dialog("open"); + }); + } + }); + return false; + }); + //*** Load Balancer tab (end) *** +} + +function ipGetMidmenuId(jsonObj) { + return ipGetMidmenuId2(jsonObj.ipaddress); +} + +function ipGetMidmenuId2(ipaddress) { + return "midmenuItem_" + ipaddress.replace(/\./g, "_"); //e.g. "192.168.33.108" => "192_168_33_108" +} + +function ipToMidmenu(jsonObj, $midmenuItem1) { + var id = ipGetMidmenuId(jsonObj); + $midmenuItem1.attr("id", id); + $midmenuItem1.data("jsonObj", jsonObj); + + var $iconContainer = $midmenuItem1.find("#icon_container").show(); + $iconContainer.find("#icon").attr("src", "images/midmenuicon_network_networkgroup.png"); + + var firstRow = jsonObj.ipaddress.substring(0,25); + if (jsonObj.issourcenat == true) { + firstRow+="[source nat]"; + } + $midmenuItem1.find("#first_row").text(firstRow); + $midmenuItem1.find("#second_row").text("owned by: "+fromdb(jsonObj.account).substring(0,25)); +} + +function isIpManageable(domainid, account) { + if(((g_domainid == domainid && g_account == account) || (isDomainAdmin()) || (isAdmin())) + && account!="system") + return true; + else + return false; +} + +function ipToRightPanel($midmenuItem1) { + var ipObj = $midmenuItem1.data("jsonObj"); + + var networkObj; + if(ipObj.networkid != null) { + $.ajax({ + data: createURL("command=listNetworks&id="+ipObj.networkid+"&isSystem=true"), + dataType: "json", + async: false, + success: function(json) { + var items = json.listnetworksresponse.network; + if(items != null && items.length > 0) { + networkObj = items[0]; + $midmenuItem1.data("networkObj", networkObj); + } + } + }); + } + + copyActionInfoFromMidMenuToRightPanel($midmenuItem1); + + $("#right_panel_content").data("$midmenuItem1", $midmenuItem1); + $("#tab_details").click(); + + if(ipObj.isstaticnat == true) { + $("#tab_port_range").show(); + $("#tab_port_forwarding, #tab_load_balancer, #tab_vpn").hide(); + } + else { //ipObj.isstaticnat == false + $("#tab_port_range").hide(); + if(ipObj.forvirtualnetwork == true) { //(public network) + if(isIpManageable(ipObj.domainid, ipObj.account) == true) { + //Port Forwarding tab + if(networkObj != null) { + var firewallServiceObj = ipFindNetworkServiceByName("Firewall", networkObj); + if(firewallServiceObj != null) { + var portForwardingCapabilityObj = ipFindCapabilityByName("PortForwarding", firewallServiceObj); + if(portForwardingCapabilityObj != null) { + if(portForwardingCapabilityObj.value == "true") + $("#tab_port_forwarding").show(); + else + $("#tab_port_forwarding").hide(); + } + else { + $("#tab_port_forwarding").hide(); + } + } + else { + $("#tab_port_forwarding").hide(); + } + } + else { + $("#tab_port_forwarding").hide(); + } + + //Load Balancer tab + if (ipObj.issourcenat == true) { + $("#tab_load_balancer").hide(); + } + else { + if(networkObj != null) { + var lbServiceObj = ipFindNetworkServiceByName("Lb", networkObj); + if(lbServiceObj != null) + $("#tab_load_balancer").show(); + else + $("#tab_load_balancer").hide(); + } + else { + $("#tab_load_balancer").hide(); + } + } + + //VPN tab + if (ipObj.issourcenat == true) { + var vpnServiceObj = ipFindNetworkServiceByName("Vpn", networkObj); + if(vpnServiceObj != null) + $("#tab_vpn").show(); + else + $("#tab_vpn").hide(); + } + else { + $("#tab_vpn").hide(); + } + } + else { + $("#tab_port_forwarding, #tab_load_balancer, #tab_vpn").hide(); + } + } + else { //ipObj.forvirtualnetwork == false (direct network) + $("#tab_port_forwarding, #tab_load_balancer, #tab_vpn").hide(); + } + } +} + +function ipJsonToPortRangeTab() { + var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); + + if($midmenuItem1 == null) { + ipClearPortRangeTab(); + return; + } + + var ipObj = $midmenuItem1.data("jsonObj"); + if(ipObj == null) { + ipClearPortRangeTab(); + return; + } + + var $thisTab = $("#right_panel_content #tab_content_port_range"); + $thisTab.find("#tab_container").hide(); + $thisTab.find("#tab_spinning_wheel").show(); + + var networkObj = $midmenuItem1.data("networkObj"); + if(networkObj != null) { + var firewallServiceObj = ipFindNetworkServiceByName("Firewall", networkObj); + if(firewallServiceObj != null) { + var supportedProtocolsCapabilityObj = ipFindCapabilityByName("SupportedProtocols", firewallServiceObj); + if(supportedProtocolsCapabilityObj != null) { + var protocols = supportedProtocolsCapabilityObj.value.toUpperCase(); //e.g. "tcp,udp" => "TCP,UDP" + var array1 = protocols.split(","); + var $protocolField = $("#create_port_range_row").find("#protocol").empty(); + for(var i=0; i"+array1[i]+"") + } + } + } + + refreshCreatePortRangeRow(); + + $.ajax({ + data: createURL("command=listIpForwardingRules&ipaddressid=" + ipObj.id), + dataType: "json", + success: function(json) { + var items = json.listipforwardingrulesresponse.ipforwardingrule; + var $PortRangeGrid = $thisTab.find("#grid_content"); + $PortRangeGrid.empty(); + if (items != null && items.length > 0) { + for (var i = 0; i < items.length; i++) { + var $template = $("#port_range_template").clone(true); + portRangeJsonToTemplate(items[i], $template); + $PortRangeGrid.append($template.show()); + } + } + $thisTab.find("#tab_spinning_wheel").hide(); + $thisTab.find("#tab_container").show(); + } + }); +} + +function ipJsonToPortForwardingTab() { + var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); + if($midmenuItem1 == null) { + ipClearPortForwardingTab(); + return; + } + + var ipObj = $midmenuItem1.data("jsonObj"); + if(ipObj == null) { + ipClearPortForwardingTab(); + return; + } + + var $thisTab = $("#right_panel_content #tab_content_port_forwarding"); + $thisTab.find("#tab_container").hide(); + $thisTab.find("#tab_spinning_wheel").show(); + + var networkObj = $midmenuItem1.data("networkObj"); + if(networkObj != null) { + var firewallServiceObj = ipFindNetworkServiceByName("Firewall", networkObj); + if(firewallServiceObj != null) { + var supportedProtocolsCapabilityObj = ipFindCapabilityByName("SupportedProtocols", firewallServiceObj); + if(supportedProtocolsCapabilityObj != null) { + var protocols = supportedProtocolsCapabilityObj.value.toUpperCase(); //e.g. "tcp,udp" => "TCP,UDP" + var array1 = protocols.split(","); + var $protocolField = $("#create_port_forwarding_row").find("#protocol").empty(); + for(var i=0; i"+array1[i]+"") + } + } + } + + refreshCreatePortForwardingRow(); + + $.ajax({ + data: createURL("command=listPortForwardingRules&ipaddressid=" + ipObj.id), + dataType: "json", + success: function(json) { + var items = json.listportforwardingrulesresponse.portforwardingrule; + var $portForwardingGrid = $thisTab.find("#grid_content"); + $portForwardingGrid.empty(); + if (items != null && items.length > 0) { + for (var i = 0; i < items.length; i++) { + var $template = $("#port_forwarding_template").clone(true); + portForwardingJsonToTemplate(items[i], $template); + $portForwardingGrid.append($template.show()); + } + } + $thisTab.find("#tab_spinning_wheel").hide(); + $thisTab.find("#tab_container").show(); + } + }); +} + +function ipJsonToLoadBalancerTab() { + var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); + if($midmenuItem1 == null) { + ipClearLoadBalancerTab(); + return; + } + + var ipObj = $midmenuItem1.data("jsonObj"); + if(ipObj == null) { + ipClearLoadBalancerTab(); + return; + } + + var $thisTab = $("#right_panel_content #tab_content_load_balancer"); + $thisTab.find("#tab_container").hide(); + $thisTab.find("#tab_spinning_wheel").show(); + + var networkObj = $midmenuItem1.data("networkObj"); + if(networkObj != null) { + var lbServiceObj = ipFindNetworkServiceByName("Lb", networkObj); + if(lbServiceObj != null) { + var supportedLbAlgorithmsCapabilityObj = ipFindCapabilityByName("SupportedLbAlgorithms", lbServiceObj); + if(supportedLbAlgorithmsCapabilityObj != null) { + var algorithms = supportedLbAlgorithmsCapabilityObj.value; //e.g. "roundrobin,leastconn,sourceip" + var array1 = algorithms.split(","); + var $algorithmField1 = $("#create_load_balancer_row").find("#algorithm_select").empty(); + var $algorithmField2 = $("#load_balancer_template").find("#row_container_edit").find("#algorithm_select").empty(); + for(var i=0; i"+array1[i]+""); + $algorithmField2.append(""); + } + } + } + } + + refreshCreateLoadBalancerRow(); + + $.ajax({ + data: createURL("command=listLoadBalancerRules&publicipid="+ipObj.id), + dataType: "json", + success: function(json) { + var items = json.listloadbalancerrulesresponse.loadbalancerrule; + var loadBalancerGrid = $thisTab.find("#grid_content"); + loadBalancerGrid.empty(); + if (items != null && items.length > 0) { + for (var i = 0; i < items.length; i++) { + var $template = $("#load_balancer_template").clone(true); + loadBalancerJsonToTemplate(items[i], $template); + loadBalancerGrid.append($template.show()); + } + } + $thisTab.find("#tab_spinning_wheel").hide(); + $thisTab.find("#tab_container").show(); + } + }); +} + +function showEnableVPNDialog($thisTab) { + $("#dialog_enable_vpn") + .dialog('option', 'buttons', { + "Enable": function() { + var $thisDialog = $(this); + $thisDialog.find("#info_container").hide(); + $spinningWheel = $thisDialog.find("#spinning_wheel").show(); + + var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); + var ipObj = $midmenuItem1.data("jsonObj"); + + $.ajax({ + data: createURL("command=createRemoteAccessVpn&publicipid="+ipObj.id+"&account="+ipObj.account+"&domainid="+ipObj.domainid+"&zoneid="+ipObj.zoneid), + dataType: "json", + success: function(json) { + var jobId = json.createremoteaccessvpnresponse.jobid; + var timerKey = "asyncJob_" + jobId; + $("body").everyTime( + 5000, + 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 + showVpnUsers(result.jobresult.remoteaccessvpn.presharedkey, result.jobresult.remoteaccessvpn.publicip); + $thisDialog.dialog("close"); + $thisTab.find("#tab_container").show(); + $thisTab.find("#vpn_disabled_msg").hide(); + } else if (result.jobstatus == 2) { // Failed + //var errorMsg = "We were unable to enable VPN access. Please contact support."; + var errorMsg = g_dictionary["label.failed"] + " - " + fromdb(result.jobresult.errortext); + $thisDialog.find("#info_container").text(errorMsg).show(); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + handleError(XMLHttpResponse, function() { + handleErrorInDialog(XMLHttpResponse, $thisDialog); + }); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + handleError(XMLHttpResponse, function() { + handleErrorInDialog(XMLHttpResponse, $thisDialog); + }); + } + }); + }, + "Cancel": function() { + $thisTab.find("#tab_container").hide(); + $thisTab.find("#vpn_disabled_msg").show(); + $(this).dialog("close"); + $thisTab.find("#enable_vpn_link").unbind("click").bind("click", function(event) { + showEnableVPNDialog($thisTab); + }); + } + }).dialog("open"); +} + +function ipJsonToVPNTab() { + var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); + if($midmenuItem1 == null) { + ipClearVPNTab(); + return; + } + + var ipObj = $midmenuItem1.data("jsonObj"); + if(ipObj == null) { + ipClearVPNTab(); + return; + } + + var $thisTab = $("#right_panel_content").find("#tab_content_vpn"); + $thisTab.find("#tab_spinning_wheel").show(); + $thisTab.find("#tab_container").hide(); + + $.ajax({ + data: createURL("command=listRemoteAccessVpns&publicipid="+ipObj.id), + dataType: "json", + success: function(json) { + var items = json.listremoteaccessvpnsresponse.remoteaccessvpn; + if (items != null && items.length > 0) { + showVpnUsers(items[0].presharedkey, items[0].publicip); + } else { + showEnableVPNDialog($thisTab); + } + $thisTab.find("#tab_spinning_wheel").hide(); + $thisTab.find("#tab_container").show(); + $thisTab.find("#vpn_disabled_msg").hide(); + } + }); +} + +function ipClearVPNTab() { + var $thisTab = $("#right_panel_content").find("#tab_content_vpn"); + showEnableVPNDialog($thisTab); + $thisTab.find("#vpn_disabled_msg").hide(); +} + +function showVpnUsers(presharedkey, publicip) { + var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); + var ipObj = $midmenuItem1.data("jsonObj"); + var $vpnTab = $("#right_panel_content #tab_content_vpn"); + var $actionMenu = $vpnTab.find("#vpn_action_menu"); + $actionMenu.find("#action_list").empty(); + + $vpnTab.find("#vpn_key").text(presharedkey); + $vpnTab.find("#vpn_ip").text(publicip); + + var $listItemTemplate = $("#action_list_item"); + var $listItem = $listItemTemplate.clone(); + $listItem.find("#link").text("Disable VPN"); + $listItem.bind("click", function(event) { + $actionMenu.hide(); + $("#dialog_disable_vpn") + .dialog('option', 'buttons', { + "Disable": function() { + var $thisDialog = $(this); + $thisDialog.find("#info_container").hide(); + $spinningWheel = $thisDialog.find("#spinning_wheel").show(); + $.ajax({ + data: createURL("command=deleteRemoteAccessVpn&publicipid="+ipObj.id+"&account="+ipObj.account+"&domainid="+ipObj.domainid+"&zoneid="+ipObj.zoneid), + dataType: "json", + success: function(json) { + var jobId = json.deleteremoteaccessvpnresponse.jobid; + var timerKey = "asyncJob_" + jobId; + $("body").everyTime( + 5000, + 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 + $thisDialog.dialog("close"); + $vpnTab.find("#vpn_help").hide(); + $vpnTab.find("#enable_vpn_link").unbind("click").bind("click", function(event) { + showEnableVPNDialog($vpnTab); + }); + $vpnTab.find("#tab_container").hide(); + $vpnTab.find("#vpn_disabled_msg").show(); + } else if (result.jobstatus == 2) { // Failed + //var errorMsg = "We were unable to disable VPN access. Please contact support."; + var errorMsg = g_dictionary["label.failed"] + " - " + fromdb(result.jobresult.errortext); + $thisDialog.find("#info_container").text(errorMsg).show(); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + handleError(XMLHttpResponse, function() { + handleErrorInDialog(XMLHttpResponse, $thisDialog); + }); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + handleError(XMLHttpResponse, function() { + handleErrorInDialog(XMLHttpResponse, $thisDialog); + }); + } + }); + }, + "Cancel": function() { + $(this).dialog("close"); + } + }).dialog("open"); + return false; + }); + $actionMenu.find("#action_list").append($listItem.show()); + + $listItem = $listItemTemplate.clone(); + $listItem.find("#link").text("Add VPN User"); + $listItem.bind("click", function(event) { + $actionMenu.hide(); + $vpnDialog = $("#dialog_add_vpnuser"); + $vpnDialog.find("#username").val(""); + $vpnDialog.find("#password").val(""); + $("#dialog_add_vpnuser") + .dialog('option', 'buttons', { + "Add": function() { + var $thisDialog = $(this); + $thisDialog.find("#info_container").hide(); + + var isValid = true; + isValid &= validateString("Username", $thisDialog.find("#username"), $thisDialog.find("#username_errormsg")); + isValid &= validateString("Password", $thisDialog.find("#password"), $thisDialog.find("#password_errormsg")); + if (!isValid) return; + + var username = todb($thisDialog.find("#username").val()); + var password = todb($thisDialog.find("#password").val()); + + $spinningWheel = $thisDialog.find("#spinning_wheel").show(); + $.ajax({ + data: createURL("command=addVpnUser&username="+username+"&password="+password), + dataType: "json", + success: function(json) { + var jobId = json.addvpnuserresponse.jobid; + var timerKey = "asyncJob_" + jobId; + $("body").everyTime( + 5000, + 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 + $thisDialog.dialog("close"); + $("#tab_content_vpn #grid_content").append(vpnUserJsonToTemplate(result.jobresult.vpnuser).fadeIn()); + } else if (result.jobstatus == 2) { // Failed + //var errorMsg = "We were unable to add user access to your VPN. Please contact support."; + var errorMsg = g_dictionary["label.failed"] + " - " + fromdb(result.jobresult.errortext); + $thisDialog.find("#info_container").text(errorMsg).show(); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + handleError(XMLHttpResponse, function() { + handleErrorInDialog(XMLHttpResponse, $thisDialog); + }); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + handleError(XMLHttpResponse, function() { + handleErrorInDialog(XMLHttpResponse, $thisDialog); + }); + } + }); + }, + "Cancel": function() { + $(this).dialog("close"); + } + }).dialog("open"); + return false; + }); + $actionMenu.find("#action_list").append($listItem.show()); + + // Enable action menu for vpn + var $actionLink = $vpnTab.find("#vpn_action_link"); + $actionLink.unbind("mouseover").bind("mouseover", function(event) { + $(this).find("#vpn_action_menu").show(); + return false; + }); + $actionLink.unbind("mouseout").bind("mouseout", function(event) { + $(this).find("#vpn_action_menu").hide(); + return false; + }); + + $vpnTab.find("#vpn_help").show(); + enableDeleteUser(); + // List users + $.ajax({ + data: createURL("command=listVpnUsers&account="+ipObj.account+"&domainid="+ipObj.domainid), + dataType: "json", + async: false, + success: function(json) { + var items = json.listvpnusersresponse.vpnuser; + if(items != null && items.length > 0) { + var $gridContent = $("#tab_content_vpn #grid_content").empty(); + for (var i = 0; i < items.length; i++) { + $gridContent.append(vpnUserJsonToTemplate(items[i]).show()); + } + + //Enable delete user + + } + } + }); +} + +function enableDeleteUser() { + $("#tab_content_vpn #grid_content").unbind("click").bind("click", function(event) { + var target = $(event.target); + var targetId = target.attr("id"); + if (targetId == "vpn_delete_user") { + var id = target.data("id"); + var username = target.data("username"); + var account = target.data("account"); + var domainId = target.data("domainid"); + var params = []; + params.push("&username="+username); + params.push("&account="+account); + params.push("&domainid="+domainId); + var $thisDialog = $("#dialog_confirmation_remove_vpnuser"); + $thisDialog.find("#username").text(target.data("username")); + $thisDialog.dialog('option', 'buttons', { + "Ok": function() { + $thisDialog.find("#info_container").hide(); + $spinningWheel = $thisDialog.find("#spinning_wheel").show(); + $.ajax({ + data: createURL("command=removeVpnUser"+params.join("")), + dataType: "json", + success: function(json) { + var jobId = json.removevpnuserresponse.jobid; + var timerKey = "asyncJob_" + jobId; + $("body").everyTime( + 5000, + 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 + $thisDialog.dialog("close"); + + //remove user from grid + $("#right_panel_content #tab_content_vpn").find("#vpnuser"+id).slideUp(); + } else if (result.jobstatus == 2) { // Failed + //var errorMsg = "We were unable to add user access to your VPN. Please contact support."; + var errorMsg = g_dictionary["label.failed"] + " - " + fromdb(result.jobresult.errortext); + $thisDialog.find("#info_container").text(errorMsg).show(); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + handleError(XMLHttpResponse, function() { + handleErrorInDialog(XMLHttpResponse, $thisDialog); + }); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + handleError(XMLHttpResponse, function() { + handleErrorInDialog(XMLHttpResponse, $thisDialog); + }); + } + }); + }, + "Cancel": function() { + $(this).dialog("close"); + } + }).dialog("open"); + + } + return false; + }); +} + + +var vpnItem = 1; +function vpnUserJsonToTemplate(json) { + var $template = $("#vpn_template").clone(); + if (vpnItem++ % 2 == 0) $template.removeClass("odd").addClass("even"); + $template.find("#username").text(json.username); + $template.attr("id", "vpnuser"+json.id); + $template.find("#vpn_delete_user").data("id", json.id).data("username", json.username).data("account", json.account).data("domainid", json.domainid); + return $template; +} + +function ipClearRightPanel() { + ipClearDetailsTab(); + ipClearPortForwardingTab(); + ipClearLoadBalancerTab(); +} + +//***** Details tab (begin) **************************************************************************************************************** +function ipJsonToDetailsTab() { + var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); + if($midmenuItem1 == null) { + ipClearDetailsTab() + return; + } + + var ipObj = $midmenuItem1.data("jsonObj"); + if(ipObj == null) { + ipClearDetailsTab() + return; + } + + var networkObj = $midmenuItem1.data("networkObj"); + + var id = ipObj.id; + + var $thisTab = $("#right_panel_content").find("#tab_content_details"); + $thisTab.find("#tab_container").hide(); + $thisTab.find("#tab_spinning_wheel").show(); + + $.ajax({ + data: createURL("command=listPublicIpAddresses&id="+id), + dataType: "json", + async: false, + success: function(json) { + var items = json.listpublicipaddressesresponse.publicipaddress; + if(items != null && items.length > 0) { + ipObj = items[0]; + $midmenuItem1.data("jsonObj", ipObj); + } + } + }); + + $thisTab.find("#grid_header_title").text(fromdb(ipObj.ipaddress)); + $thisTab.find("#id").text(fromdb(ipObj.id)); + $thisTab.find("#ipaddress").text(fromdb(ipObj.ipaddress)); + $thisTab.find("#zonename").text(fromdb(ipObj.zonename)); + $thisTab.find("#state").text(fromdb(ipObj.state)); + $thisTab.find("#vlanname").text(fromdb(ipObj.vlanname)); + setBooleanReadField(ipObj.issourcenat, $thisTab.find("#source_nat")); + setNetworkTypeField(ipObj.forvirtualnetwork, $thisTab.find("#network_type")); + $thisTab.find("#networkid").text(fromdb(ipObj.networkid)); + $thisTab.find("#associatednetworkid").text(fromdb(ipObj.associatednetworkid)); + $thisTab.find("#domain").text(fromdb(ipObj.domain)); + $thisTab.find("#account").text(fromdb(ipObj.account)); + $thisTab.find("#allocated").text(fromdb(ipObj.allocated)); + + setBooleanReadField(ipObj.isstaticnat, $thisTab.find("#static_nat")); + + if(ipObj.isstaticnat == true) { + $thisTab.find("#vm_of_static_nat").text(getVmName(ipObj.virtualmachinename, ipObj.virtualmachinedisplayname)); + $thisTab.find("#vm_of_static_nat_container").show(); + } + else { + $thisTab.find("#vm_of_static_nat").text(""); + $thisTab.find("#vm_of_static_nat_container").hide(); + } + + //actions *** + var $actionMenu = $("#right_panel_content #tab_content_details #action_link #action_menu"); + $actionMenu.find("#action_list").empty(); + var noAvailableActions = true; + + if(isIpManageable(ipObj.domainid, ipObj.account) == true) { + ipPopulateVMarray(ipObj); //popoulate VM array + var $vmSelect = $("#dialog_enable_static_NAT").find("#vm_dropdown").empty(); + ipPopulateVMDropdown($vmSelect); + + if(ipObj.isstaticnat == true) { + buildActionLinkForTab("label.action.disable.static.NAT", ipActionMap, $actionMenu, $midmenuItem1, $thisTab); + buildActionLinkForTab("label.action.release.ip", ipActionMap, $actionMenu, $midmenuItem1, $thisTab); + noAvailableActions = false; + } else { + if(ipObj.issourcenat != true) { + if(networkObj != null) { + var firewallServiceObj = ipFindNetworkServiceByName("Firewall", networkObj); + if(firewallServiceObj != null) { + var staticNatCapabilityObj = ipFindCapabilityByName("StaticNat", firewallServiceObj); + if(staticNatCapabilityObj != null) { + if(staticNatCapabilityObj.value == "true") + buildActionLinkForTab("label.action.enable.static.NAT", ipActionMap, $actionMenu, $midmenuItem1, $thisTab); + } + } + } + + buildActionLinkForTab("label.action.release.ip", ipActionMap, $actionMenu, $midmenuItem1, $thisTab); + noAvailableActions = false; + } + } + } + + // no available actions + if(noAvailableActions == true) { + $actionMenu.find("#action_list").append($("#no_available_actions").clone().show()); + } + + $thisTab.find("#tab_spinning_wheel").hide(); + $thisTab.find("#tab_container").show(); +} + +function ipFindNetworkServiceByName(pName, networkObj) { + if(networkObj == null) + return null; + for(var i=0; i 0) { + ipToMidmenu(items[0], $midmenuItem1); + } + } + }); + } + } + }, + "label.action.disable.static.NAT": { + isAsyncJob: true, + asyncJobResponse: "disablestaticnatresponse", + dialogBeforeActionFn: doDisableStaticNAT, + inProcessText: "label.action.disable.static.NAT.processing", + afterActionSeccessFn: function(json, $midmenuItem1, id) { + if(id.toString() == $("#right_panel_content").find("#tab_content_details").find("#id").text()) { + $.ajax({ + data: createURL("command=listPublicIpAddresses&id="+id), + dataType: "json", + async: false, + success: function(json) { + var items = json.listpublicipaddressesresponse.publicipaddress; + if(items != null && items.length > 0) { + ipToMidmenu(items[0], $midmenuItem1); + } + } + }); + } + } + } +} + +function doReleaseIp($actionLink, $detailsTab, $midmenuItem1) { + var jsonObj = $midmenuItem1.data("jsonObj"); + var id = jsonObj.id; + + $("#dialog_confirmation") + .text(dictionary["message.action.release.ip"]) + .dialog('option', 'buttons', { + "Confirm": function() { + $(this).dialog("close"); + var apiCommand = "command=disassociateIpAddress&id="+id; + doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $detailsTab); + }, + "Cancel": function() { + $(this).dialog("close"); + } + }).dialog("open"); +} + +function doEnableStaticNAT($actionLink, $detailsTab, $midmenuItem1) { + var ipObj = $midmenuItem1.data("jsonObj"); + + $("#dialog_enable_static_NAT") + .dialog('option', 'buttons', { + "Confirm": function() { + var $thisDialog = $(this); + + //validate + var vmId = $thisDialog.find("#vm_dropdown").val(); + if(vmId == null || vmId.length == 0) + return; + + $thisDialog.dialog("close"); + + var apiCommand = "command=enableStaticNat&ipaddressid="+ipObj.id+"&virtualmachineid="+vmId; + doActionToTab(ipObj.id, $actionLink, apiCommand, $midmenuItem1, $detailsTab); + }, + "Cancel": function() { + $(this).dialog("close"); + } + }).dialog("open"); +} + +function doDisableStaticNAT($actionLink, $detailsTab, $midmenuItem1) { + var ipObj = $midmenuItem1.data("jsonObj"); + + $("#dialog_confirmation") + .text(dictionary["message.action.disable.static.NAT"]) + .dialog('option', 'buttons', { + "Confirm": function() { + $(this).dialog("close"); + + var apiCommand = "command=disableStaticNat&ipaddressid="+ipObj.id; + doActionToTab(ipObj.id, $actionLink, apiCommand, $midmenuItem1, $detailsTab); + }, + "Cancel": function() { + $(this).dialog("close"); + } + }).dialog("open"); +} +//***** Details tab (end) ****************************************************************************************************************** + +function ipSetRuleState(stateValue, $stateField) { + $stateField.text(stateValue); + if(stateValue == "Active") //green + $stateField.removeClass("status_red status_gray").addClass("status_green"); + else if(stateValue == "Deleting") //red + $stateField.removeClass("status_green status_gray").addClass("status_red"); + else //gray + $stateField.removeClass("status_red status_green").addClass("status_gray"); +} + +//***** Port Range tab (begin) ******************************************************************************************************** +function ipClearPortRangeTab() { + $("#tab_content_port_range #grid_content").empty(); + refreshCreatePortRangeRow(); +} + +function portRangeJsonToTemplate(jsonObj, $template) { + $template.attr("id", "PortRange_" + fromdb(jsonObj.id)).data("PortRangeId", fromdb(jsonObj.id)); + $template.find("#row_container #start_port").text(fromdb(jsonObj.startport)); + $template.find("#row_container #end_port").text(fromdb(jsonObj.endport)); + $template.find("#row_container #protocol").text(fromdb(jsonObj.protocol)); + ipSetRuleState(fromdb(jsonObj.state), $template.find("#row_container #state")); + + $template.find("#delete_link").unbind("click").bind("click", function(event){ + var $spinningWheel = $template.find("#row_container").find("#spinning_wheel"); + $spinningWheel.find("#description").text(g_dictionary["label.deleting.processing"]); + $spinningWheel.show(); + + $.ajax({ + data: createURL("command=deleteIpForwardingRule&id="+fromdb(jsonObj.id)), + dataType: "json", + success: function(json) { + var jobId = json.deleteipforwardingruleresponse.jobid; + var timerKey = "asyncJob_" + jobId; + $("body").everyTime( + 10000, + timerKey, + function() { + $.ajax({ + data: createURL("command=queryAsyncJobResult&jobId="+jobId), + dataType: "json", + success: function(json) { + var result = json.queryasyncjobresultresponse; + if (result.jobstatus == 0) { + return; //Job has not completed + } else { + $("body").stopTime(timerKey); + $spinningWheel.hide(); + if (result.jobstatus == 1) { // Succeeded + $template.slideUp("slow", function() { + $(this).remove(); + }); + } else if (result.jobstatus == 2) { // Failed + var errorMsg = g_dictionary["label.deleting.failed"] + " - " + fromdb(result.jobresult.errortext); + $("#dialog_error").text(errorMsg).dialog("open"); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + $spinningWheel.hide(); + handleError(XMLHttpResponse); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + $spinningWheel.hide(); + handleError(XMLHttpResponse); + } + }); + + return false; + }); +} + +function refreshCreatePortRangeRow() { + var $createPortRangeRow = $("#create_port_range_row"); + $createPortRangeRow.find("#start_port").val(""); + $createPortRangeRow.find("#end_port").val(""); +} + +//***** Port Range tab (end) ********************************************************************************************************** + +//***** Port Forwarding tab (begin) ******************************************************************************************************** +function ipClearPortForwardingTab() { + $("#tab_content_port_forwarding #grid_content").empty(); + refreshCreatePortForwardingRow(); +} + +function portForwardingJsonToTemplate(jsonObj, $template) { + $template.attr("id", "portForwarding_" + fromdb(jsonObj.id)).data("portForwardingId", fromdb(jsonObj.id)); + + $template.find("#row_container #public_port").text(fromdb(jsonObj.publicport)); + $template.find("#row_container_edit #public_port").text(fromdb(jsonObj.publicport)); + + $template.find("#row_container #private_port").text(fromdb(jsonObj.privateport)); + $template.find("#row_container_edit #private_port").val(fromdb(jsonObj.privateport)); + + $template.find("#row_container #protocol").text(fromdb(jsonObj.protocol)); + $template.find("#row_container_edit #protocol").text(fromdb(jsonObj.protocol)); + + var vmName = getVmName(jsonObj.virtualmachinename, jsonObj.virtualmachinedisplayname); + $template.find("#row_container #vm_name").text(vmName); + var virtualMachineId = fromdb(jsonObj.virtualmachineid); + + ipSetRuleState(fromdb(jsonObj.state), $template.find("#row_container #state")); + + var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); + if($midmenuItem1 == null) + return; + var ipObj = $midmenuItem1.data("jsonObj"); + if(ipObj == null) + return; + var ipAddress = fromdb(ipObj.ipaddress); + + var $vmSelect = $template.find("#row_container_edit #vm").empty(); + ipPopulateVMDropdown($vmSelect); + $vmSelect.val(virtualMachineId); + + var $rowContainer = $template.find("#row_container"); + var $rowContainerEdit = $template.find("#row_container_edit"); + + $template.find("#delete_link").unbind("click").bind("click", function(event){ + var $spinningWheel = $rowContainer.find("#spinning_wheel"); + $spinningWheel.find("#description").text(g_dictionary["label.deleting.processing"]); + $spinningWheel.show(); + + $.ajax({ + data: createURL("command=deletePortForwardingRule&id="+fromdb(jsonObj.id)), + dataType: "json", + success: function(json) { + var jobId = json.deleteportforwardingruleresponse.jobid; + var timerKey = "asyncJob_" + jobId; + $("body").everyTime( + 10000, + timerKey, + function() { + $.ajax({ + data: createURL("command=queryAsyncJobResult&jobId="+jobId), + dataType: "json", + success: function(json) { + var result = json.queryasyncjobresultresponse; + if (result.jobstatus == 0) { + return; //Job has not completed + } else { + $("body").stopTime(timerKey); + $spinningWheel.hide(); + if (result.jobstatus == 1) { // Succeeded + $template.slideUp("slow", function() { + $(this).remove(); + }); + } else if (result.jobstatus == 2) { // Failed + var errorMsg = g_dictionary["label.deleting.failed"] + " - " + fromdb(result.jobresult.errortext); + $("#dialog_error").text(errorMsg).dialog("open"); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + $spinningWheel.hide(); + handleError(XMLHttpResponse); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + $spinningWheel.hide(); + handleError(XMLHttpResponse); + } + }); + + return false; + }); +} + +function refreshCreatePortForwardingRow() { + var $createPortForwardingRow = $("#create_port_forwarding_row"); + $createPortForwardingRow.find("#public_port").val(""); + $createPortForwardingRow.find("#private_port").val(""); + + var $vmSelect = $createPortForwardingRow.find("#vm").empty(); + ipPopulateVMDropdown($vmSelect); +} + +var runningVMs, stoppedVMs; +function ipPopulateVMarray(ipObj) { + var commandString = "command=listVirtualMachines&domainid="+ipObj.domainid+"&account="+ipObj.account+"&networkid="+ipObj.associatednetworkid; + + $.ajax({ + data: createURL(commandString+"&state=Running"), + dataType: "json", + async: false, + success: function(json) { + runningVMs = json.listvirtualmachinesresponse.virtualmachine; + } + }); + + $.ajax({ + data: createURL(commandString+"&state=Stopped"), + dataType: "json", + async: false, + success: function(json) { + stoppedVMs = json.listvirtualmachinesresponse.virtualmachine; + } + }); +} + +function ipPopulateVMDropdown($vmSelect) { + if (runningVMs != null && runningVMs.length > 0) { + for (var i = 0; i < runningVMs.length; i++) { + var html = $(""); + $vmSelect.append(html); + } + } + if (stoppedVMs != null && stoppedVMs.length > 0) { + for (var i = 0; i < stoppedVMs.length; i++) { + var html = $(""); + $vmSelect.append(html); + } + } +} +//***** Port Forwarding tab (end) ********************************************************************************************************** + + +//***** Load Balancer tab (begin) ********************************************************************************************************** +function ipClearLoadBalancerTab() { + $("#tab_content_load_balancer #grid_content").empty(); + refreshCreateLoadBalancerRow(); +} + +function loadBalancerJsonToTemplate(jsonObj, $template) { + var loadBalancerId = fromdb(jsonObj.id); + $template.attr("id", "loadBalancer_" + loadBalancerId).data("loadBalancerId", loadBalancerId); + + $template.find("#row_container #name").text(fromdb(jsonObj.name)); + $template.find("#row_container_edit #name").val(fromdb(jsonObj.name)); + + $template.find("#row_container #public_port").text(fromdb(jsonObj.publicport)); + $template.find("#row_container_edit #public_port").text(fromdb(jsonObj.publicport)); + + $template.find("#row_container #private_port").text(fromdb(jsonObj.privateport)); + $template.find("#row_container_edit #private_port").text(fromdb(jsonObj.privateport)); + + $template.find("#row_container #algorithm").text(fromdb(jsonObj.algorithm)); + $template.find("#row_container_edit #algorithm_select").val(fromdb(jsonObj.algorithm)); + + ipSetRuleState(fromdb(jsonObj.state), $template.find("#row_container #state")); + + $template.find("#manage_link").unbind("click").bind("click", function(event){ + var $managementArea = $template.find("#management_area"); + var $vmSubgrid = $managementArea.find("#subgrid_content"); + if($managementArea.css("display") == "none") { + $vmSubgrid.empty(); + $.ajax({ + cache: false, + data: createURL("command=listLoadBalancerRuleInstances&id="+loadBalancerId+"&applied=true"), + dataType: "json", + success: function(json) { + var instances = json.listloadbalancerruleinstancesresponse.loadbalancerruleinstance; + if (instances != null && instances.length > 0) { + for (var i = 0; i < instances.length; i++) { + var $lbVmTemplate = $("#load_balancer_vm_template").clone(); + var obj = {"loadBalancerId": loadBalancerId, "vmId": instances[i].id, "vmName": getVmName(instances[i].name, instances[i].displayname), "vmPrivateIp": instances[i].ipaddress}; + lbVmObjToTemplate(obj, $lbVmTemplate); + $vmSubgrid.append($lbVmTemplate.show()); + } + } + } + }); + $managementArea.show(); + } + else { + $managementArea.hide(); + } + return false; + }); + + var $rowContainer = $template.find("#row_container"); + var $rowContainerEdit = $template.find("#row_container_edit"); + + $template.find("#delete_link").unbind("click").bind("click", function(event){ + var $managementArea = $template.find("#management_area"); + if($managementArea.css("display") != "none") + $managementArea.hide(); + + var $spinningWheel = $template.find("#row_container").find("#spinning_wheel"); + $spinningWheel.find("#description").text(g_dictionary["label.deleting.processing"]); + $spinningWheel.show(); + + $.ajax({ + data: createURL("command=deleteLoadBalancerRule&id="+loadBalancerId), + dataType: "json", + success: function(json) { + var jobId = json.deleteloadbalancerruleresponse.jobid; + var timerKey = "deleteLoadBalancerRuleJob_"+jobId; + $("body").everyTime( + 5000, + 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 + $template.slideUp("slow", function() { + $(this).remove(); + }); + } else if (result.jobstatus == 2) { // Failed + var errorMsg = g_dictionary["label.deleting.failed"] + " - " + fromdb(result.jobresult.errortext); + $("#dialog_error").text(errorMsg).dialog("open"); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + $spinningWheel.hide(); + handleError(XMLHttpResponse); + } + }); + }, + 0 + ); + } + , + error: function(XMLHttpResponse) { + $spinningWheel.hide(); + handleError(XMLHttpResponse); + } + }); + return false; + }); + + $template.find("#edit_link").unbind("click").bind("click", function(event){ + $rowContainer.hide(); + $rowContainerEdit.show(); + }); + + $template.find("#cancel_link").unbind("click").bind("click", function(event){ + $rowContainer.show(); + $rowContainerEdit.hide(); + }); + + $template.find("#save_link").unbind("click").bind("click", function(event){ + var isValid = true; + isValid &= validateString("Name", $rowContainerEdit.find("#name"), $rowContainerEdit.find("#name_errormsg")); + if (!isValid) + return; + + var $spinningWheel = $template.find("#row_container_edit").find("#spinning_wheel"); + $spinningWheel.find("#description").text(g_dictionary["label.saving.processing"]); + $spinningWheel.show(); + + var name = $rowContainerEdit.find("#name").val(); + var algorithm = $rowContainerEdit.find("#algorithm_select").val(); + + var array1 = []; + array1.push("&id=" + loadBalancerId); + array1.push("&name=" + name); + array1.push("&algorithm=" + algorithm); + + $.ajax({ + data: createURL("command=updateLoadBalancerRule"+array1.join("")), + dataType: "json", + success: function(json) { + var jobId = json.updateloadbalancerruleresponse.jobid; + var timerKey = "updateloadbalancerruleJob"+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 + var item = result.jobresult.loadbalancer; + loadBalancerJsonToTemplate(item,$template); + $spinningWheel.hide(); + $rowContainerEdit.hide(); + $rowContainer.show(); + } else if (result.jobstatus == 2) { //Fail + $spinningWheel.hide(); + $rowContainerEdit.hide(); + $rowContainer.show(); + //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); + $("#dialog_alert").text(errorMsg).dialog("open"); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + $spinningWheel.hide(); + $rowContainerEdit.hide(); + $rowContainer.show(); + handleError(XMLHttpResponse); + } + }); + }, 0); + }, + error: function(XMLHttpResponse) { + handleError(XMLHttpResponse); + $spinningWheel.hide(); + $rowContainerEdit.hide(); + $rowContainer.show(); + } + }); + }); + + refreshLbVmSelect($template, jsonObj.id); + + $template.find("#add_vm_to_lb_row #assign_link").unbind("click").bind("click", function(event){ + var vmOption = $template.find("#add_vm_to_lb_row #vm_select option:selected"); + var vmId = vmOption.val(); + var vmName = vmOption.data("vmName"); + var vmPrivateIp = vmOption.data("vmPrivateIp"); + if(vmId == null || vmId.length == 0) + return; + + var $spinningWheel = $template.find("#add_vm_to_lb_row #spinning_wheel"); + $spinningWheel.show(); + + $.ajax({ + data: createURL("command=assignToLoadBalancerRule&id="+loadBalancerId+"&virtualmachineids="+vmId), + dataType: "json", + success: function(json) { + var lbInstanceJSON = json.assigntoloadbalancerruleresponse; + var jobId = lbInstanceJSON.jobid; + var timerKey = "assignToLoadBalancerRuleJob_"+jobId; + $("body").everyTime( + 5000, + 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 + var $lbVmTemplate = $("#load_balancer_vm_template").clone(); + var obj = {"loadBalancerId": loadBalancerId, "vmId": vmId, "vmName": vmName, "vmPrivateIp": vmPrivateIp}; + lbVmObjToTemplate(obj, $lbVmTemplate); + $template.find("#management_area #subgrid_content").append($lbVmTemplate.show()); + refreshLbVmSelect($template, loadBalancerId); + $spinningWheel.hide(); + } 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); + $("#dialog_error").text(errorMsg).dialog("open"); + $spinningWheel.hide(); + } + } + }, + error: function(XMLHttpResponse) { + handleError(XMLHttpResponse); + $("body").stopTime(timerKey); + $spinningWheel.hide(); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + handleError(XMLHttpResponse); + $spinningWheel.hide(); + } + }); + return false; + }); +} + +function refreshCreateLoadBalancerRow() { + var createLoadBalancerRow = $("#tab_content_load_balancer #create_load_balancer_row"); + createLoadBalancerRow.find("#name").val(""); + createLoadBalancerRow.find("#public_port").val(""); + createLoadBalancerRow.find("#private_port").val(""); + createLoadBalancerRow.find("#algorithm_select").val("roundrobin"); +} + + +function lbVmObjToTemplate(obj, $template) { + $template.find("#vm_name").text(obj.vmName); + $template.find("#vm_private_ip").text(fromdb(obj.vmPrivateIp)); + + $template.find("#remove_link").bind("click", function(event){ + var $spinningWheel = $template.find("#spinning_wheel"); + $spinningWheel.show(); + $.ajax({ + data: createURL("command=removeFromLoadBalancerRule&id="+fromdb(obj.loadBalancerId)+"&virtualmachineids="+fromdb(obj.vmId)), + dataType: "json", + success: function(json) { + var lbJSON = json.removefromloadbalancerruleresponse; + var jobId = lbJSON.jobid; + var timerKey = "removeFromLoadBalancerRuleJob_"+jobId; + $("body").everyTime( + 5000, + 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 + refreshLbVmSelect($("#loadBalancer_" + obj.loadBalancerId), obj.loadBalancerId); + $template.fadeOut("slow", function(event) { + $(this).remove(); + }); + } 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); + $("#dialog_error").text(errorMsg).dialog("open"); + $spinningWheel.hide(); + } + } + }, + error: function(XMLHttpResponse) { + $("body").stopTime(timerKey); + handleError(XMLHttpResponse); + $spinningWheel.hide(); + } + }); + }, + 0 + ); + }, + error: function(XMLHttpResponse) { + handleError(XMLHttpResponse); + $spinningWheel.hide(); + } + }); + return false; + }); +} + +function refreshLbVmSelect($template, loadBalancerId) { + var vmSelect = $template.find("#add_vm_to_lb_row #vm_select"); + // Load the select box with the VMs that haven't been applied a LB rule to. + $.ajax({ + cache: false, + data: createURL("command=listLoadBalancerRuleInstances&id="+loadBalancerId+"&applied=false"), + dataType: "json", + success: function(json) { + var instances = json.listloadbalancerruleinstancesresponse.loadbalancerruleinstance; + vmSelect.empty(); + if (instances != null && instances.length > 0) { + for (var i = 0; i < instances.length; i++) { + var vmName = getVmName(instances[i].name, instances[i].displayname); + html = $(""); + html.data("vmPrivateIp", instances[i].ipaddress); + html.data("vmName", vmName); + vmSelect.append(html); + } + } else { + vmSelect.append(""); + } + } + }); +} + +//***** Load Balancer tab (end) ************************************************************************************************************