/** * 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 . * */ var g_zoneIds = []; var g_zoneNames = []; function afterLoadTemplateJSP() { var $detailsTab = $("#right_panel_content #tab_content_details"); //add button *** /* var formatSelect = $("#dialog_add_template #add_template_format").empty(); if (getHypervisorType() == "kvm") formatSelect.append(""); else if (getHypervisorType() == "xenserver") formatSelect.append(""); */ $("#dialog_add_template #add_template_hypervisor").bind("change", function(event) { var formatSelect = $("#dialog_add_template #add_template_format").empty(); var selectedHypervisorType = $(this).val(); if(selectedHypervisorType == "XenServer") formatSelect.append(""); else if(selectedHypervisorType == "VmWare") formatSelect.append(""); else if(selectedHypervisorType == "KVM") formatSelect.append(""); return false; }); $("#dialog_add_template #add_template_hypervisor").change(); if(isAdmin()) $("#dialog_add_template #add_template_featured_container, #dialog_edit_template #edit_template_featured_container").show(); else $("#dialog_add_template #add_template_featured_container, #dialog_edit_template #edit_template_featured_container").hide(); //add button *** $("#midmenu_add_link").find("#label").text("Add Template"); $("#midmenu_add_link").show(); $("#midmenu_add_link").unbind("click").bind("click", function(event) { $("#dialog_add_template") .dialog('option', 'buttons', { "Create": function() { var thisDialog = $(this); // validate values var isValid = true; isValid &= validateFilename("Name", thisDialog.find("#add_template_name"), thisDialog.find("#add_template_name_errormsg")); isValid &= validateString("Display Text", thisDialog.find("#add_template_display_text"), thisDialog.find("#add_template_display_text_errormsg")); isValid &= validateString("URL", thisDialog.find("#add_template_url"), thisDialog.find("#add_template_url_errormsg")); if (!isValid) return; thisDialog.dialog("close"); var name = trim(thisDialog.find("#add_template_name").val()); var desc = trim(thisDialog.find("#add_template_display_text").val()); var url = trim(thisDialog.find("#add_template_url").val()); var zoneId = thisDialog.find("#add_template_zone").val(); var format = thisDialog.find("#add_template_format").val(); var password = thisDialog.find("#add_template_password").val(); var isPublic = thisDialog.find("#add_template_public").val(); var osType = thisDialog.find("#add_template_os_type").val(); var hypervisor = thisDialog.find("#add_template_hypervisor").val(); var moreCriteria = []; if(thisDialog.find("#add_template_featured_container").css("display")!="none") { var isFeatured = thisDialog.find("#add_template_featured").val(); moreCriteria.push("&isfeatured="+isFeatured); } var $midmenuItem1 = beforeAddingMidMenuItem() ; $.ajax({ data: createURL("command=registerTemplate&name="+todb(name)+"&displayText="+todb(desc)+"&url="+encodeURIComponent(url)+"&zoneid="+zoneId+"&ispublic="+isPublic+moreCriteria.join("")+"&format="+format+"&passwordEnabled="+password+"&osTypeId="+osType+"&hypervisor="+hypervisor+"&response=json"), dataType: "json", success: function(json) { var items = json.registertemplateresponse.template; templateToMidmenu(items[0], $midmenuItem1); bindClickToMidMenu($midmenuItem1, templateToRightPanel, templateGetMidmenuId); afterAddingMidMenuItem($midmenuItem1, true); if(items.length > 1) { for(var i=1; iAll Zones"); $.ajax({ data: createURL("command=listZones&available=true"+maxPageSize), dataType: "json", success: function(json) { var zones = json.listzonesresponse.zone; if (zones != null && zones.length > 0) { for (var i = 0; i < zones.length; i++) { addTemplateZoneField.append(""); g_zoneIds.push(zones[i].id); g_zoneNames.push(zones[i].name); } } } }); $.ajax({ data: createURL("command=listOsTypes&response=json"+maxPageSize), dataType: "json", success: function(json) { types = json.listostypesresponse.ostype; if (types != null && types.length > 0) { var osTypeDropdownAdd = $("#dialog_add_template #add_template_os_type"); var osTypeDropdownEdit = $detailsTab.find("#ostypename_edit").empty(); if(types != null && types.length > 0) { for(var i = 0; i < types.length; i++) { var html = ""; osTypeDropdownAdd.append(html); osTypeDropdownEdit.append(html); } } } } }); $.ajax({ data: createURL("command=listServiceOfferings&response=json"+maxPageSize), dataType: "json", success: function(json) { var items = json.listserviceofferingsresponse.serviceoffering; if(items != null && items.length > 0 ) { var serviceOfferingField = $("#dialog_create_vm_from_template #service_offering").empty(); for(var i = 0; i < items.length; i++) serviceOfferingField.append(""); } } }); $.ajax({ data: createURL("command=listDiskOfferings&response=json"+maxPageSize), dataType: "json", success: function(json) { var items = json.listdiskofferingsresponse.diskoffering; if(items != null && items.length > 0 ) { var diskOfferingField = $("#dialog_create_vm_from_template #disk_offering").empty(); diskOfferingField.append(""); for(var i = 0; i < items.length; i++) diskOfferingField.append(""); } } }); //initialize dialog box *** initDialog("dialog_confirmation_delete_template_all_zones"); initDialog("dialog_confirmation_delete_template"); initDialog("dialog_add_template", 450); initDialog("dialog_copy_template", 300); initDialog("dialog_create_vm_from_template", 300); } function templateGetMidmenuId(jsonObj) { return "midmenuItem_" + jsonObj.id + "_" + fromdb(jsonObj.zonename).replace(/\s/g, ""); //remove all spaces in zonename } function templateToMidmenu(jsonObj, $midmenuItem1) { var id = templateGetMidmenuId(jsonObj); $midmenuItem1.attr("id", id); $midmenuItem1.data("jsonObj", jsonObj); var $iconContainer = $midmenuItem1.find("#icon_container").show(); setIconByOsType(jsonObj.ostypename, $iconContainer.find("#icon")); $midmenuItem1.find("#first_row").text(fromdb(jsonObj.name).substring(0,25)); $midmenuItem1.find("#second_row").text(fromdb(jsonObj.zonename).substring(0,25)); } function templateToRightPanel($midmenuItem1) { copyActionInfoFromMidMenuToRightPanel($midmenuItem1); $("#right_panel_content").data("$midmenuItem1", $midmenuItem1); templateJsonToDetailsTab(); } function templateJsonToDetailsTab() { var $thisTab = $("#right_panel_content #tab_content_details"); $thisTab.find("#tab_container").hide(); $thisTab.find("#tab_spinning_wheel").show(); var $midmenuItem1 = $("#right_panel_content").data("$midmenuItem1"); var id = $midmenuItem1.data("jsonObj").id; var zoneid = $midmenuItem1.data("jsonObj").zoneid; var jsonObj; $.ajax({ data: createURL("command=listTemplates&templatefilter=self&id="+id+"&zoneid="+zoneid), dataType: "json", async: false, success: function(json) { var items = json.listtemplatesresponse.template; if(items != null && items.length > 0) jsonObj = items[0]; } }); $thisTab.data("jsonObj", jsonObj); $midmenuItem1.data("jsonObj", jsonObj); $thisTab.find("#id").text(fromdb(jsonObj.id)); $thisTab.find("#zonename").text(fromdb(jsonObj.zonename)); $thisTab.find("#name").text(fromdb(jsonObj.name)); $thisTab.find("#name_edit").val(fromdb(jsonObj.name)); $thisTab.find("#displaytext").text(fromdb(jsonObj.displaytext)); $thisTab.find("#displaytext_edit").val(fromdb(jsonObj.displaytext)); var status = "Ready"; if (jsonObj.isready == "false") status = fromdb(jsonObj.templatestatus); setTemplateStateInRightPanel(status, $thisTab.find("#status")); if(jsonObj.size != null) $thisTab.find("#size").text(convertBytes(parseInt(jsonObj.size))); else $thisTab.find("#size").text(""); setBooleanReadField(jsonObj.passwordenabled, $thisTab.find("#passwordenabled")); setBooleanEditField(jsonObj.passwordenabled, $thisTab.find("#passwordenabled_edit")); //$thisTab.find("#passwordenabled_edit").val(jsonObj.passwordenabled); setBooleanReadField(jsonObj.ispublic, $thisTab.find("#ispublic")); setBooleanEditField(jsonObj.ispublic, $thisTab.find("#ispublic_edit")); //$thisTab.find("#ispublic_edit").val(jsonObj.ispublic); setBooleanReadField(jsonObj.isfeatured, $thisTab.find("#isfeatured")); setBooleanEditField(jsonObj.isfeatured, $thisTab.find("#isfeatured_edit")); //$thisTab.find("#isfeatured_edit").val(jsonObj.isfeatured); setBooleanReadField(jsonObj.crossZones, $thisTab.find("#crossZones")); $thisTab.find("#ostypename").text(fromdb(jsonObj.ostypename)); $thisTab.find("#ostypename_edit").val(jsonObj.ostypeid); $thisTab.find("#account").text(fromdb(jsonObj.account)); $thisTab.find("#domain").text(fromdb(jsonObj.domain)); setDateField(jsonObj.created, $thisTab.find("#created")); //actions *** var $actionMenu = $("#right_panel_content #tab_content_details #action_link #action_menu"); $actionMenu.find("#action_list").empty(); var noAvailableActions = true; // action Edit, Copy, Create VM if ((isUser() && jsonObj.ispublic == "true" && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)) || jsonObj.id==DomRTemplateId || jsonObj.isready == "false") { //$("#edit_button").hide(); } else { buildActionLinkForTab("Edit Template", templateActionMap, $actionMenu, $midmenuItem1, $thisTab); //$("#edit_button").show(); buildActionLinkForTab("Copy Template", templateActionMap, $actionMenu, $midmenuItem1, $thisTab); buildActionLinkForTab("Create VM", templateActionMap, $actionMenu, $midmenuItem1, $thisTab); noAvailableActions = false; } // action Delete if (((isUser() && jsonObj.ispublic == "true" && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)) || jsonObj.id==DomRTemplateId) || (jsonObj.isready == "false" && jsonObj.templatestatus != null && jsonObj.templatestatus.indexOf("% Downloaded") != -1)) { //template.find("#template_delete_container").hide(); } else { buildActionLinkForTab("Delete Template", templateActionMap, $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(); } //setIconByOsType() is shared by template page and ISO page function setIconByOsType(osType, $field) { if (osType == null || osType.length == 0) return; if (osType.match("^CentOS") != null) $field.attr("src", "images/midmenuicon_template_centos.png"); else if (osType.match("^Windows") != null) $field.attr("src", "images/midmenuicon_template_windows.png"); else $field.attr("src", "images/midmenuicon_template_linux.png"); } function templateClearRightPanel() { templateClearDetailsTab(); } function templateClearDetailsTab() { var $thisTab = $("#right_panel_content #tab_content_details"); $thisTab.data("jsonObj", null); $thisTab.find("#id").text(""); $thisTab.find("#zonename").text(""); $thisTab.find("#name").text(""); $thisTab.find("#name_edit").val(""); $thisTab.find("#displaytext").text(""); $thisTab.find("#displaytext_edit").val(""); $thisTab.find("#status").text(""); $thisTab.find("#passwordenabled").text(""); $thisTab.find("#passwordenabled_edit").val(null); $thisTab.find("#ispublic").text(""); $thisTab.find("#ispublic_edit").val(null); $thisTab.find("#isfeatured").text(""); $thisTab.find("#isfeatured_edit").val(null); $thisTab.find("#crossZones").text(""); $thisTab.find("#ostypename").text(""); $thisTab.find("#ostypename_edit").val(null); $thisTab.find("#account").text(""); $thisTab.find("#size").text(""); $thisTab.find("#created").text(""); } var templateActionMap = { "Edit Template": { dialogBeforeActionFn : doEditTemplate }, "Delete Template": { isAsyncJob: true, asyncJobResponse: "deletetemplateresponse", dialogBeforeActionFn : doDeleteTemplate, inProcessText: "Deleting Template....", afterActionSeccessFn: function(json, $midmenuItem1, id){ $midmenuItem1.remove(); clearRightPanel(); templateClearRightPanel(); } }, "Copy Template": { isAsyncJob: true, asyncJobResponse: "copytemplateresponse", dialogBeforeActionFn : doCopyTemplate, inProcessText: "Copying Template....", afterActionSeccessFn: function(json, $midmenuItem1, id){} } , "Create VM": { isAsyncJob: true, asyncJobResponse: "deployvirtualmachineresponse", dialogBeforeActionFn : doCreateVMFromTemplate, inProcessText: "Creating VM....", afterActionSeccessFn: function(json, $midmenuItem1, id){} } } var DomRTemplateId = 1; function doEditTemplate($actionLink, $detailsTab, $midmenuItem1) { //var $detailsTab = $("#right_panel_content #tab_content_details"); var $readonlyFields = $detailsTab.find("#name, #displaytext, #passwordenabled, #ispublic, #isfeatured, #ostypename"); var $editFields = $detailsTab.find("#name_edit, #displaytext_edit, #passwordenabled_edit, #ispublic_edit, #isfeatured_edit, #ostypename_edit"); $readonlyFields.hide(); $editFields.show(); $detailsTab.find("#cancel_button, #save_button").show(); $detailsTab.find("#cancel_button").unbind("click").bind("click", function(event){ $editFields.hide(); $readonlyFields.show(); $("#save_button, #cancel_button").hide(); return false; }); $detailsTab.find("#save_button").unbind("click").bind("click", function(event){ doEditTemplate2($actionLink, $detailsTab, $midmenuItem1, $readonlyFields, $editFields); return false; }); } function doEditTemplate2($actionLink, $detailsTab, $midmenuItem1, $readonlyFields, $editFields) { // validate values var isValid = true; isValid &= validateString("Name", $detailsTab.find("#name_edit"), $detailsTab.find("#name_edit_errormsg")); isValid &= validateString("Display Text", $detailsTab.find("#displaytext_edit"), $detailsTab.find("#displaytext_edit_errormsg")); if (!isValid) return; var jsonObj = $detailsTab.data("jsonObj"); var id = jsonObj.id; var midmenuId = templateGetMidmenuId(jsonObj); //updateTemplate var array1 = []; var oldName = jsonObj.name var newName = trim($detailsTab.find("#name_edit").val()); if(newName != oldName) array1.push("&name="+todb(newName)); var oldDesc = jsonObj.displaytext; var newDesc = trim($detailsTab.find("#displaytext_edit").val()); if(newDesc != oldDesc) array1.push("&displaytext="+todb(newDesc)); var oldPasswordEnabled = jsonObj.passwordenabled.toString(); var newPasswordEnabled = $detailsTab.find("#passwordenabled_edit").val(); if(newPasswordEnabled != oldPasswordEnabled) array1.push("&passwordenabled="+newPasswordEnabled); var oldOsTypeId = jsonObj.ostypeid; var newOsTypeId = $detailsTab.find("#ostypename_edit").val(); if(newOsTypeId != oldOsTypeId) array1.push("&ostypeid="+newOsTypeId); if(array1.length > 0) { $.ajax({ data: createURL("command=updateTemplate&id="+id+array1.join("")), dataType: "json", async: false, success: function(json) { $detailsTab.find("#name").text(newName); $detailsTab.find("#displaytext").text(newDesc); setBooleanReadField(newPasswordEnabled, $detailsTab.find("#passwordenabled")); $detailsTab.find("#ostypename").text($detailsTab.find("#ostypename_edit option:selected").text()); } }); } //updateTemplatePermissions var array2 = []; var oldIsPublic = jsonObj.ispublic.toString(); var newIsPublic = $detailsTab.find("#ispublic_edit").val(); if(newIsPublic != oldIsPublic) array2.push("&ispublic="+newIsPublic); var oldIsFeatured = jsonObj.isfeatured.toString(); var newIsFeatured = $detailsTab.find("#isfeatured_edit").val(); if(newIsFeatured != oldIsFeatured) array2.push("&isfeatured="+newIsFeatured); if(array2.length > 0) { $.ajax({ data: createURL("command=updateTemplatePermissions&id="+id+array2.join("")), dataType: "json", async: false, success: function(json) { setBooleanReadField(newIsPublic, $detailsTab.find("#ispublic")); setBooleanReadField(newIsFeatured, $detailsTab.find("#isfeatured")); } }); } $editFields.hide(); $readonlyFields.show(); $("#save_button, #cancel_button").hide(); } function doDeleteTemplate($actionLink, $detailsTab, $midmenuItem1) { var jsonObj = $detailsTab.data("jsonObj"); var id = jsonObj.id; var name = jsonObj.name; var zoneId = jsonObj.zoneid; var moreCriteria = []; if (zoneId != null) moreCriteria.push("&zoneid="+zoneId); var $dialog1; if(jsonObj.crossZones == "true") $dialog1 = $("#dialog_confirmation_delete_template_all_zones"); else $dialog1 = $("#dialog_confirmation_delete_template"); $dialog1 .dialog('option', 'buttons', { "Confirm": function() { $(this).dialog("close"); var apiCommand = "command=deleteTemplate&id="+id+moreCriteria.join(""); doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $detailsTab); }, "Cancel": function() { $(this).dialog("close"); } }).dialog("open"); } function populateZoneFieldExcludeSourceZone(zoneField, excludeZoneId) { zoneField.empty(); if (g_zoneIds != null && g_zoneIds.length > 0) { for (var i = 0; i < g_zoneIds.length; i++) { if(g_zoneIds[i] != excludeZoneId) zoneField.append(""); } } } function doCopyTemplate($actionLink, $detailsTab, $midmenuItem1) { var jsonObj = $detailsTab.data("jsonObj"); var id = jsonObj.id; var name = jsonObj.name; var sourceZoneId = jsonObj.zoneid; populateZoneFieldExcludeSourceZone($("#dialog_copy_template #copy_template_zone"), sourceZoneId); $("#dialog_copy_template #copy_template_name_text").text(name); var sourceZoneName = jsonObj.zonename; $("#dialog_copy_template #copy_template_source_zone_text").text(sourceZoneName); $("#dialog_copy_template") .dialog('option', 'buttons', { "OK": function() { var thisDialog = $(this); thisDialog.dialog("close"); var isValid = true; isValid &= validateDropDownBox("Zone", thisDialog.find("#copy_template_zone"), thisDialog.find("#copy_template_zone_errormsg"), false); //reset error text if (!isValid) return; var destZoneId = thisDialog.find("#copy_template_zone").val(); var id = $detailsTab.data("jsonObj").id; var apiCommand = "command=copyTemplate&id="+id+"&sourcezoneid="+sourceZoneId+"&destzoneid="+destZoneId; doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $detailsTab); }, "Cancel": function() { $(this).dialog("close"); } }).dialog("open"); } function doCreateVMFromTemplate($actionLink, $detailsTab, $midmenuItem1) { var jsonObj = $detailsTab.data("jsonObj"); var id = jsonObj.id; var name = jsonObj.name; var zoneId = jsonObj.zoneid; var createVmDialog = $("#dialog_create_vm_from_template"); createVmDialog.find("#p_name").text(name); createVmDialog .dialog('option', 'buttons', { "Create": function() { var thisDialog = $(this); thisDialog.dialog("close"); // validate values var isValid = true; isValid &= validateString("Name", thisDialog.find("#name"), thisDialog.find("#name_errormsg"), true); isValid &= validateString("Group", thisDialog.find("#group"), thisDialog.find("#group_errormsg"), true); if (!isValid) return; var array1 = []; var name = trim(thisDialog.find("#name").val()); array1.push("&displayname="+todb(name)); var group = trim(thisDialog.find("#group").val()); array1.push("&group="+todb(group)); var serviceOfferingId = thisDialog.find("#service_offering").val(); array1.push("&serviceOfferingId="+serviceOfferingId); var diskOfferingId = thisDialog.find("#disk_offering").val(); if(diskOfferingId != null && diskOfferingId.length > 0) array1.push("&diskOfferingId="+diskOfferingId); var apiCommand = "command=deployVirtualMachine&zoneId="+zoneId+"&templateId="+id+array1.join(""); doActionToTab(id, $actionLink, apiCommand, $midmenuItem1, $detailsTab); }, "Cancel": function() { $(this).dialog("close"); } }).dialog("open"); }