mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
1083 lines
51 KiB
JavaScript
1083 lines
51 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@
|
|
|
|
var DomRTemplateId = 1;
|
|
|
|
function showTemplatesTab() {
|
|
// Manage Templates
|
|
// *** Template (begin) ***
|
|
activateDialog($("#dialog_edit_template").dialog({
|
|
width:450,
|
|
autoOpen: false,
|
|
modal: true,
|
|
zIndex: 2000
|
|
}));
|
|
|
|
activateDialog($("#dialog_add_template").dialog({
|
|
width:450,
|
|
autoOpen: false,
|
|
modal: true,
|
|
zIndex: 2000
|
|
}));
|
|
|
|
activateDialog($("#dialog_copy_template").dialog({
|
|
width:300,
|
|
autoOpen: false,
|
|
modal: true,
|
|
zIndex: 2000
|
|
}));
|
|
|
|
activateDialog($("#dialog_create_vm_from_template").dialog({
|
|
width:300,
|
|
autoOpen: false,
|
|
modal: true,
|
|
zIndex: 2000
|
|
}));
|
|
|
|
|
|
var g_zoneIds = [], g_zoneNames = [];
|
|
var addTemplateZoneField = $("#dialog_add_template #add_template_zone");
|
|
var addIsoZoneField = $("#dialog_add_iso #add_iso_zone");
|
|
// Add default zone
|
|
if (isAdmin()) {
|
|
addTemplateZoneField.append("<option value='-1'>All Zones</option>");
|
|
addIsoZoneField.append("<option value='-1'>All Zones</option>");
|
|
}
|
|
$.ajax({
|
|
data: createURL("command=listZones&available=true&response=json"+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("<option value='" + zones[i].id + "'>" + sanitizeXSS(zones[i].name) + "</option>");
|
|
addIsoZoneField.append("<option value='" + zones[i].id + "'>" + sanitizeXSS(zones[i].name) + "</option>");
|
|
g_zoneIds.push(zones[i].id);
|
|
g_zoneNames.push(zones[i].name);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
function populateZoneField(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("<option value='" + g_zoneIds[i] + "'>" + sanitizeXSS(g_zoneNames[i]) + "</option>");
|
|
}
|
|
}
|
|
}
|
|
|
|
$.ajax({
|
|
data: createURL("command=listOsTypes&response=json"+maxPageSize),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
types = json.listostypesresponse.ostype;
|
|
if (types != null && types.length > 0) {
|
|
var templateSelect = $("#dialog_add_template #add_template_os_type, #dialog_edit_template #edit_template_os_type").empty();
|
|
var isoSelect = $("#dialog_add_iso #add_iso_os_type").empty();
|
|
for (var i = 0; i < types.length; i++) {
|
|
var html = "<option value='" + types[i].id + "'>" + types[i].description + "</option>";
|
|
templateSelect.append(html);
|
|
isoSelect.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("<option value='" + items[i].id + "'>" + sanitizeXSS(items[i].name) + "</option>");
|
|
}
|
|
}
|
|
});
|
|
|
|
$.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();
|
|
for(var i = 0; i < items.length; i++)
|
|
diskOfferingField.append("<option value='" + items[i].id + "'>" + sanitizeXSS(items[i].name) + "</option>");
|
|
}
|
|
|
|
}
|
|
});
|
|
|
|
$("#template_action_new").show();
|
|
var formatSelect = $("#add_template_format").empty();
|
|
if (getHypervisorType() == "kvm") {
|
|
formatSelect.append("<option value='QCOW2'>QCOW2</option>");
|
|
} else if (getHypervisorType() == "xenserver") {
|
|
formatSelect.append("<option value='VHD'>VHD</option>");
|
|
}
|
|
|
|
$("#template_action_new").bind("click", function(event) {
|
|
$("#dialog_add_template")
|
|
.dialog('option', 'buttons', {
|
|
"Create": function() {
|
|
var thisDialog = $(this);
|
|
|
|
// validate values
|
|
var isValid = true;
|
|
isValid &= validateString("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;
|
|
|
|
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 moreCriteria = [];
|
|
if(thisDialog.find("#add_template_featured_container").css("display")!="none") {
|
|
var isFeatured = thisDialog.find("#add_template_featured").val();
|
|
moreCriteria.push("&isfeatured="+isFeatured);
|
|
}
|
|
|
|
thisDialog.dialog("close");
|
|
|
|
var submenuContent = $("#submenu_content_template");
|
|
var template = $("#vm_template_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"));
|
|
|
|
$.ajax({
|
|
data: createURL("command=registerTemplate&name="+encodeURIComponent(name)+"&displayText="+encodeURIComponent(desc)+"&url="+encodeURIComponent(url)+"&zoneid="+zoneId+"&ispublic="+isPublic+moreCriteria.join("")+"&format="+format+"&passwordEnabled="+password+"&osTypeId="+osType+"&response=json"),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var result = json.registertemplateresponse;
|
|
if($("#template_type").val() == "self") {
|
|
templateJSONToTemplate(result.template[0], template);
|
|
changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1);
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
|
|
if(result.template.length > 1) {
|
|
for(var i=1; i<result.template.length; i++) {
|
|
var template2 = $("#vm_template_template").clone(true);
|
|
templateJSONToTemplate(result.template[i], template2);
|
|
submenuContent.find("#grid_content").prepend(template2.fadeIn("slow"));
|
|
changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
$("#template_type").val("self");
|
|
$("#template_type").change();
|
|
}
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleError(XMLHttpResponse);
|
|
template.slideUp("slow", function(){ $(this).remove(); } );
|
|
}
|
|
});
|
|
},
|
|
"Cancel": function() {
|
|
$(this).dialog("close");
|
|
}
|
|
}).dialog("open");
|
|
return false;
|
|
});
|
|
|
|
function templateJSONToTemplate(json, template) {
|
|
(index++ % 2 == 0)? template.addClass("dbsmallrow_odd"):template.addClass("dbsmallrow_even");
|
|
template.attr("id", "template"+json.id+"_zone"+json.zoneid);
|
|
template.data("templateId", json.id);
|
|
template.data("zoneId",sanitizeXSS(json.zoneid));
|
|
template.data("zoneName",sanitizeXSS(json.zonename));
|
|
template.data("name", sanitizeXSS(json.name));
|
|
|
|
template.find("#template_id").text(json.id);
|
|
template.find("#template_zone").text(json.zonename);
|
|
template.find("#template_name").text(json.name);
|
|
template.find("#template_display_text").text(json.displaytext);
|
|
template.find("#template_account").text(json.account);
|
|
if(json.size != null)
|
|
template.find("#template_size").text(convertBytes(parseInt(json.size)));
|
|
|
|
var status = "Ready";
|
|
if (json.isready == "false") {
|
|
status = json.templatestatus;
|
|
}
|
|
template.find("#template_status").text(status);
|
|
|
|
setDateField(json.created, template.find("#template_created"));
|
|
|
|
/*
|
|
if (json.bits == "32")
|
|
template.find("#template_bit").attr("src", "images/32bit_icon.gif");
|
|
if (json.requireshvm == "false")
|
|
template.find("#template_hvm").attr("src", "images/hvm_nonselectedicon.gif");
|
|
*/
|
|
if (json.passwordenabled == "false")
|
|
template.find("#template_password").attr("src", "images/password_nonselectedicon.gif");
|
|
|
|
if (json.ispublic == "false")
|
|
template.find("#template_public").attr("src", "images/public_nonselectedicon.gif");
|
|
|
|
if (json.isfeatured == "false")
|
|
template.find("#template_featured").attr("src", "images/featured_nonselectedicon.gif");
|
|
|
|
if (json.crossZones == "false")
|
|
template.find("#template_crosszones").attr("src", "images/crosszone_nonselectedicon.gif");
|
|
|
|
template.find("#template_ostype").text(json.ostypename);
|
|
|
|
// hide action link Edit, Copy, Create VM
|
|
if ((isUser() && json.ispublic == "true" && !(json.domainid == g_domainid && json.account == g_account)) || json.id==DomRTemplateId || json.isready == "false")
|
|
template.find("#template_edit_container, #template_copy_container, #template_create_vm_container").hide();
|
|
|
|
// hide action link Delete
|
|
if (((isUser() && json.ispublic == "true" && !(json.domainid == g_domainid && json.account == g_account)) || json.id==DomRTemplateId) || (json.isready == "false" && json.templatestatus != null && json.templatestatus.indexOf("% Downloaded") != -1))
|
|
template.find("#template_delete_container").hide();
|
|
|
|
var dialogEditTemplate = $("#dialog_edit_template");
|
|
var that = template;
|
|
template.find("#template_edit").data("templateId", json.id).unbind("click").bind("click", function(event) {
|
|
event.preventDefault();
|
|
var id = $(this).data("templateId");
|
|
var template = that;
|
|
|
|
var oldName = json.name;
|
|
var oldDesc = json.displaytext;
|
|
var oldIsPublic = json.ispublic;
|
|
var oldIsFeatured = json.isfeatured;
|
|
var oldPasswordEnabled = json.passwordenabled;
|
|
var oldOsTypeId = json.ostypeid;
|
|
|
|
dialogEditTemplate.find("#edit_template_name").val(oldName);
|
|
dialogEditTemplate.find("#edit_template_display_text").val(oldDesc);
|
|
dialogEditTemplate.find("#edit_template_public").val(oldIsPublic);
|
|
dialogEditTemplate.find("#edit_template_featured").val(oldIsFeatured);
|
|
dialogEditTemplate.find("#edit_template_password").val(oldPasswordEnabled);
|
|
dialogEditTemplate.find("#edit_template_os_type").val(oldOsTypeId);
|
|
|
|
dialogEditTemplate
|
|
.dialog('option', 'buttons', {
|
|
"Save": function() {
|
|
var thisDialog = $(this);
|
|
|
|
// validate values
|
|
var isValid = true;
|
|
isValid &= validateString("Name", thisDialog.find("#edit_template_name"), thisDialog.find("#edit_template_name_errormsg"));
|
|
isValid &= validateString("Display Text", thisDialog.find("#edit_template_display_text"), thisDialog.find("#edit_template_display_text_errormsg"));
|
|
if (!isValid) return;
|
|
|
|
var newName = trim(thisDialog.find("#edit_template_name").val());
|
|
var newDesc = trim(thisDialog.find("#edit_template_display_text").val());
|
|
var newPasswordEnabled = thisDialog.find("#edit_template_password").val();
|
|
var newOsTypeId = thisDialog.find("#edit_template_os_type").val();
|
|
|
|
var array1 = [];
|
|
if(newName!=oldName)
|
|
array1.push("&name="+encodeURIComponent(newName));
|
|
if(newDesc!=oldDesc)
|
|
array1.push("&displaytext="+encodeURIComponent(newDesc));
|
|
if(newPasswordEnabled!=oldPasswordEnabled)
|
|
array1.push("&passwordenabled="+newPasswordEnabled);
|
|
if(newOsTypeId!=oldOsTypeId)
|
|
array1.push("&ostypeid="+encodeURIComponent(newOsTypeId));
|
|
|
|
if(array1.length > 0) {
|
|
$.ajax({
|
|
data: createURL("command=updateTemplate&id="+id+array1.join("")+"&response=json"),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
templateJSONToTemplate(json.updatetemplateresponse, template);
|
|
//template.find("#template_name").text(newName);
|
|
//template.find("#template_display_text").text(newDesc);
|
|
}
|
|
});
|
|
}
|
|
|
|
var isModified = false;
|
|
var newIsPublic = thisDialog.find("#edit_template_public").val();
|
|
if(newIsPublic != oldIsPublic)
|
|
isModified = true;
|
|
var moreCriteria = [];
|
|
if(thisDialog.find("#edit_template_featured_container").css("display")!="none") {
|
|
var newIsFeatured = thisDialog.find("#edit_template_featured").val();
|
|
moreCriteria.push("&isfeatured="+newIsFeatured);
|
|
if(newIsFeatured != oldIsFeatured)
|
|
isModified = true;
|
|
}
|
|
if(isModified) {
|
|
$.ajax({
|
|
data: createURL("command=updateTemplatePermissions&id="+id+"&ispublic="+newIsPublic+"&isfeatured="+newIsFeatured+"&response=json"),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
(newIsPublic=="true")? template.find("#template_public").attr("src", "images/public_selectedicon.gif"):template.find("#template_public").attr("src", "images/public_nonselectedicon.gif");
|
|
(newIsFeatured=="true")? template.find("#template_featured").attr("src", "images/featured_selectedicon.gif"):template.find("#template_featured").attr("src", "images/featured_nonselectedicon.gif");
|
|
}
|
|
});
|
|
}
|
|
|
|
thisDialog.dialog("close");
|
|
},
|
|
"Cancel": function() {
|
|
$(this).dialog("close");
|
|
}
|
|
}).dialog("open");
|
|
});
|
|
var that = template;
|
|
template.find("#template_delete").data("parentElementId", "template"+json.id+"_zone"+json.zoneid).unbind("click").bind("click", function(event) {
|
|
var moreCriteria = [];
|
|
var parentElementId = $(this).data("parentElementId");
|
|
var thisTemplate = that;
|
|
var id = thisTemplate.data("templateId");
|
|
var name = thisTemplate.data("name");
|
|
var zoneId = thisTemplate.data("zoneId");
|
|
if (zoneId != null)
|
|
moreCriteria.push("&zoneid="+zoneId);
|
|
|
|
var htmlMsg;
|
|
if(json.crossZones == "true")
|
|
htmlMsg = "<p>Template <b>"+name+"</b> is used by all zones. Please confirm you want to delete it from all zones.</p>";
|
|
else
|
|
htmlMsg = "<p>Please confirm you want to delete your template <b>"+name+"</b>.</p>";
|
|
|
|
$("#dialog_confirmation")
|
|
.html(htmlMsg)
|
|
.dialog('option', 'buttons', {
|
|
"Confirm": function() {
|
|
$(this).dialog("close");
|
|
|
|
var loadingImg = thisTemplate.find(".adding_loading");
|
|
var rowContainer = thisTemplate.find("#row_container");
|
|
loadingImg.find(".adding_text").text("Deleting....");
|
|
loadingImg.show();
|
|
rowContainer.hide();
|
|
|
|
$.ajax({
|
|
data: createURL("command=deleteTemplate&id="+id+moreCriteria.join("")+"&response=json"),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var jobId = json.deletetemplateresponse.jobid;
|
|
var timerKey = "deleteTemplateJob"+jobId;
|
|
|
|
$("body").everyTime(2000, timerKey, function() {
|
|
$.ajax({
|
|
data: createURL("command=queryAsyncJobResult&jobId="+json.deletetemplateresponse.jobid+"&response=json"),
|
|
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) { //success
|
|
that.slideUp("slow", function() { $(this).remove() });
|
|
changeGridRowsTotal($("#submenu_content_template").find("#grid_rows_total"), -1);
|
|
} else if (result.jobstatus == 2) {
|
|
$("#dialog_alert").html("<p>" + sanitizeXSS(result.jobresult) + "</p>").dialog("open");
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
}
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
$("body").stopTime(timerKey);
|
|
handleError(XMLHttpResponse);
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
});
|
|
}, 0);
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleError(XMLHttpResponse);
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
});
|
|
},
|
|
"Cancel": function() {
|
|
$(this).dialog("close");
|
|
}
|
|
}).dialog("open");
|
|
});
|
|
template.find("#template_copy").data("parentElementId", "template"+json.id+"_zone"+json.zoneid).unbind("click").bind("click", function(event) {
|
|
var parentElementId = $(this).data("parentElementId");
|
|
var thisTemplate = $("#"+parentElementId);
|
|
var id = thisTemplate.data("templateId");
|
|
var name = thisTemplate.data("name");
|
|
var sourceZoneId = thisTemplate.data("zoneId");
|
|
|
|
populateZoneField($("#dialog_copy_template #copy_template_zone"), sourceZoneId);
|
|
|
|
$("#dialog_copy_template #copy_template_name_text").text(name);
|
|
|
|
var sourceZoneName = thisTemplate.data("zoneName");
|
|
$("#dialog_copy_template #copy_template_source_zone_text").text(sourceZoneName);
|
|
|
|
$("#dialog_copy_template")
|
|
.dialog('option', 'buttons', {
|
|
"OK": function() {
|
|
var thisDialog = $(this);
|
|
|
|
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();
|
|
thisDialog.dialog("close");
|
|
|
|
var loadingImg = thisTemplate.find(".adding_loading");
|
|
var rowContainer = thisTemplate.find("#row_container");
|
|
loadingImg.find(".adding_text").text("Copying....");
|
|
loadingImg.show();
|
|
rowContainer.hide();
|
|
|
|
$.ajax({
|
|
data: createURL("command=copyTemplate&id="+id+"&sourcezoneid="+sourceZoneId+"&destzoneid="+destZoneId+"&response=json"),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var jobId = json.copytemplateresponse.jobid;
|
|
var timerKey = "copyTemplateJob"+jobId;
|
|
|
|
$("body").everyTime(2000, timerKey, function() {
|
|
$.ajax({
|
|
data: createURL("command=queryAsyncJobResult&jobId="+json.copytemplateresponse.jobid+"&response=json"),
|
|
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) {
|
|
$("#dialog_info").html("<p>Template download started (ID: <b>"+result.copytemplateresponse[0].id+"</b>, Zone: <b>"+sanitizeXSS(result.copytemplateresponse[0].zonename)+"</b>, Name: <b>"+sanitizeXSS(result.copytemplateresponse[0].name)+"</b>) . Check the progress...</p>").dialog("open");
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
$("#template_type").val("self");
|
|
$("#template_type").change();
|
|
} else if (result.jobstatus == 2) {
|
|
$("#dialog_alert").html("<p>" + sanitizeXSS(result.jobresult) + "</p>").dialog("open");
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
}
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
$("body").stopTime(timerKey);
|
|
handleError(XMLHttpResponse);
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
});
|
|
}, 0);
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleError(XMLHttpResponse);
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
});
|
|
},
|
|
"Cancel": function() {
|
|
$(this).dialog("close");
|
|
}
|
|
}).dialog("open");
|
|
});
|
|
template.find("#template_create_vm").data("parentElementId", "template"+json.id+"_zone"+json.zoneid).unbind("click").bind("click", function(event) {
|
|
createVMFromTemplateOrISO($(this), "template");
|
|
});
|
|
}
|
|
|
|
function createVMFromTemplateOrISO(actionLink, sourceType) {
|
|
var parentElementId = actionLink.data("parentElementId");
|
|
var thisTemplate = $("#"+parentElementId);
|
|
var id = (sourceType == "template")? thisTemplate.data("templateId"): thisTemplate.data("isoId");
|
|
var name = thisTemplate.data("name");
|
|
var zoneId = thisTemplate.data("zoneId");
|
|
|
|
var createVmDialog = $("#dialog_create_vm_from_template");
|
|
createVmDialog.find("#template").text(name);
|
|
|
|
createVmDialog
|
|
.dialog('option', 'buttons', {
|
|
"Create": function() {
|
|
var thisDialog = $(this);
|
|
|
|
// 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 name = trim(thisDialog.find("#name").val());
|
|
var group = trim(thisDialog.find("#group").val());
|
|
var serviceOfferingId = thisDialog.find("#service_offering").val();
|
|
var diskOfferingId = thisDialog.find("#disk_offering").val();
|
|
thisDialog.dialog("close");
|
|
|
|
var loadingImg = thisTemplate.find(".adding_loading");
|
|
var rowContainer = thisTemplate.find("#row_container");
|
|
loadingImg.find(".adding_text").text("Creating VM....");
|
|
loadingImg.show();
|
|
rowContainer.hide();
|
|
|
|
$.ajax({
|
|
data: createURL("command=deployVirtualMachine&zoneId="+zoneId+"&serviceOfferingId="+serviceOfferingId+"&diskOfferingId="+diskOfferingId+"&templateId="+id+"&group="+encodeURIComponent(group)+"&displayname="+encodeURIComponent(name)+"&response=json"),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var jobId = json.deployvirtualmachineresponse.jobid;
|
|
var timerKey = "newVMFromTemplate"+jobId;
|
|
|
|
$("body").everyTime(
|
|
10000,
|
|
timerKey,
|
|
function() {
|
|
$.ajax({
|
|
data: createURL("command=queryAsyncJobResult&jobId="+jobId+"&response=json"),
|
|
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 htmlMsg;
|
|
if (result.virtualmachine[0].passwordenabled == 'true')
|
|
htmlMsg = "Your instance from " + sanitizeXSS(name) + " has been successfully created. Your new password is : <b>" + result.virtualmachine[0].password + "</b> . Please change it as soon as you log into your new instance";
|
|
else
|
|
htmlMsg = "Your instance from " + sanitizeXSS(name) + " has been successfully created.";
|
|
$("#dialog_info").html(htmlMsg).dialog("open");
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
} else if (result.jobstatus == 2) {
|
|
// Failed
|
|
$("#dialog_info").html("Unable to create your new instance from " + sanitizeXSS(name) + " due to the error: " + sanitizeXSS(result.jobresult)).dialog("open");
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
}
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
$("body").stopTime(timerKey);
|
|
handleError(XMLHttpResponse);
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
});
|
|
},
|
|
0
|
|
);
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleError(XMLHttpResponse);
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
});
|
|
},
|
|
"Cancel": function() {
|
|
$(this).dialog("close");
|
|
}
|
|
}).dialog("open");
|
|
}
|
|
|
|
|
|
function listTemplates() {
|
|
var submenuContent = $("#submenu_content_template");
|
|
|
|
var type = $("#template_type").val(); //my template, featured, community
|
|
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=listTemplates&page="+currentPage+moreCriteria.join("")+"&templatefilter="+type+"&response=json";
|
|
} else {
|
|
var searchInput = $("#submenu_content_template #search_input").val(); //search button
|
|
if (searchInput != null && searchInput.length > 0)
|
|
commandString = "command=listTemplates&page="+currentPage+"&templatefilter="+type+"&keyword="+searchInput+"&response=json";
|
|
else
|
|
commandString = "command=listTemplates&page="+currentPage+"&templatefilter="+type+"&response=json";
|
|
}
|
|
|
|
//listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate);
|
|
listItems(submenuContent, commandString, "listtemplatesresponse", "template", $("#vm_template_template"), templateJSONToTemplate);
|
|
}
|
|
|
|
submenuContentEventBinder($("#submenu_content_template"), listTemplates);
|
|
|
|
$("#template_type").bind("change", function(event){
|
|
currentPage=1;
|
|
event.preventDefault();
|
|
listTemplates();
|
|
});
|
|
|
|
$("#submenu_template").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_template").show();
|
|
$("#submenu_content_iso").hide();
|
|
|
|
currentPage=1;
|
|
listTemplates();
|
|
});
|
|
|
|
// *** Template (end) ***
|
|
|
|
|
|
|
|
// *** ISO (begin) ***
|
|
activateDialog($("#dialog_edit_iso").dialog({
|
|
width:450,
|
|
autoOpen: false,
|
|
modal: true,
|
|
zIndex: 2000
|
|
}));
|
|
|
|
activateDialog($("#dialog_add_iso").dialog({
|
|
width:450,
|
|
autoOpen: false,
|
|
modal: true,
|
|
zIndex: 2000
|
|
}));
|
|
|
|
activateDialog($("#dialog_copy_iso").dialog({
|
|
width:300,
|
|
autoOpen: false,
|
|
modal: true,
|
|
zIndex: 2000
|
|
}));
|
|
|
|
$("#iso_action_new").show();
|
|
|
|
$("#iso_action_new").bind("click", function(event) {
|
|
$("#dialog_add_iso")
|
|
.dialog('option', 'buttons', {
|
|
"Create": function() {
|
|
var thisDialog = $(this);
|
|
|
|
// validate values
|
|
var isValid = true;
|
|
isValid &= validateString("Name", thisDialog.find("#add_iso_name"), thisDialog.find("#add_iso_name_errormsg"));
|
|
isValid &= validateString("Display Text", thisDialog.find("#add_iso_display_text"), thisDialog.find("#add_iso_display_text_errormsg"));
|
|
isValid &= validateString("URL", thisDialog.find("#add_iso_url"), thisDialog.find("#add_iso_url_errormsg"));
|
|
if (!isValid) return;
|
|
|
|
var submenuContent = $("#submenu_content_iso");
|
|
var template = $("#vm_iso_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 name = trim(thisDialog.find("#add_iso_name").val());
|
|
var desc = trim(thisDialog.find("#add_iso_display_text").val());
|
|
var url = trim(thisDialog.find("#add_iso_url").val());
|
|
var zoneId = thisDialog.find("#add_iso_zone").val();
|
|
//var isPublic = thisDialog.find("#add_iso_public").val();
|
|
var isPublic = "false"; //default to private for now
|
|
var osType = thisDialog.find("#add_iso_os_type").val();
|
|
var bootable = thisDialog.find("#add_iso_bootable").val();
|
|
|
|
thisDialog.dialog("close");
|
|
|
|
$.ajax({
|
|
data: createURL("command=registerIso&name="+encodeURIComponent(name)+"&displayText="+encodeURIComponent(desc)+"&url="+encodeURIComponent(url)+"&zoneId="+zoneId+"&isPublic="+isPublic+"&osTypeId="+osType+"&bootable="+bootable+"&response=json"),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var result = json.registerisoresponse;
|
|
if($("#iso_type").val() == "self") {
|
|
isoJSONToTemplate(result.iso[0], template);
|
|
changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1);
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
|
|
if(result.iso.length > 1) {
|
|
for(var i=1; i<result.iso.length; i++) {
|
|
var template2 = $("#vm_iso_template").clone(true);
|
|
isoJSONToTemplate(result.iso[i], template2);
|
|
submenuContent.find("#grid_content").prepend(template2.fadeIn("slow"));
|
|
changeGridRowsTotal(submenuContent.find("#grid_rows_total"), 1);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
$("#iso_type").val("self");
|
|
$("#iso_type").change();
|
|
}
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleError(XMLHttpResponse);
|
|
template.slideUp("slow", function(){ $(this).remove(); } );
|
|
}
|
|
});
|
|
},
|
|
"Cancel": function() {
|
|
$(this).dialog("close");
|
|
}
|
|
}).dialog("open");
|
|
return false;
|
|
});
|
|
|
|
//*** isoJSONToTemplate (begin) *******************************
|
|
function isoJSONToTemplate(json, template) {
|
|
template.attr("id", "iso"+json.id+"_zone"+json.zoneid);
|
|
if (index++ % 2 == 0) {
|
|
template.addClass("dbsmallrow_odd");
|
|
} else {
|
|
template.addClass("dbsmallrow_even");
|
|
}
|
|
|
|
template.data("isoId", json.id);
|
|
template.data("zoneId",sanitizeXSS(json.zoneid));
|
|
template.data("zoneName",sanitizeXSS(json.zonename));
|
|
template.data("name", sanitizeXSS(json.name));
|
|
template.data("isPublic", json.ispublic);
|
|
|
|
template.find("#iso_id").text(json.id);
|
|
template.find("#iso_zone").text(json.zonename);
|
|
template.find("#iso_name").text(json.name);
|
|
template.find("#iso_display_text").text(json.displaytext);
|
|
|
|
if(json.size != null)
|
|
template.find("#iso_size").text(convertBytes(parseInt(json.size)));
|
|
|
|
var status = "Ready";
|
|
if (json.isready == "false") {
|
|
status = json.isostatus;
|
|
}
|
|
template.find("#iso_status").text(status);
|
|
|
|
/*
|
|
if (json.ispublic == "false")
|
|
template.find("#iso_public").attr("src", "images/public_nonselectedicon.gif");
|
|
else
|
|
template.find("#iso_public").attr("src", "images/public_selectedicon.gif");
|
|
*/
|
|
|
|
template.find("#iso_bootable").text((json.bootable == "true") ? "Yes" : "No");
|
|
template.find("#iso_account").text(json.account);
|
|
|
|
setDateField(json.created, template.find("#iso_created"));
|
|
|
|
// hide action link Edit, Copy, Create VM
|
|
if ((isUser() && json.ispublic == "true" && !(json.domainid == g_domainid && json.account == g_account)) || json.isready == "false")
|
|
template.find("#iso_edit_container, #iso_copy_container, #iso_create_vm_container").hide();
|
|
|
|
// hide action link Delete
|
|
if (((isUser() && json.ispublic == "true" && !(json.domainid == g_domainid && json.account == g_account))) || (json.isready == "false" && json.isostatus != null && json.isostatus.indexOf("% Downloaded") != -1))
|
|
template.find("#iso_delete_container").hide();
|
|
|
|
// hide "Create VM" link
|
|
if(json.bootable == "false") // disallow to create VM from non-bootable ISO
|
|
template.find("#iso_create_vm_container").hide();
|
|
|
|
template.find("#iso_edit").data("isoId", json.id).bind("click", function(event) {
|
|
event.preventDefault();
|
|
var id = $(this).data("isoId");
|
|
var iso = $("#iso"+id);
|
|
var name = template.find("#iso_name").text();
|
|
var displayText = template.find("#iso_display_text").text();
|
|
$("#dialog_edit_iso #edit_iso_name").val(name);
|
|
$("#dialog_edit_iso #edit_iso_display_text").val(displayText);
|
|
|
|
$("#dialog_edit_iso")
|
|
.dialog('option', 'buttons', {
|
|
"Save": function() {
|
|
// validate values
|
|
var isValid = true;
|
|
isValid &= validateString("Name", $("#edit_iso_name"), $("#edit_iso_name_errormsg"));
|
|
isValid &= validateString("Display Text", $("#edit_iso_display_text"), $("#edit_iso_display_text_errormsg"));
|
|
if (!isValid) return;
|
|
|
|
var name = trim($("#edit_iso_name").val());
|
|
var desc = trim($("#edit_iso_display_text").val());
|
|
|
|
var dialogBox = $(this);
|
|
dialogBox.dialog("close");
|
|
$.ajax({
|
|
data: createURL("command=updateIso&id="+id+"&name="+encodeURIComponent(name)+"&displayText="+encodeURIComponent(desc)+"&response=json"),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
isoJSONToTemplate(json.updateisoresponse, template);
|
|
//template.find("#iso_name").text(name);
|
|
//template.find("#iso_display_text").text(desc);
|
|
}
|
|
});
|
|
},
|
|
"Cancel": function() {
|
|
$(this).dialog("close");
|
|
}
|
|
}).dialog("open");
|
|
});
|
|
var that = template;
|
|
template.find("#iso_delete").data("parentElementId", "iso"+json.id+"_zone"+json.zoneid).bind("click", function(event) {
|
|
var moreCriteria = [];
|
|
var parentElementId = $(this).data("parentElementId");
|
|
var thisTemplate = that;
|
|
var id = thisTemplate.data("isoId");
|
|
var name = thisTemplate.data("name");
|
|
var zoneId = thisTemplate.data("zoneId");
|
|
if (zoneId != null)
|
|
moreCriteria.push("&zoneid="+zoneId);
|
|
|
|
var htmlMsg;
|
|
if(json.crossZones == "true")
|
|
htmlMsg = "<p>ISO <b>"+name+"</b> is used by all zones. Please confirm you want to delete it from all zones.</p>";
|
|
else
|
|
htmlMsg = "<p>Please confirm you want to delete your ISO <b>"+name+"</b>.</p>";
|
|
|
|
$("#dialog_confirmation")
|
|
.html(htmlMsg)
|
|
.dialog('option', 'buttons', {
|
|
"Confirm": function() {
|
|
$(this).dialog("close");
|
|
|
|
var loadingImg = thisTemplate.find(".adding_loading");
|
|
var rowContainer = thisTemplate.find("#row_container");
|
|
loadingImg.find(".adding_text").text("Deleting....");
|
|
loadingImg.show();
|
|
rowContainer.hide();
|
|
|
|
$.ajax({
|
|
data: createURL("command=deleteIso&id="+id+moreCriteria.join("")+"&response=json"),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var jobId = json.deleteisosresponse.jobid;
|
|
var timerKey = "deleteIsoJob"+jobId;
|
|
|
|
$("body").everyTime(2000, timerKey, function() {
|
|
$.ajax({
|
|
data: createURL("command=queryAsyncJobResult&jobId="+json.deleteisosresponse.jobid+"&response=json"),
|
|
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) { //success
|
|
that.slideUp("slow", function() { $(this).remove() });
|
|
changeGridRowsTotal($("#submenu_content_iso").find("#grid_rows_total"), -1);
|
|
} else if (result.jobstatus == 2) {
|
|
$("#dialog_alert").html("<p>" + sanitizeXSS(result.jobresult) + "</p>").dialog("open");
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
}
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
$("body").stopTime(timerKey);
|
|
handleError(XMLHttpResponse);
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
});
|
|
}, 0);
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleError(XMLHttpResponse);
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
});
|
|
},
|
|
"Cancel": function() {
|
|
$(this).dialog("close");
|
|
}
|
|
}).dialog("open");
|
|
});
|
|
|
|
template.find("#iso_copy").data("parentElementId", "iso"+json.id+"_zone"+json.zoneid).bind("click", function(event) {
|
|
var moreCriteria = [];
|
|
var parentElementId = $(this).data("parentElementId");
|
|
var thisTemplate = $("#"+parentElementId);
|
|
var id = thisTemplate.data("isoId");
|
|
var name = thisTemplate.data("name");
|
|
var sourceZoneId = thisTemplate.data("zoneId");
|
|
if (sourceZoneId != null)
|
|
moreCriteria.push("&sourcezoneid="+sourceZoneId);
|
|
|
|
populateZoneField($("#dialog_copy_iso #copy_iso_zone"), sourceZoneId);
|
|
|
|
$("#dialog_copy_iso #copy_iso_name_text").text(name); //ISO name
|
|
|
|
var sourceZoneName = thisTemplate.data("zoneName");
|
|
$("#dialog_copy_iso #copy_iso_source_zone_text").text(sourceZoneName); // source zone
|
|
|
|
$("#dialog_copy_iso")
|
|
.dialog('option', 'buttons', {
|
|
"OK": function() {
|
|
var thisDialog = $(this);
|
|
|
|
var isValid = true;
|
|
isValid &= validateDropDownBox("Zone", thisDialog.find("#copy_iso_zone"), thisDialog.find("#copy_iso_zone_errormsg"), false); //reset error text
|
|
if (!isValid) return;
|
|
|
|
var destZoneId = thisDialog.find("#copy_iso_zone").val();
|
|
thisDialog.dialog("close");
|
|
|
|
var loadingImg = thisTemplate.find(".adding_loading");
|
|
var rowContainer = thisTemplate.find("#row_container");
|
|
loadingImg.find(".adding_text").text("Copying....");
|
|
loadingImg.show();
|
|
rowContainer.hide();
|
|
|
|
$.ajax({
|
|
data: createURL("command=copyIso&id="+id+"&sourcezoneid="+sourceZoneId+"&destzoneid="+destZoneId+"&response=json"),
|
|
dataType: "json",
|
|
success: function(json) {
|
|
var jobId = json.copyisoresponse.jobid;
|
|
var timerKey = "copyIsoJob"+jobId;
|
|
|
|
$("body").everyTime(2000, timerKey, function() {
|
|
$.ajax({
|
|
data: createURL("command=queryAsyncJobResult&jobId="+json.copyisoresponse.jobid+"&response=json"),
|
|
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) {
|
|
$("#dialog_info").html("<p>ISO download started (ID: <b>"+result.copytemplateresponse[0].id+"</b>, Zone: <b>"+sanitizeXSS(result.copytemplateresponse[0].zonename)+"</b>, Name: <b>"+sanitizeXSS(result.copytemplateresponse[0].name)+"</b>) . Check the progress...</p>").dialog("open");
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
currentPage=1; //refresh the whole ISO grid until Keshav changes copyIso to return the newly created ISO.
|
|
listIsos();
|
|
} else if (result.jobstatus == 2) {
|
|
$("#dialog_alert").html("<p>" + sanitizeXSS(result.jobresult) + "</p>").dialog("open");
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
}
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
$("body").stopTime(timerKey);
|
|
handleError(XMLHttpResponse);
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
});
|
|
}, 0);
|
|
},
|
|
error: function(XMLHttpResponse) {
|
|
handleError(XMLHttpResponse);
|
|
loadingImg.hide();
|
|
rowContainer.show();
|
|
}
|
|
});
|
|
},
|
|
"Cancel": function() {
|
|
$(this).dialog("close");
|
|
}
|
|
}).dialog("open");
|
|
});
|
|
template.find("#iso_create_vm").data("parentElementId", "iso"+json.id+"_zone"+json.zoneid).bind("click", function(event) {
|
|
createVMFromTemplateOrISO($(this), "iso");
|
|
});
|
|
}
|
|
//*** isoJSONToTemplate (end) *******************************
|
|
|
|
function listIsos() {
|
|
var submenuContent = $("#submenu_content_iso");
|
|
|
|
var type = $("#iso_type").val(); //my template, community
|
|
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=listIsos&page="+currentPage+moreCriteria.join("")+"&isofilter="+type+"&response=json";
|
|
} else {
|
|
var searchInput = $("#submenu_content_iso #search_input").val(); //keyword
|
|
if (searchInput != null && searchInput.length > 0)
|
|
commandString = "command=listIsos&page="+currentPage+"&keyword="+searchInput+"&isofilter="+type+"&response=json"
|
|
else
|
|
commandString = "command=listIsos&page="+currentPage+"&isofilter="+type+"&response=json";
|
|
}
|
|
|
|
//listItems(submenuContent, commandString, jsonResponse1, jsonResponse2, template, fnJSONToTemplate);
|
|
listItems(submenuContent, commandString, "listisosresponse", "iso", $("#vm_iso_template"), isoJSONToTemplate);
|
|
}
|
|
|
|
submenuContentEventBinder($("#submenu_content_iso"), listIsos);
|
|
|
|
$("#iso_type").bind("change", function(event){
|
|
currentPage=1;
|
|
event.preventDefault();
|
|
listIsos();
|
|
});
|
|
|
|
$("#submenu_iso").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_iso").show();
|
|
$("#submenu_content_template").hide();
|
|
|
|
currentPage=1;
|
|
listIsos();
|
|
});
|
|
|
|
// *** ISO (end) ***
|
|
|
|
|
|
|
|
var currentSubMenu = $("#submenu_template");
|
|
currentSubMenu.click();
|
|
|
|
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();
|
|
}
|