// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
(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' }
          },
					
					advSearchFields: {
					  name: { label: 'Name' },
						zoneid: { 
						  label: 'Zone',							
              select: function(args) {							  					
								$.ajax({
									url: createURL('listZones'),
									data: {
									  listAll: true
									},
									success: function(json) {									  
										var zones = json.listzonesresponse.zone;

										args.response.success({
											data: $.map(zones, function(zone) {
												return {
													id: zone.id,
													description: zone.name
												};
											})
										});
									}
								});
							}						
						},									
						tagKey: { label: 'Tag Key' },
						tagValue: { label: 'Tag Value' }						
					},
					
          reorder: cloudStack.api.actions.sort('updateTemplate', 'templates'),
          actions: {
            add: {
              label: 'label.action.register.template',
              messages: {    
                notification: function(args) {
                  return 'label.action.register.template';
                }
              },
              createForm: {
                title: 'label.action.register.template',
                docID:'helpNetworkOfferingName',                
                preFilter: cloudStack.preFilter.createTemplate,
                fields: {
                  name: {
                    label: 'label.name',
                    docID:'helpRegisterTemplateName',
                    validation: { required: true }
                  },
                  description: {
                    label: 'label.description',
                    docID: 'helpRegisterTemplateDescription',
                    validation: { required: true }
                  },
                  url: {
                    label: 'URL',
                    docID: 'helpRegisterTemplateURL',
                    validation: { required: true }
                  },
                  zone: {
                    label: 'label.zone',
                    docID: 'helpRegisterTemplateZone',
                    select: function(args) {
                      $.ajax({
                        url: createURL("listZones&available=true"),
                        dataType: "json",
                        async: true,
                        success: function(json) {    
													var zoneObjs= [];
													var items = json.listzonesresponse.zone;
													if(items != null) {
														for(var i = 0; i < items.length; i++) {																
															zoneObjs.push({id: items[i].id, description: items[i].name});		
														}
													}																										
													if (isAdmin() && !(cloudStack.context.projects && cloudStack.context.projects[0])){
                            zoneObjs.unshift({id: -1, description: "All Zones"});
                          }																										
													args.response.success({data: zoneObjs});     
                        }
                      });
                    }
                  },
                  hypervisor: {
                    label: 'label.hypervisor',
                    docID: 'helpRegisterTemplateHypervisor',
                    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',
                    docID: 'helpRegisterTemplateFormat',
                    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'});
                      }
                      else if(args.hypervisor == "LXC") {
                        //formatSelect.append("<option value='TAR'>TAR</option>");
                        items.push({id:'TAR', description: 'TAR'});
                      }
                      args.response.success({data: items});
                    }
                  },

                  osTypeId: {
                    label: 'label.os.type',
                    docID: 'helpRegisterTemplateOSType',
                    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",
                    docID: 'helpRegisterTemplateExtractable',
                    isBoolean: true
                  },

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

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

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

              action: function(args) {
							  var data = {
								  name: args.data.name,
									displayText: args.data.description,
									url: args.data.url,
									zoneid: args.data.zone,
									format: args.data.format,
									isextractable: (args.data.isExtractable=="on"),
									passwordEnabled: (args.data.isPasswordEnabled=="on"),
									osTypeId: args.data.osTypeId,
									hypervisor: args.data.hypervisor
								};		
                    
                if(args.$form.find('.form-item[rel=isPublic]').css("display") != "none") {
								  $.extend(data, {
									  ispublic: (args.data.isPublic == "on")
									});                  
								}
								
                if(args.$form.find('.form-item[rel=isFeatured]').css("display") != "none") {
								  $.extend(data, {
									  isfeatured: (args.data.isFeatured == "on")
									});		                 
								}

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

                $.ajax({
                  url: createURL('registerTemplate'),
                  data: data,
                  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 data = {};
						listViewDataProvider(args, data);		
						           
            var ignoreProject = false;
            if(args.filterBy != null) {	//filter dropdown
              if(args.filterBy.kind != null) {
                switch(args.filterBy.kind) {
                case "all":
                  ignoreProject = true;
									$.extend(data, {
									  templatefilter: 'all'
									});  
                  break;
                case "mine":
								  $.extend(data, {
									  templatefilter: 'self'
									});  
                  break;
                case "featured":
                  ignoreProject = true;
									$.extend(data, {
									  templatefilter: 'featured'
									});                    
                  break;
                case "community":
                  ignoreProject = true;
									$.extend(data, {
									  templatefilter: 'community'
									});                    
                  break;
                }
              }              
            }
						
            $.ajax({
              url: createURL('listTemplates', { ignoreProject: ignoreProject }),
              data: data,              
              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) {
								  //***** updateTemplate *****
								  var data = {
									  id: args.context.templates[0].id,
										zoneid: args.context.templates[0].zoneid,									
									  name: args.data.name,
										displaytext: args.data.displaytext,
										ostypeid: args.data.ostypeid,
										passwordenabled: (args.data.passwordenabled=="on")										
									};	   
                  $.ajax({
                    url: createURL('updateTemplate'),
                    data: data,
                    async: false,
                    success: function(json) {
                      //API returns an incomplete embedded object  (some properties are missing in the embedded template object)
                    }
                  });								
									
									
									//***** updateTemplatePermissions *****
                  var data = {
									  id: args.context.templates[0].id,
										zoneid: args.context.templates[0].zoneid
									};     
									
									//if args.data.ispublic is undefined, do not pass ispublic to API call.
									if(args.data.ispublic == "on") {
									  $.extend(data, {
										  ispublic: true
										});					
                  }										
									else if(args.data.ispublic == "off") {
									  $.extend(data, {
										  ispublic: false
										});
									}																		
									//if args.data.isfeatured is undefined, do not pass isfeatured to API call.
									if(args.data.isfeatured == "on") {
									  $.extend(data, {
										  isfeatured: true
										});
									}
									else if(args.data.isfeatured == "off") {
									  $.extend(data, {
										  isfeatured: false
										});									}									
									//if args.data.isextractable is undefined, do not pass isextractable to API call.                  
									if(args.data.isextractable == "on") {
									  $.extend(data, {
										  isextractable: true
										});			
									}
									else if(args.data.isextractable == "off") {
									  $.extend(data, {
										  isextractable: false
										});
                  }								
                  $.ajax({
                    url: createURL('updateTemplatePermissions'),
                    data: data,
                    async: false,
                    success: function(json) {
                      //API doesn't return an embedded object
                    }
                  });

									
									//***** listTemplates *****
                  //So, we call listTemplates API to get a complete template object
									var data = {
									  id: args.context.templates[0].id,
										zoneid: args.context.templates[0].zoneid,
										templatefilter: 'self'
									};
                  $.ajax({
                    url: createURL('listTemplates'),
                    data: data,
                    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',
                      docID: 'helpCopyTemplateDestination',
                      validation: { required: true },
                      select: function(args) {
                        $.ajax({
                          url: createURL("listZones&available=true"),
                          dataType: "json",
                          async: true,
                          success: function(json) {
														var zoneObjs = [];
														var items = json.listzonesresponse.zone;	
													  if(items != null) {
															for(var i = 0; i < items.length; i++) {																																	
																if(items[i].id != args.context.templates[0].zoneid) { //destination zone must be different from source zone
																	zoneObjs.push({id: items[i].id, description: items[i].name});
																}																	
															}
														}			
                            args.response.success({data: zoneObjs});
                          }
                        });
                      }
                    }
                  }
                },
                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,
                      validation: { required: true }
                    }
                  },
                  {
                    id: { label: 'ID' },
                    zonename: { label: 'label.zone.name' },
                    zoneid: { label: 'label.zone.id' },
                    displaytext: {
                      label: 'label.description',
                      isEditable: true,
                      validation: { required: 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: function() {
											  if(isAdmin())
											    return true;
												else
												  return false;
											},
                      converter:cloudStack.converters.toBooleanText
                    },
                    passwordenabled: {
                      label: 'label.password.enabled',
                      isBoolean: true,
                      isEditable: true,
                      converter:cloudStack.converters.toBooleanText
                    },
                    ispublic: {
                      label: 'label.public',
                      isBoolean: true,
                      isEditable: function() {
											  if(isAdmin()) {
											    return true;
												}
												else {
												  if (g_userPublicTemplateEnabled == "true")
													  return true;
													else 
												    return false;
												}
											},
                      converter:cloudStack.converters.toBooleanText
                    },
                    isfeatured: {
                      label: 'label.featured',
                      isBoolean: true,
                      isEditable: function() {
											  if(isAdmin())
											    return true;
												else
												  return false;
											},
                      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 }
                  }
                 ],
         
               tags: cloudStack.api.tags({ resourceType: 'Template', contextId: 'templates' }),
 

               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.action.register.iso',
              messages: {
                notification: function(args) {
                  return 'label.action.register.iso';
                }
              },
              createForm: {
                title: 'label.action.register.iso',                
                preFilter: cloudStack.preFilter.createTemplate,
                fields: {
                  name: {
                    label: 'label.name',
                    docID: 'helpRegisterISOName',
                    validation: { required: true }
                  },
                  description: {
                    label: 'label.description',
                    docID: 'helpRegisterISODescription',
                    validation: { required: true }
                  },
                  url: {
                    label: 'URL',
                    docID: 'helpRegisterISOURL',
                    validation: { required: true }
                  },
                  zone: {
                    label: 'label.zone',
                    docID: 'helpRegisterISOZone',
                    select: function(args) {
                      $.ajax({
                        url: createURL("listZones&available=true"),
                        dataType: "json",
                        async: true,
                        success: function(json) {													
													var zoneObjs = [];
													var items = json.listzonesresponse.zone;
													if(items != null) {
														for(var i = 0; i < items.length; i++) {																
															zoneObjs.push({id: items[i].id, description: items[i].name});		
														}
													}													
													if (isAdmin() && !(cloudStack.context.projects && cloudStack.context.projects[0])){
                            zoneObjs.unshift({id: -1, description: "All Zones"});
                          }																										
													args.response.success({data: zoneObjs});  
                        }
                      });
                    }
                  },

                  isBootable: {
                    label: "label.bootable",
                    docID: 'helpRegisterISOBootable',
                    isBoolean: true,
                    isChecked: true
                  },

                  osTypeId: {
                    label: 'label.os.type',
                    docID: 'helpRegisterISOOSType',
                    dependsOn: 'isBootable',
                    isHidden: false,
                    validation: { required: true },
                    select: function(args) {
                      $.ajax({
                        url: createURL("listOsTypes"),
                        dataType: "json",
                        async: true,
                        success: function(json) {
                          var osTypeObjs = json.listostypesresponse.ostype;
                          var items = [];
                          //items.push({id: "", description: "None"}); //shouldn't have None option when bootable is checked
                          $(osTypeObjs).each(function(){
                            items.push({id: this.id, description: this.description});
                          });
                          args.response.success({data: items});
                        }
                      });
                    }
                  },

                  isExtractable: {
                    label: "extractable",
                    docID: 'helpRegisterISOExtractable',
                    isBoolean: true
                  },

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

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

              action: function(args) {
							  var data = {
								  name: args.data.name,
									displayText: args.data.description,
									url: args.data.url,
									zoneid: args.data.zone,
									isextractable: (args.data.isExtractable=="on"),
									bootable: (args.data.isBootable=="on") 
								};		  

                if(args.$form.find('.form-item[rel=osTypeId]').css("display") != "none") {
								  $.extend(data, {
									  osTypeId: args.data.osTypeId
									});
								}
                if(args.$form.find('.form-item[rel=isPublic]').css("display") != "none") {
								  $.extend(data, {
									  ispublic: (args.data.isPublic == "on")
									});								
								}
                if(args.$form.find('.form-item[rel=isFeatured]').css("display") != "none") {
								  $.extend(data, {
									  isfeatured: (args.data.isFeatured == "on")
									});
								}

                $.ajax({
                  url: createURL('registerIso'),
                  data: data,
                  success: function(json) {
                    var items = json.registerisoresponse.iso;	//items might have more than one array element if it's create ISOs 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();
                     ISOToMidmenu(items[i], $midmenuItem2);
                     bindClickToMidMenu($midmenuItem2, templateToRightPanel, ISOGetMidmenuId);
                     $("#midmenu_container").append($midmenuItem2.show());              }
                     }
                     */
                  },
                  error: function(XMLHttpResponse) {
                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                    args.response.error(errorMsg);
                  }
                });
              },

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

					advSearchFields: {
					  name: { label: 'Name' },
						zoneid: { 
						  label: 'Zone',							
              select: function(args) {							  					
								$.ajax({
									url: createURL('listZones'),
									data: {
									  listAll: true
									},
									success: function(json) {									  
										var zones = json.listzonesresponse.zone;

										args.response.success({
											data: $.map(zones, function(zone) {
												return {
													id: zone.id,
													description: zone.name
												};
											})
										});
									}
								});
							}						
						},									
						tagKey: { label: 'Tag Key' },
						tagValue: { label: 'Tag Value' }						
					},
					
          dataProvider: function(args) {
					  var data = {};
						listViewDataProvider(args, data);		
						           
            var ignoreProject = false;
            if(args.filterBy != null) {	//filter dropdown
              if(args.filterBy.kind != null) {
                switch(args.filterBy.kind) {
                case "all":
                  ignoreProject = true;
									$.extend(data, {
									  isofilter: 'all'
									});  
                  break;
                case "mine":
								  $.extend(data, {
									  isofilter: 'self'
									});  
                  break;
                case "featured":
                  ignoreProject = true;
									$.extend(data, {
									  isofilter: 'featured'
									});                    
                  break;
                case "community":
                  ignoreProject = true;
									$.extend(data, {
									  isofilter: 'community'
									});                    
                  break;
                }
              }              
            }		

            $.ajax({
              url: createURL('listIsos', { ignoreProject: ignoreProject }),
              data: data,      
              success: function(json) {
                var items = json.listisosresponse.iso;
                args.response.success({
                  actionFilter: isoActionfilter,
                  data: items
                });
              }
            });
          },

          detailView: {
            name: 'label.details',
            actions: {
              edit: {
                label: 'label.edit',
                action: function(args) {
                  //***** updateIso *****
									var data = {
									  id: args.context.isos[0].id,
										zoneid: args.context.isos[0].zoneid,
										name: args.data.name,
										displaytext: args.data.displaytext,
										ostypeid: args.data.ostypeid
									};                 
                  $.ajax({
                    url: createURL('updateIso'),
                    data: data,
                    async: false,
                    success: function(json) {
                      //updateIso API returns an incomplete ISO object (isextractable and isfeatured are missing)
                    }
                  });

									
									//***** updateIsoPermissions *****   
                  var data = {
									  id: args.context.isos[0].id,
										zoneid: args.context.isos[0].zoneid,
									};									
									//if args.data.ispublic is undefined, do not pass ispublic to API call.
									if(args.data.ispublic == "on") {
									  $.extend(data, {
										  ispublic: true
										});					
                  }										
									else if(args.data.ispublic == "off") {
									  $.extend(data, {
										  ispublic: false
										});
									}																		
									//if args.data.isfeatured is undefined, do not pass isfeatured to API call.
									if(args.data.isfeatured == "on") {
									  $.extend(data, {
										  isfeatured: true
										});
									}
									else if(args.data.isfeatured == "off") {
									  $.extend(data, {
										  isfeatured: false
										});									}									
									//if args.data.isextractable is undefined, do not pass isextractable to API call.                  
									if(args.data.isextractable == "on") {
									  $.extend(data, {
										  isextractable: true
										});			
									}
									else if(args.data.isextractable == "off") {
									  $.extend(data, {
										  isextractable: false
										});
                  }									                 
                  $.ajax({
                    url: createURL('updateIsoPermissions'),
                    data: data,
                    async: false,
                    success: function(json) {
                      //updateIsoPermissions API doesn't return ISO object
                    }
                  });

									
									//***** listIsos *****
                  //So, we call listIsos API to get a complete ISO object
									var data = {
									  id: args.context.isos[0].id,
										zoneid: args.context.isos[0].zoneid,
										isofilter: 'self'
									};									
                  $.ajax({
                    url: createURL('listIsos'),
                    data: data,
                    async: false,
                    success: function(json){
                      var item = json.listisosresponse.iso;
                      args.response.success({data: item});
                    }
                  });
                }
              },

              copyISO: {
                label: 'label.action.copy.ISO',
                messages: {
                  notification: function(args) {
                    return 'Copying ISO';
                  }
                },
                createForm: {
                  title: 'label.action.copy.ISO',
                  desc: 'label.action.copy.ISO',
                  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 = [];
														var items = json.listzonesresponse.zone;			
													  if(items != null) {
															for(var i = 0; i < items.length; i++) {																																	
																if(items[i].id != args.context.isos[0].zoneid) { //destination zone must be different from source zone
																	zoneObjs.push({id: items[i].id, description: items[i].name});
																}																	
															}
														}		
                            args.response.success({data: zoneObjs});			
                          }
                        });
                      }
                    }
                  }
                },
                action: function(args) {
                  $.ajax({
                    url: createURL("copyIso&id=" + args.context.isos[0].id + "&sourcezoneid=" + args.context.isos[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 ISO needs to be updated
                          },
                          getActionFilter: function() {
                            return isoActionfilter;
                          }
                         }
                        }
                      );
                    }
                  });
                },
                notification: {
                  poll: pollAsyncJobResult
                }
              },

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

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

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

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

            },

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

                fields: [
                  {
                    name: {
                      label: 'label.name',
                      isEditable: true,
                      validation: { required: true }
                    }
                  },
                  {
                    id: { label: 'ID' },
                    zonename: { label: 'label.zone.name' },
                    zoneid: { label: 'label.zone.id' },
                    displaytext: {
                      label: 'label.description',
                      isEditable: true,
                      validation: { required: true }
                    },
                    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
                    },
                    bootable: {
                      label: 'label.bootable',
                      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 }
                  }
                ],
                  
                 tags: cloudStack.api.tags({ resourceType: 'ISO', contextId: 'isos' }),

                 dataProvider: function(args) {
                  var jsonObj = args.context.isos[0];
                  var apiCmd = "listIsos&isofilter=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: isoActionfilter,
                        data: json.listisosresponse.iso[0]
                      });
                    }
                  });

                }
              }
            }
          }
        }
      }
    }
  };

  var templateActionfilter = function(args) {
    var jsonObj = args.context.item;
    var allowedActions = [];

    // "Edit Template", "Copy Template", "Create VM"
    if ((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id))  //if neither root-admin, nor the same account, nor the same project
        || jsonObj.templatetype == "SYSTEM" || jsonObj.isready == false) {
      //do nothing
    }
    else {
      allowedActions.push("edit");

      if(havingSwift == false && havingS3 == false)
        allowedActions.push("copyTemplate");

      //allowedActions.push("createVm"); // For Beta2, this simply doesn't work without a network.
    }

    // "Download Template"
    if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id)))  //if neither root-admin, nor the same account, nor the same project
        || (jsonObj.isready == false) || jsonObj.templatetype == "SYSTEM") {
      //do nothing
    }
    else {
      allowedActions.push("downloadTemplate");
    }

    // "Delete Template"
    //if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)))
    if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id)))  //if neither root-admin, nor the same account, nor the same project
        || (jsonObj.isready == false && jsonObj.status != null && jsonObj.status.indexOf("Downloaded") != -1)
        || (jsonObj.account ==	"system")) {
      //do nothing
    }
    else {
      allowedActions.push("remove");
    }

    return allowedActions;
  }

  var isoActionfilter = function(args) {
    var jsonObj = args.context.item;
    var allowedActions = [];

    if ((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id))  //if neither root-admin, nor the same account, nor the same project
        || (jsonObj.isready == false)
        || (jsonObj.domainid ==	1 && jsonObj.account ==	"system")
       ) {
         //do nothing
       }
    else {
      allowedActions.push("edit");

      if(havingSwift == false)
        allowedActions.push("copyISO");
    }

    // "Create VM"
    // Commenting this out for Beta2 as it does not support the new network.
    /*
     //if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id))  //if neither root-admin, nor the same account, nor the same project
     if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account))  //if neither root-admin, nor item owner
     || jsonObj.isready == false)
     || (jsonObj.bootable == false)
     || (jsonObj.domainid ==	1 && jsonObj.account ==	"system")
     ) {
       //do nothing
     }
     else {
       allowedActions.push("createVm");
     }
     */

    // "Download ISO"
    //if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)))
    if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id)))  //if neither root-admin, nor the same account, nor the same project
        || (jsonObj.isready == false)
        || (jsonObj.domainid ==	1 && jsonObj.account ==	"system")
       ) {
         //do nothing
       }
    else {
      allowedActions.push("downloadISO");
    }

    // "Delete ISO"
    //if (((isUser() && jsonObj.ispublic == true && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account)))
    if (((isAdmin() == false && !(jsonObj.domainid == g_domainid && jsonObj.account == g_account) && !(jsonObj.domainid == g_domainid && cloudStack.context.projects && jsonObj.projectid == cloudStack.context.projects[0].id)))  //if neither root-admin, nor the same account, nor the same project
        || (jsonObj.isready == false && jsonObj.status != null && jsonObj.status.indexOf("Downloaded") != -1)
        || (jsonObj.account ==	"system")
       ) {
         //do nothing
       }
    else {
      allowedActions.push("remove");
    }

    return allowedActions;
  }

})(cloudStack, jQuery);
