<commit_before>(function(cloudStack, $) {

  cloudStack.sections.templates = {
    title: 'label.menu.templates',
    id: 'templates',
    sectionSelect: {
      label: 'label.select-view'
    },
    sections: {
      templates: {
        type: 'select',
        title: 'label.menu.templates',
        listView: {
          id: 'templates',
          label: 'label.menu.templates',
          filters: {
            all: {
              preFilter: function(args) {
                if (isAdmin()) //"listTemplates&templatefilter=all" only works for root-admin, but no domain-admin. Domain-admin is unable to see all templates until listTemplates API supports a new type of templatefilter for domain-admin to see all templates in his domain.
                  return true;
                else
                  return false;
              },
              label: 'ui.listView.filters.all'
           },
            mine: { label: 'ui.listView.filters.mine' },
            featured: { label: 'label.featured' },
            community: { label: 'label.community' }
          },
          fields: {
            name: { label: 'label.name' },
            zonename: { label: 'label.zone' },
            hypervisor: { label: 'label.hypervisor' }
          },
          reorder: cloudStack.api.actions.sort('updateTemplate', 'templates'),
          actions: {
            add: {
              label: 'label.action.create.template',

              messages: {
                confirm: function(args) {
                  return "create.template.confirm";
                },
                success: function(args) {
                  return "create.template.success";
                },
                notification: function(args) {
                  return "create.template.notification";
                },
                complete: function(args) {
                  return "create.template.complete";
                }
              },

              createForm: {
                title: 'label.action.create.template',
                desc: 'label.action.create.template',
                preFilter: cloudStack.preFilter.createTemplate,
                fields: {
                  name: {
                    label: 'label.name',
                    validation: { required: true }
                  },
                  description: {
                    label: 'label.description',
                    validation: { required: true }
                  },
                  url: {
                    label: 'URL',
                    validation: { required: true }
                  },
                  zone: {
                    label: 'label.zone',
                    select: function(args) {
                      $.ajax({
                        url: createURL("listZones&available=true"),
                        dataType: "json",
                        async: true,
                        success: function(json) {
                          var zoneObjs = json.listzonesresponse.zone;
                          var items = [];
                          if (isAdmin() && !(cloudStack.context.projects &&
                                             cloudStack.context.projects[0]))
                            items.push({id: -1, description: "All Zones"});
                          $(zoneObjs).each(function() {
                            items.push({id: this.id, description: this.name});
                          });
                          args.response.success({data: items});
                        }
                      });
                    }
                  },
                  hypervisor: {
                    label: 'label.hypervisor',
                    dependsOn: 'zone',
                    select: function(args) {
                      if(args.zone == null)
                        return;

                      var apiCmd;
                      if(args.zone == -1)
                        apiCmd = "listHypervisors&zoneid=-1";
                      else
                        apiCmd = "listHypervisors&zoneid=" + args.zone;

                      $.ajax({
                        url: createURL(apiCmd),
                        dataType: "json",
                        async: false,
                        success: function(json) {
                          var hypervisorObjs = json.listhypervisorsresponse.hypervisor;
                          var items = [];
                          $(hypervisorObjs).each(function(){
                            items.push({id: this.name, description: this.name});
                          });
                          args.response.success({data: items});
                        }
                      });

                      args.$select.change(function() {
                        var $form = $(this).closest('form');
                        if($(this).val() == "VMware") {
                          $form.find('.form-item[rel=rootDiskControllerType]').css('display', 'inline-block');
                          $form.find('.form-item[rel=nicAdapterType]').css('display', 'inline-block');
                          $form.find('.form-item[rel=keyboardType]').css('display', 'inline-block');
                        }
                        else {
                          $form.find('.form-item[rel=rootDiskControllerType]').hide();
                          $form.find('.form-item[rel=nicAdapterType]').hide();
                          $form.find('.form-item[rel=keyboardType]').hide();
                        }
                      });
                    }
                  },

                  //fields for hypervisor == "VMware" (starts here)
                  rootDiskControllerType: {
                    label: 'label.root.disk.controller',
                    isHidden: true,
                    select: function(args) {
                      var items = []
                      items.push({id: "", description: ""});
                      items.push({id: "scsi", description: "scsi"});
                      items.push({id: "ide", description: "ide"});
                      args.response.success({data: items});
                    }
                  },
                  nicAdapterType: {
                    label: 'label.nic.adapter.type',
                    isHidden: true,
                    select: function(args) {
                      var items = []
                      items.push({id: "", description: ""});
                      items.push({id: "E1000", description: "E1000"});
                      items.push({id: "PCNet32", description: "PCNet32"});
                      items.push({id: "Vmxnet2", description: "Vmxnet2"});
                      items.push({id: "Vmxnet3", description: "Vmxnet3"});
                      args.response.success({data: items});
                    }
                  },
                  keyboardType: {
                    label: 'label.keyboard.type',
                    isHidden: true,
                    select: function(args) {
                      var items = []
                      items.push({id: "", description: ""});
                      items.push({id: "us", description: "US"});
                      items.push({id: "jp", description: "Japanese"});
                      args.response.success({data: items});
                    }
                  },
                  //fields for hypervisor == "VMware" (ends here)

                  format: {
                    label: 'label.format',
                    dependsOn: 'hypervisor',
                    select: function(args) {
                      var items = [];
                      if(args.hypervisor == "XenServer") {
                        //formatSelect.append("<option value='VHD'>VHD</option>");
                        items.push({id:'VHD', description: 'VHD'});
                      }
                      else if(args.hypervisor == "VMware") {
                        //formatSelect.append("<option value='OVA'>OVA</option>");
                        items.push({id:'OVA', description: 'OVA'});
                      }
                      else if(args.hypervisor == "KVM") {
                        //formatSelect.append("<option value='QCOW2'>QCOW2</option>");
                        items.push({id:'QCOW2', description: 'QCOW2'});
                      }
                      else if(args.hypervisor == "BareMetal") {
                        //formatSelect.append("<option value='BareMetal'>BareMetal</option>");
                        items.push({id:'BareMetal', description: 'BareMetal'});
                      }
                      else if(args.hypervisor == "Ovm") {
                        //formatSelect.append("<option value='RAW'>RAW</option>");
                        items.push({id:'RAW', description: 'RAW'});
                      }
                      args.response.success({data: items});
                    }
                  },

                  osTypeId: {
                    label: 'label.os.type',
                    select: function(args) {
                      $.ajax({
                        url: createURL("listOsTypes"),
                        dataType: "json",
                        async: true,
                        success: function(json) {
                          var items = json.listostypesresponse.ostype;
                          args.response.success({data: items});
                        }
                      });
                    }
                  },

                  isExtractable: {
                    label: "extractable",
                    isBoolean: true
                  },

                  isPasswordEnabled: {
                    label: "label.password.enabled",
                    isBoolean: true
                  },

                  isPublic: {
                    label: "label.public",
                    isBoolean: true,
                    isHidden: true
                  },

                  isFeatured: {
                    label: "label.featured",
                    isBoolean: true,
                    isHidden: true
                  }
                }
              },

              action: function(args) {
                var array1 = [];
                array1.push("&name=" + todb(args.data.name));
                array1.push("&displayText=" + todb(args.data.description));
                array1.push("&url=" + todb(args.data.url));
                array1.push("&zoneid=" + args.data.zone);
                array1.push("&format=" + args.data.format);
                array1.push("&isextractable=" + (args.data.isExtractable=="on"));
                array1.push("&passwordEnabled=" + (args.data.isPasswordEnabled=="on"));
                array1.push("&osTypeId=" + args.data.osTypeId);
                array1.push("&hypervisor=" + args.data.hypervisor);

                if(args.$form.find('.form-item[rel=isPublic]').css("display") != "none")
                  array1.push("&ispublic=" + (args.data.isPublic == "on"));
                if(args.$form.find('.form-item[rel=isFeatured]').css("display") != "none")
                  array1.push("&isfeatured=" + (args.data.isFeatured == "on"));

                //VMware only (starts here)
                if(args.$form.find('.form-item[rel=rootDiskControllerType]').css("display") != "none" && args.data.rootDiskControllerType != "")
                  array1.push("&details[0].rootDiskController=" + args.data.rootDiskControllerType);
                if(args.$form.find('.form-item[rel=nicAdapterType]').css("display") != "none" && args.data.nicAdapterType != "")
                  array1.push("&details[0].nicAdapter=" + args.data.nicAdapterType);
                if(args.$form.find('.form-item[rel=keyboardType]').css("display") != "none" && args.data.keyboardType != "")
                  array1.push("&details[0].keyboard=" + args.data.keyboardType);
                //VMware only (ends here)

                $.ajax({
                  url: createURL("registerTemplate" + array1.join("")),
                  dataType: "json",
                  success: function(json) {
                    var items = json.registertemplateresponse.template;  //items might have more than one array element if it's create templates for all zones.
                    args.response.success({data:items[0]});
                    /*
                     if(items.length > 1) {
                     for(var i=1; i<items.length; i++) {
                     var $midmenuItem2 = $("#midmenu_item").clone();
                     templateToMidmenu(items[i], $midmenuItem2);
                     bindClickToMidMenu($midmenuItem2, templateToRightPanel, templateGetMidmenuId);
                     $("#midmenu_container").append($midmenuItem2.show());
                     }
                     }
                     */
                  },
                  error: function(XMLHttpResponse) {
                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                    args.response.error(errorMsg);
                  }
                });
              },

              notification: {
                poll: function(args) {
                  args.complete();
                }
              }
            }
          },

          dataProvider: function(args) {
            var array1 = [];
            var ignoreProject = false;
            if(args.filterBy != null) {
              if(args.filterBy.kind != null) {
                switch(args.filterBy.kind) {
                case "all":
                  ignoreProject = true;
                  array1.push("&templatefilter=all");
                  break;
                case "mine":
                  array1.push("&templatefilter=self");
                  break;
                case "featured":
                  ignoreProject = true;
                  array1.push("&templatefilter=featured");
                  break;
                case "community":
                  ignoreProject = true;
                  array1.push("&templatefilter=community");
                  break;
                }
              }
              if(args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
                switch(args.filterBy.search.by) {
                case "name":
                  if(args.filterBy.search.value.length > 0)
                    array1.push("&keyword=" + args.filterBy.search.value);
                  break;
                }
              }
            }
            $.ajax({
              url: createURL("listTemplates&page=" + args.page + "&pagesize=" + pageSize + array1.join(""),
                             { ignoreProject: ignoreProject }),
              dataType: "json",
              async: true,
              success: function(json) {
                var items = json.listtemplatesresponse.template;
                args.response.success({
                  actionFilter: templateActionfilter,
                  data: items
                });
              }
            });
          }	,

          detailView: {
            name: 'Template details',
            actions: {
              edit: {
                label: 'label.edit',
                action: function(args) {
                  var array1 = [];
                  array1.push("&name=" + todb(args.data.name));
                  array1.push("&displaytext=" + todb(args.data.displaytext));
                  array1.push("&ostypeid=" + args.data.ostypeid);
                  array1.push("&passwordenabled=" + (args.data.passwordenabled=="on"));
                  $.ajax({
                    url: createURL("updateTemplate&id=" + args.context.templates[0].id + "&zoneid=" + args.context.templates[0].zoneid + array1.join("")),
                    dataType: "json",
                    async: false,
                    success: function(json) {
                      //API returns an incomplete embedded object  (some properties are missing in the embedded template object)
                    }
                  });

                  var array2 = [];
                  array2.push("&ispublic=" + (args.data.ispublic=="on"));
                  array2.push("&isfeatured=" + (args.data.isfeatured=="on"));
                  array2.push("&isextractable=" + (args.data.isextractable=="on"));
                  $.ajax({
                    url: createURL("updateTemplatePermissions&id=" + args.context.templates[0].id + "&zoneid=" + args.context.templates[0].zoneid + array2.join("")),
                    dataType: "json",
                    async: false,
                    success: function(json) {
                      //API doesn't return an embedded object
                    }
                  });

                  //So, we call listTemplates API to get a complete template object
                  $.ajax({
                    url: createURL("listTemplates&id=" + args.context.templates[0].id + "&zoneid=" + args.context.templates[0].zoneid + "&templatefilter=self"),
                    dataType: "json",
                    async: false,
                    success: function(json){
                      var item = json.listtemplatesresponse.template;
                      args.response.success({data: item});
                    }
                  });
                }
              },

              copyTemplate: {
                label: 'label.action.copy.template',
                messages: {
                  confirm: function(args) {
                    return 'Are you sure you want to copy template?';
                  },
                  success: function(args) {
                    return 'Template is being copied.';
                  },
                  notification: function(args) {
                    return 'label.action.copy.template';
                  }
                },
                createForm: {
                  title: 'label.action.copy.template',
                  desc: '',
                  fields: {
                    destinationZoneId: {
                      label: 'label.destination.zone',
                      validation: { required: true },
                      select: function(args) {
                        $.ajax({
                          url: createURL("listZones&available=true"),
                          dataType: "json",
                          async: true,
                          success: function(json) {
                            var zoneObjs = json.listzonesresponse.zone;
                            var items = [];
                            $(zoneObjs).each(function() {
                              if(this.id != args.context.templates[0].zoneid)
                                items.push({id: this.id, description: this.name});
                            });
                            args.response.success({data: items});
                          }
                        });
                      }
                    }
                  }
                },
                action: function(args) {
                  $.ajax({
                    url: createURL("copyTemplate&id=" + args.context.templates[0].id + "&sourcezoneid=" + args.context.templates[0].zoneid + "&destzoneid=" + args.data.destinationZoneId),
                    dataType: "json",
                    async: true,
                    success: function(json) {
                      var jid = json.copytemplateresponse.jobid;
                      args.response.success(
                        {_custom:
                         {jobId: jid,
                          getUpdatedItem: function(json) {
                            return {}; //nothing in this template needs to be updated
                          },
                          getActionFilter: function() {
                            return templateActionfilter;
                          }
                         }
                        }
                      );
                    }
                  });
                },
                notification: {
                  poll: pollAsyncJobResult
                }
              },

              downloadTemplate: {
                label: 'label.action.download.template',
                messages: {
                  confirm: function(args) {
                    return 'message.action.download.template';
                  },
                  notification: function(args) {
                    return 'Downloading template';
                  },
                  complete: function(args) {
                    var url = decodeURIComponent(args.url);
                    var htmlMsg = _l('message.download.template');
                    var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url);
                    return htmlMsg2;
                  }
                },
                action: function(args) {
                  var apiCmd = "extractTemplate&mode=HTTP_DOWNLOAD&id=" + args.context.templates[0].id;
                  if(args.context.templates[0].zoneid != null)
                    apiCmd += "&zoneid=" + args.context.templates[0].zoneid;

                  $.ajax({
                    url: createURL(apiCmd),
                    dataType: "json",
                    async: true,
                    success: function(json) {
                      var jid = json.extracttemplateresponse.jobid;
                      args.response.success(
                        {_custom:
                         {jobId: jid,
                          getUpdatedItem: function(json) {
                            return json.queryasyncjobresultresponse.jobresult.template;
                          },
                          getActionFilter: function() {
                            return templateActionfilter;
                          }
                         }
                        }
                      );
                    }
                  });
                },
                notification: {
                  poll: pollAsyncJobResult
                }
              },

              remove: {
                label: 'label.action.delete.template',
                messages: {
                  confirm: function(args) {
                    return 'message.action.delete.template';
                  },
                  notification: function(args) {
                    return 'label.action.delete.template';
                  }
                },
                action: function(args) {
                  var array1 = [];
                  if (args.context.templates[0].zoneid != null)
                    array1.push("&zoneid=" + args.context.templates[0].zoneid);

                  $.ajax({
                    url: createURL("deleteTemplate&id=" + args.context.templates[0].id + array1.join("")),
                    dataType: "json",
                    async: true,
                    success: function(json) {
                      var jid = json.deletetemplateresponse.jobid;
                      args.response.success(
                        {_custom:
                         {jobId: jid
                         }
                        }
                      );
                    }
                  });
                },
                notification: {
                  poll: pollAsyncJobResult
                }
              }

            },
            tabs: {
              details: {
                title: 'label.details',

                preFilter: function(args) {
                  var hiddenFields;
                  if(isAdmin()) {
                    hiddenFields = [];
                  }
                  else {
                    hiddenFields = ["hypervisor"];
                  }
                  return hiddenFields;
                },

                fields: [
                  {
                    name: {
                      label: 'label.name',
                      isEditable: true
                    }
                  },
                  {
                    id: { label: 'ID' },
                    zonename: { label: 'label.zone.name' },
                    zoneid: { label: 'label.zone.id' },
                    displaytext: {
                      label: 'label.description',
                      isEditable: true
                    },
                    hypervisor: { label: 'label.hypervisor' },
                    templatetype: { label: 'label.type' },
                    isready: { label: 'state.ready', converter:cloudStack.converters.toBooleanText },
                    status: { label: 'label.status' },
                    size : {
                      label: 'label.size',
                      converter: function(args) {
                        if (args == null || args == 0)
                          return "";
                        else
                          return cloudStack.converters.convertBytes(args);
                      }
                    },
                    isextractable: {
                      label: 'extractable',
                      isBoolean: true,
                      isEditable: true,
                      converter:cloudStack.converters.toBooleanText
                    },
                    passwordenabled: {
                      label: 'label.password.enabled',
                      isBoolean: true,
                      isEditable: true,
                      converter:cloudStack.converters.toBooleanText
                    },
                    ispublic: {
                      label: 'label.public',
                      isBoolean: true,
                      isEditable: true,
                      converter:cloudStack.converters.toBooleanText
                    },
                    isfeatured: {
                      label: 'label.featured',
                      isBoolean: true,
                      isEditable: true,
                      converter:cloudStack.converters.toBooleanText
                    },
                    crossZones: {
                      label: 'label.cross.zones',
                      converter:cloudStack.converters.toBooleanText
                    },

                    ostypeid: {
                      label: 'label.os.type',
                      isEditable: true,
                      select: function(args) {
                        $.ajax({
                          url: createURL("listOsTypes"),
                          dataType: "json",
                          async: true,
                          success: function(json) {
                            var ostypes = json.listostypesresponse.ostype;
                            var items = [];
                            $(ostypes).each(function() {
                              items.push({id: this.id, description: this.description});
                            });
                            args.response.success({data: items});
                          }
                        });
                      }
                    },

                    domain: { label: 'label.domain' },
                    account: { label: 'label.account' },
                    created: { label: 'label.created', converter: cloudStack.converters.toLocalDate }
                  }
                ],

                dataProvider: function(args) {
                  var jsonObj = args.context.templates[0];
                  var apiCmd = "listTemplates&templatefilter=self&id=" + jsonObj.id;
                  if(jsonObj.zoneid != null)
                    apiCmd = apiCmd + "&zoneid=" + jsonObj.zoneid;

                  $.ajax({
                    url: createURL(apiCmd),
                    dataType: "json",
                    success: function(json) {
                      args.response.success({
                        actionFilter: templateActionfilter,
                        data: json.listtemplatesresponse.template[0]
                      });
                    }
                  });

                }
              }
            }
          }
        }
      },
      isos: {
        type: 'select',
        title: 'label.iso',
        listView: {
          label: 'label.iso',
          filters: {
            all: {
             preFilter: function(args) {
                if (isAdmin()) //"listIsos&filter=all" only works for root-admin, but no domain-admin. Domain-admin is unable to see all Isos until listIsos API supports a new type of isofilter for domain-admin to see all Isos in his domain.
                  return true;
                else
                  return false;
              },
              label: 'ui.listView.filters.all'
            },
            mine: { label: 'ui.listView.filters.mine' },
            featured: { label: 'label.featured' },
            community: { label: 'label.community' }
          },
          fields: {
            displaytext: { label: 'label.name' },
            zonename: { label: 'label.zone' }
          },

          reorder: cloudStack.api.actions.sort('updateIso', 'isos'),

          actions: {
            add: {
              label: 'label.add.iso',

              messages: {
                notification: function(args) {<commit_msg>bug 14206: ISO page - listView - show name instead of description.<commit_after>(function(cloudStack, $) {

  cloudStack.sections.templates = {
    title: 'label.menu.templates',
    id: 'templates',
    sectionSelect: {
      label: 'label.select-view'
    },
    sections: {
      templates: {
        type: 'select',
        title: 'label.menu.templates',
        listView: {
          id: 'templates',
          label: 'label.menu.templates',
          filters: {
            all: {
              preFilter: function(args) {
                if (isAdmin()) //"listTemplates&templatefilter=all" only works for root-admin, but no domain-admin. Domain-admin is unable to see all templates until listTemplates API supports a new type of templatefilter for domain-admin to see all templates in his domain.
                  return true;
                else
                  return false;
              },
              label: 'ui.listView.filters.all'
           },
            mine: { label: 'ui.listView.filters.mine' },
            featured: { label: 'label.featured' },
            community: { label: 'label.community' }
          },
          fields: {
            name: { label: 'label.name' },
            zonename: { label: 'label.zone' },
            hypervisor: { label: 'label.hypervisor' }
          },
          reorder: cloudStack.api.actions.sort('updateTemplate', 'templates'),
          actions: {
            add: {
              label: 'label.action.create.template',

              messages: {
                confirm: function(args) {
                  return "create.template.confirm";
                },
                success: function(args) {
                  return "create.template.success";
                },
                notification: function(args) {
                  return "create.template.notification";
                },
                complete: function(args) {
                  return "create.template.complete";
                }
              },

              createForm: {
                title: 'label.action.create.template',
                desc: 'label.action.create.template',
                preFilter: cloudStack.preFilter.createTemplate,
                fields: {
                  name: {
                    label: 'label.name',
                    validation: { required: true }
                  },
                  description: {
                    label: 'label.description',
                    validation: { required: true }
                  },
                  url: {
                    label: 'URL',
                    validation: { required: true }
                  },
                  zone: {
                    label: 'label.zone',
                    select: function(args) {
                      $.ajax({
                        url: createURL("listZones&available=true"),
                        dataType: "json",
                        async: true,
                        success: function(json) {
                          var zoneObjs = json.listzonesresponse.zone;
                          var items = [];
                          if (isAdmin() && !(cloudStack.context.projects &&
                                             cloudStack.context.projects[0]))
                            items.push({id: -1, description: "All Zones"});
                          $(zoneObjs).each(function() {
                            items.push({id: this.id, description: this.name});
                          });
                          args.response.success({data: items});
                        }
                      });
                    }
                  },
                  hypervisor: {
                    label: 'label.hypervisor',
                    dependsOn: 'zone',
                    select: function(args) {
                      if(args.zone == null)
                        return;

                      var apiCmd;
                      if(args.zone == -1)
                        apiCmd = "listHypervisors&zoneid=-1";
                      else
                        apiCmd = "listHypervisors&zoneid=" + args.zone;

                      $.ajax({
                        url: createURL(apiCmd),
                        dataType: "json",
                        async: false,
                        success: function(json) {
                          var hypervisorObjs = json.listhypervisorsresponse.hypervisor;
                          var items = [];
                          $(hypervisorObjs).each(function(){
                            items.push({id: this.name, description: this.name});
                          });
                          args.response.success({data: items});
                        }
                      });

                      args.$select.change(function() {
                        var $form = $(this).closest('form');
                        if($(this).val() == "VMware") {
                          $form.find('.form-item[rel=rootDiskControllerType]').css('display', 'inline-block');
                          $form.find('.form-item[rel=nicAdapterType]').css('display', 'inline-block');
                          $form.find('.form-item[rel=keyboardType]').css('display', 'inline-block');
                        }
                        else {
                          $form.find('.form-item[rel=rootDiskControllerType]').hide();
                          $form.find('.form-item[rel=nicAdapterType]').hide();
                          $form.find('.form-item[rel=keyboardType]').hide();
                        }
                      });
                    }
                  },

                  //fields for hypervisor == "VMware" (starts here)
                  rootDiskControllerType: {
                    label: 'label.root.disk.controller',
                    isHidden: true,
                    select: function(args) {
                      var items = []
                      items.push({id: "", description: ""});
                      items.push({id: "scsi", description: "scsi"});
                      items.push({id: "ide", description: "ide"});
                      args.response.success({data: items});
                    }
                  },
                  nicAdapterType: {
                    label: 'label.nic.adapter.type',
                    isHidden: true,
                    select: function(args) {
                      var items = []
                      items.push({id: "", description: ""});
                      items.push({id: "E1000", description: "E1000"});
                      items.push({id: "PCNet32", description: "PCNet32"});
                      items.push({id: "Vmxnet2", description: "Vmxnet2"});
                      items.push({id: "Vmxnet3", description: "Vmxnet3"});
                      args.response.success({data: items});
                    }
                  },
                  keyboardType: {
                    label: 'label.keyboard.type',
                    isHidden: true,
                    select: function(args) {
                      var items = []
                      items.push({id: "", description: ""});
                      items.push({id: "us", description: "US"});
                      items.push({id: "jp", description: "Japanese"});
                      args.response.success({data: items});
                    }
                  },
                  //fields for hypervisor == "VMware" (ends here)

                  format: {
                    label: 'label.format',
                    dependsOn: 'hypervisor',
                    select: function(args) {
                      var items = [];
                      if(args.hypervisor == "XenServer") {
                        //formatSelect.append("<option value='VHD'>VHD</option>");
                        items.push({id:'VHD', description: 'VHD'});
                      }
                      else if(args.hypervisor == "VMware") {
                        //formatSelect.append("<option value='OVA'>OVA</option>");
                        items.push({id:'OVA', description: 'OVA'});
                      }
                      else if(args.hypervisor == "KVM") {
                        //formatSelect.append("<option value='QCOW2'>QCOW2</option>");
                        items.push({id:'QCOW2', description: 'QCOW2'});
                      }
                      else if(args.hypervisor == "BareMetal") {
                        //formatSelect.append("<option value='BareMetal'>BareMetal</option>");
                        items.push({id:'BareMetal', description: 'BareMetal'});
                      }
                      else if(args.hypervisor == "Ovm") {
                        //formatSelect.append("<option value='RAW'>RAW</option>");
                        items.push({id:'RAW', description: 'RAW'});
                      }
                      args.response.success({data: items});
                    }
                  },

                  osTypeId: {
                    label: 'label.os.type',
                    select: function(args) {
                      $.ajax({
                        url: createURL("listOsTypes"),
                        dataType: "json",
                        async: true,
                        success: function(json) {
                          var items = json.listostypesresponse.ostype;
                          args.response.success({data: items});
                        }
                      });
                    }
                  },

                  isExtractable: {
                    label: "extractable",
                    isBoolean: true
                  },

                  isPasswordEnabled: {
                    label: "label.password.enabled",
                    isBoolean: true
                  },

                  isPublic: {
                    label: "label.public",
                    isBoolean: true,
                    isHidden: true
                  },

                  isFeatured: {
                    label: "label.featured",
                    isBoolean: true,
                    isHidden: true
                  }
                }
              },

              action: function(args) {
                var array1 = [];
                array1.push("&name=" + todb(args.data.name));
                array1.push("&displayText=" + todb(args.data.description));
                array1.push("&url=" + todb(args.data.url));
                array1.push("&zoneid=" + args.data.zone);
                array1.push("&format=" + args.data.format);
                array1.push("&isextractable=" + (args.data.isExtractable=="on"));
                array1.push("&passwordEnabled=" + (args.data.isPasswordEnabled=="on"));
                array1.push("&osTypeId=" + args.data.osTypeId);
                array1.push("&hypervisor=" + args.data.hypervisor);

                if(args.$form.find('.form-item[rel=isPublic]').css("display") != "none")
                  array1.push("&ispublic=" + (args.data.isPublic == "on"));
                if(args.$form.find('.form-item[rel=isFeatured]').css("display") != "none")
                  array1.push("&isfeatured=" + (args.data.isFeatured == "on"));

                //VMware only (starts here)
                if(args.$form.find('.form-item[rel=rootDiskControllerType]').css("display") != "none" && args.data.rootDiskControllerType != "")
                  array1.push("&details[0].rootDiskController=" + args.data.rootDiskControllerType);
                if(args.$form.find('.form-item[rel=nicAdapterType]').css("display") != "none" && args.data.nicAdapterType != "")
                  array1.push("&details[0].nicAdapter=" + args.data.nicAdapterType);
                if(args.$form.find('.form-item[rel=keyboardType]').css("display") != "none" && args.data.keyboardType != "")
                  array1.push("&details[0].keyboard=" + args.data.keyboardType);
                //VMware only (ends here)

                $.ajax({
                  url: createURL("registerTemplate" + array1.join("")),
                  dataType: "json",
                  success: function(json) {
                    var items = json.registertemplateresponse.template;  //items might have more than one array element if it's create templates for all zones.
                    args.response.success({data:items[0]});
                    /*
                     if(items.length > 1) {
                     for(var i=1; i<items.length; i++) {
                     var $midmenuItem2 = $("#midmenu_item").clone();
                     templateToMidmenu(items[i], $midmenuItem2);
                     bindClickToMidMenu($midmenuItem2, templateToRightPanel, templateGetMidmenuId);
                     $("#midmenu_container").append($midmenuItem2.show());
                     }
                     }
                     */
                  },
                  error: function(XMLHttpResponse) {
                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                    args.response.error(errorMsg);
                  }
                });
              },

              notification: {
                poll: function(args) {
                  args.complete();
                }
              }
            }
          },

          dataProvider: function(args) {
            var array1 = [];
            var ignoreProject = false;
            if(args.filterBy != null) {
              if(args.filterBy.kind != null) {
                switch(args.filterBy.kind) {
                case "all":
                  ignoreProject = true;
                  array1.push("&templatefilter=all");
                  break;
                case "mine":
                  array1.push("&templatefilter=self");
                  break;
                case "featured":
                  ignoreProject = true;
                  array1.push("&templatefilter=featured");
                  break;
                case "community":
                  ignoreProject = true;
                  array1.push("&templatefilter=community");
                  break;
                }
              }
              if(args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
                switch(args.filterBy.search.by) {
                case "name":
                  if(args.filterBy.search.value.length > 0)
                    array1.push("&keyword=" + args.filterBy.search.value);
                  break;
                }
              }
            }
            $.ajax({
              url: createURL("listTemplates&page=" + args.page + "&pagesize=" + pageSize + array1.join(""),
                             { ignoreProject: ignoreProject }),
              dataType: "json",
              async: true,
              success: function(json) {
                var items = json.listtemplatesresponse.template;
                args.response.success({
                  actionFilter: templateActionfilter,
                  data: items
                });
              }
            });
          }	,

          detailView: {
            name: 'Template details',
            actions: {
              edit: {
                label: 'label.edit',
                action: function(args) {
                  var array1 = [];
                  array1.push("&name=" + todb(args.data.name));
                  array1.push("&displaytext=" + todb(args.data.displaytext));
                  array1.push("&ostypeid=" + args.data.ostypeid);
                  array1.push("&passwordenabled=" + (args.data.passwordenabled=="on"));
                  $.ajax({
                    url: createURL("updateTemplate&id=" + args.context.templates[0].id + "&zoneid=" + args.context.templates[0].zoneid + array1.join("")),
                    dataType: "json",
                    async: false,
                    success: function(json) {
                      //API returns an incomplete embedded object  (some properties are missing in the embedded template object)
                    }
                  });

                  var array2 = [];
                  array2.push("&ispublic=" + (args.data.ispublic=="on"));
                  array2.push("&isfeatured=" + (args.data.isfeatured=="on"));
                  array2.push("&isextractable=" + (args.data.isextractable=="on"));
                  $.ajax({
                    url: createURL("updateTemplatePermissions&id=" + args.context.templates[0].id + "&zoneid=" + args.context.templates[0].zoneid + array2.join("")),
                    dataType: "json",
                    async: false,
                    success: function(json) {
                      //API doesn't return an embedded object
                    }
                  });

                  //So, we call listTemplates API to get a complete template object
                  $.ajax({
                    url: createURL("listTemplates&id=" + args.context.templates[0].id + "&zoneid=" + args.context.templates[0].zoneid + "&templatefilter=self"),
                    dataType: "json",
                    async: false,
                    success: function(json){
                      var item = json.listtemplatesresponse.template;
                      args.response.success({data: item});
                    }
                  });
                }
              },

              copyTemplate: {
                label: 'label.action.copy.template',
                messages: {
                  confirm: function(args) {
                    return 'Are you sure you want to copy template?';
                  },
                  success: function(args) {
                    return 'Template is being copied.';
                  },
                  notification: function(args) {
                    return 'label.action.copy.template';
                  }
                },
                createForm: {
                  title: 'label.action.copy.template',
                  desc: '',
                  fields: {
                    destinationZoneId: {
                      label: 'label.destination.zone',
                      validation: { required: true },
                      select: function(args) {
                        $.ajax({
                          url: createURL("listZones&available=true"),
                          dataType: "json",
                          async: true,
                          success: function(json) {
                            var zoneObjs = json.listzonesresponse.zone;
                            var items = [];
                            $(zoneObjs).each(function() {
                              if(this.id != args.context.templates[0].zoneid)
                                items.push({id: this.id, description: this.name});
                            });
                            args.response.success({data: items});
                          }
                        });
                      }
                    }
                  }
                },
                action: function(args) {
                  $.ajax({
                    url: createURL("copyTemplate&id=" + args.context.templates[0].id + "&sourcezoneid=" + args.context.templates[0].zoneid + "&destzoneid=" + args.data.destinationZoneId),
                    dataType: "json",
                    async: true,
                    success: function(json) {
                      var jid = json.copytemplateresponse.jobid;
                      args.response.success(
                        {_custom:
                         {jobId: jid,
                          getUpdatedItem: function(json) {
                            return {}; //nothing in this template needs to be updated
                          },
                          getActionFilter: function() {
                            return templateActionfilter;
                          }
                         }
                        }
                      );
                    }
                  });
                },
                notification: {
                  poll: pollAsyncJobResult
                }
              },

              downloadTemplate: {
                label: 'label.action.download.template',
                messages: {
                  confirm: function(args) {
                    return 'message.action.download.template';
                  },
                  notification: function(args) {
                    return 'Downloading template';
                  },
                  complete: function(args) {
                    var url = decodeURIComponent(args.url);
                    var htmlMsg = _l('message.download.template');
                    var htmlMsg2 = htmlMsg.replace(/#/, url).replace(/00000/, url);
                    return htmlMsg2;
                  }
                },
                action: function(args) {
                  var apiCmd = "extractTemplate&mode=HTTP_DOWNLOAD&id=" + args.context.templates[0].id;
                  if(args.context.templates[0].zoneid != null)
                    apiCmd += "&zoneid=" + args.context.templates[0].zoneid;

                  $.ajax({
                    url: createURL(apiCmd),
                    dataType: "json",
                    async: true,
                    success: function(json) {
                      var jid = json.extracttemplateresponse.jobid;
                      args.response.success(
                        {_custom:
                         {jobId: jid,
                          getUpdatedItem: function(json) {
                            return json.queryasyncjobresultresponse.jobresult.template;
                          },
                          getActionFilter: function() {
                            return templateActionfilter;
                          }
                         }
                        }
                      );
                    }
                  });
                },
                notification: {
                  poll: pollAsyncJobResult
                }
              },

              remove: {
                label: 'label.action.delete.template',
                messages: {
                  confirm: function(args) {
                    return 'message.action.delete.template';
                  },
                  notification: function(args) {
                    return 'label.action.delete.template';
                  }
                },
                action: function(args) {
                  var array1 = [];
                  if (args.context.templates[0].zoneid != null)
                    array1.push("&zoneid=" + args.context.templates[0].zoneid);

                  $.ajax({
                    url: createURL("deleteTemplate&id=" + args.context.templates[0].id + array1.join("")),
                    dataType: "json",
                    async: true,
                    success: function(json) {
                      var jid = json.deletetemplateresponse.jobid;
                      args.response.success(
                        {_custom:
                         {jobId: jid
                         }
                        }
                      );
                    }
                  });
                },
                notification: {
                  poll: pollAsyncJobResult
                }
              }

            },
            tabs: {
              details: {
                title: 'label.details',

                preFilter: function(args) {
                  var hiddenFields;
                  if(isAdmin()) {
                    hiddenFields = [];
                  }
                  else {
                    hiddenFields = ["hypervisor"];
                  }
                  return hiddenFields;
                },

                fields: [
                  {
                    name: {
                      label: 'label.name',
                      isEditable: true
                    }
                  },
                  {
                    id: { label: 'ID' },
                    zonename: { label: 'label.zone.name' },
                    zoneid: { label: 'label.zone.id' },
                    displaytext: {
                      label: 'label.description',
                      isEditable: true
                    },
                    hypervisor: { label: 'label.hypervisor' },
                    templatetype: { label: 'label.type' },
                    isready: { label: 'state.ready', converter:cloudStack.converters.toBooleanText },
                    status: { label: 'label.status' },
                    size : {
                      label: 'label.size',
                      converter: function(args) {
                        if (args == null || args == 0)
                          return "";
                        else
                          return cloudStack.converters.convertBytes(args);
                      }
                    },
                    isextractable: {
                      label: 'extractable',
                      isBoolean: true,
                      isEditable: true,
                      converter:cloudStack.converters.toBooleanText
                    },
                    passwordenabled: {
                      label: 'label.password.enabled',
                      isBoolean: true,
                      isEditable: true,
                      converter:cloudStack.converters.toBooleanText
                    },
                    ispublic: {
                      label: 'label.public',
                      isBoolean: true,
                      isEditable: true,
                      converter:cloudStack.converters.toBooleanText
                    },
                    isfeatured: {
                      label: 'label.featured',
                      isBoolean: true,
                      isEditable: true,
                      converter:cloudStack.converters.toBooleanText
                    },
                    crossZones: {
                      label: 'label.cross.zones',
                      converter:cloudStack.converters.toBooleanText
                    },

                    ostypeid: {
                      label: 'label.os.type',
                      isEditable: true,
                      select: function(args) {
                        $.ajax({
                          url: createURL("listOsTypes"),
                          dataType: "json",
                          async: true,
                          success: function(json) {
                            var ostypes = json.listostypesresponse.ostype;
                            var items = [];
                            $(ostypes).each(function() {
                              items.push({id: this.id, description: this.description});
                            });
                            args.response.success({data: items});
                          }
                        });
                      }
                    },

                    domain: { label: 'label.domain' },
                    account: { label: 'label.account' },
                    created: { label: 'label.created', converter: cloudStack.converters.toLocalDate }
                  }
                ],

                dataProvider: function(args) {
                  var jsonObj = args.context.templates[0];
                  var apiCmd = "listTemplates&templatefilter=self&id=" + jsonObj.id;
                  if(jsonObj.zoneid != null)
                    apiCmd = apiCmd + "&zoneid=" + jsonObj.zoneid;

                  $.ajax({
                    url: createURL(apiCmd),
                    dataType: "json",
                    success: function(json) {
                      args.response.success({
                        actionFilter: templateActionfilter,
                        data: json.listtemplatesresponse.template[0]
                      });
                    }
                  });

                }
              }
            }
          }
        }
      },
      isos: {
        type: 'select',
        title: 'label.iso',
        listView: {
          label: 'label.iso',
          filters: {
            all: {
             preFilter: function(args) {
                if (isAdmin()) //"listIsos&filter=all" only works for root-admin, but no domain-admin. Domain-admin is unable to see all Isos until listIsos API supports a new type of isofilter for domain-admin to see all Isos in his domain.
                  return true;
                else
                  return false;
              },
              label: 'ui.listView.filters.all'
            },
            mine: { label: 'ui.listView.filters.mine' },
            featured: { label: 'label.featured' },
            community: { label: 'label.community' }
          },
          fields: {
            name: { label: 'label.name' },
            zonename: { label: 'label.zone' }
          },

          reorder: cloudStack.api.actions.sort('updateIso', 'isos'),

          actions: {
            add: {
              label: 'label.add.iso',

              messages: {
                notification: function(args) {
{'fraction_non_alphanumeric': 0.11243740138574466, 'fraction_numerical': 0.0034129107498113466, 'mean_word_length': 0.9809410565653134, 'pattern_counts': {'":': 10, '<': 25, '<?xml version=': 0, '>': 27, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 14, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5796714', 'n_tokens_mistral': 13988, 'n_tokens_neox': 12805, 'n_words': 2289}