// 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, $) {

  var requiredNetworkOfferingExists = false;
  var networkServiceObjs = [], serviceCheckboxNames = [];
	var serviceFields = []; 
	
  cloudStack.sections.configuration = {
    title: 'label.menu.service.offerings',
    id: 'configuration',
    sectionSelect: {
      label: 'label.select.offering'
    },
    sections: {
      serviceOfferings: {
        type: 'select',
        title: 'label.compute.offerings',
        listView: {
          id: 'serviceOfferings',
          label: 'label.menu.service.offerings',
          fields: {
            name: { label: 'label.name', editable: true },
            displaytext: { label: 'label.description' }
          },

          reorder: cloudStack.api.actions.sort('updateServiceOffering', 'serviceOfferings'),

          actions: {
            add: {
              label: 'label.add.compute.offering',

              messages: {
                confirm: function(args) {
                  return 'message.add.service.offering';
                },
                notification: function(args) {
                  return 'label.add.compute.offering';
                }
              },

              createForm: {
                title: 'label.add.compute.offering',
                fields: {
                  name: {
                    label: 'label.name',
                    docID: 'helpComputeOfferingName',
                    validation: { required: true }
                  },
                  description: {
                    label: 'label.description',
                    docID: 'helpComputeOfferingDescription',
                    validation: { required: true }
                  },
                  storageType: {
                    label: 'label.storage.type',
                    docID: 'helpComputeOfferingStorageType',
                    select: function(args) {
                      var items = [];
                      items.push({id: 'shared', description: 'shared'});
                      items.push({id: 'local', description: 'local'});
                      args.response.success({data: items});
                    }
                  },
                  cpuNumber: {
                    label: 'label.num.cpu.cores',
                    docID: 'helpComputeOfferingCPUCores',
                    validation: {
                      required: true,
                      number: true
                    }
                  },
                  cpuSpeed: {
                    label: 'label.cpu.mhz',
                    docID: 'helpComputeOfferingCPUMHz',
                    validation: {
                      required: true,
                      number: true
                    }
                  },
                  memory: {
                    label: 'label.memory.mb',
                    docID: 'helpComputeOfferingMemory',
                    validation: {
                      required: true,
                      number: true
                    }
                  },
                  networkRate: {
                    label: 'label.network.rate',
                    docID: 'helpComputeOfferingNetworkRate',
                    validation: {
                      required: false, //optional
                      number: true
                    }
                  },
                  offerHA: {
                    label: 'label.offer.ha',
                    docID: 'helpComputeOfferingHA',
                    isBoolean: true,
                    isChecked: false
                  },
                  storageTags: {
                    label: 'label.storage.tags',
                    docID: 'helpComputeOfferingStorageType'
                  },
                  hostTags: {
                    label: 'label.host.tags',
                    docID: 'helpComputeOfferingHostTags'
                  },
                  cpuCap: {
                    label: 'label.CPU.cap',
                    isBoolean: true,
                    isChecked: false,
                    docID: 'helpComputeOfferingCPUCap'
                  },
                  isPublic: {
                    label: 'label.public',
                    isBoolean: true,
                    isReverse: true,
                    isChecked: true,
                    docID: 'helpComputeOfferingPublic'
                  },

                   isVolatile:{
                     label:'isVolatile',
                     isBoolean:true,
                     isChecked:false

                   },

                  domainId: {
                    label: 'label.domain',
                    docID: 'helpComputeOfferingDomain',
                    dependsOn: 'isPublic',
                    select: function(args) {		
                      $.ajax({
                        url: createURL("listDomains&listAll=true"),
                        dataType: "json",
                        async: false,
                        success: function(json) {
                          var items = [];
                          var domainObjs = json.listdomainsresponse.domain;
                          $(domainObjs).each(function(){
                            items.push({id: this.id, description: this.path});
                          });
                          args.response.success({data: items});
                        }
                      });
                    },
                    isHidden: true
                  }
                }
              },

              action: function(args) {
                var data = {
								  issystem: false,
								  name: args.data.name,
									displaytext: args.data.description,
									storageType: args.data.storageType,
									cpuNumber: args.data.cpuNumber,
									cpuSpeed: args.data.cpuSpeed,
									memory: args.data.memory
								};															
               
                if(args.data.networkRate != null && args.data.networkRate.length > 0) {
								  $.extend(data, {
									  networkrate: args.data.networkRate
									});
								}

                $.extend(data, {
                  offerha: (args.data.offerHA == "on")
                });								
								
                if(args.data.storageTags != null && args.data.storageTags.length > 0) {
								  $.extend(data, {
									  tags: args.data.storageTags
									});								
                }
								
                if(args.data.hostTags != null && args.data.hostTags.length > 0) {
								  $.extend(data, {
									  hosttags: args.data.hostTags
									});								
                }
								
								$.extend(data, {
								  limitcpuuse: (args.data.cpuCap == "on")
								});
      
                 $.extend(data, {
                  isvolatile: (args.data.isVolatile == "on")
                });
                
                if(args.$form.find('.form-item[rel=domainId]').css("display") != "none") {
								  $.extend(data, {
									  domainid: args.data.domainId
									});								
								}

                $.ajax({
                  url: createURL('createServiceOffering'),
                  data: data,                 
                  success: function(json) {
                    var item = json.createserviceofferingresponse.serviceoffering;
                    args.response.success({data: item});
                  },
                  error: function(data) {
                    args.response.error(parseXMLHttpResponse(data));
                  }
                });
              },

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

          dataProvider: function(args) {					 
						var data = {};
						listViewDataProvider(args, data);						
						
						$.extend(data, {
						  issystem: false
						});
						
            $.ajax({
              url: createURL('listServiceOfferings'),
              data: data,              
              success: function(json) {
                var items = json.listserviceofferingsresponse.serviceoffering;
                args.response.success({
                  actionFitler: serviceOfferingActionfilter,
                  data:items
                });
              },
              error: function(data) {
                args.response.error(parseXMLHttpResponse(data));
              }
            });
          },

          detailView: {
            name: 'Service offering details',
            actions: {
              edit: {
                label: 'label.edit',
                action: function(args) {
                  var data = {
									  id: args.context.serviceOfferings[0].id,
									  name: args.data.name,
										displaytext: args.data.displaytext
									};                
                  $.ajax({
                    url: createURL('updateServiceOffering'),
                    data: data,
                    success: function(json) {
                      var item = json.updateserviceofferingresponse.serviceoffering;
                      args.response.success({data: item});
                    },
                    error: function(data) {
                      args.response.error(parseXMLHttpResponse(data));
                    }
                  });
                }
              },

              remove: {
                label: 'label.action.delete.service.offering',
                messages: {
                  confirm: function(args) {
                    return 'message.action.delete.service.offering';
                  },
                  notification: function(args) {
                    return 'label.action.delete.service.offering';
                  }
                },
                action: function(args) {
								  var data = {
									  id: args.context.serviceOfferings[0].id
									};								
                  $.ajax({
                    url: createURL('deleteServiceOffering'),
                    data: data,
                    async: true,
                    success: function(json) {
                      args.response.success();
                    },
                    error: function(data) {
                      args.response.error(parseXMLHttpResponse(data));
                    }
                  });
                },
                notification: {
                  poll: function(args) {
                    args.complete();
                  }
                }
              }
            },

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

                fields: [
                  {
                    name: {
                      label: 'label.name',
                      isEditable: true,
					            validation: { required: true }
                    }
                  },
                  {
                    id: { label: 'label.id' },
                    displaytext: {
                      label: 'label.description',
                      isEditable: true,
					            validation: { required: true }
                    },
                    storagetype: { label: 'label.storage.type' },
                    cpunumber: { label: 'label.num.cpu.cores' },
                    cpuspeed: {
                      label: 'label.cpu.mhz',
                      converter: function(args) {
                        return cloudStack.converters.convertHz(args);
                      }
                    },
                    memory: {
                      label: 'label.memory.mb',
                      converter: function(args) {
                        return cloudStack.converters.convertBytes(args*1024*1024);
                      }
                    },
                    networkrate: { label: 'label.network.rate' },
                    offerha: {
                      label: 'label.offer.ha',
                      converter: cloudStack.converters.toBooleanText
                    },
                    limitcpuuse: {
                      label: 'label.CPU.cap',
                      converter: cloudStack.converters.toBooleanText
                    },
                    isvolatile:{ label:'Volatile' , converter: cloudStack.converters.toBooleanText },
                    tags: { label: 'label.storage.tags' },
                    hosttags: { label: 'label.host.tags' },
                    domain: { label: 'label.domain' },
                    created: { label: 'label.created', converter: cloudStack.converters.toLocalDate }
                  }
                ],

                dataProvider: function(args) {			
                  var data = {
									  issystem: false,
										id: args.context.serviceOfferings[0].id
									};								
									$.ajax({
										url: createURL('listServiceOfferings'),
										data: data,
										async: true,
										success: function(json) {										  
											var item = json.listserviceofferingsresponse.serviceoffering[0];
											args.response.success({
												actionFitler: serviceOfferingActionfilter,
												data: item
											});
										}
									});									
                }
              }
            }
          }
        }
      },

      systemServiceOfferings: {
        type: 'select',
        title: 'label.menu.system.service.offerings',
        listView: {
          id: 'systemServiceOfferings',
          label: 'label.menu.system.service.offerings',
          fields: {
            name: { 
						  label: 'label.name', 
							editable: true 
						},
            displaytext: { 
						  label: 'label.description' 
						}
          },

          reorder: cloudStack.api.actions.sort('updateServiceOffering', 'systemServiceOfferings'),

          actions: {
            add: {
              label: 'label.add.system.service.offering',

              messages: {
                confirm: function(args) {
                  return 'message.add.system.service.offering';
                },
                notification: function(args) {
                  return 'label.add.system.service.offering';
                }
              },

              createForm: {
                title: 'label.add.system.service.offering',
                fields: {
                  name: {
                    label: 'label.name',
                    validation: { required: true },
                    docID: 'helpSystemOfferingName'
                  },
                  description: {
                    label: 'label.description',
                    validation: { required: true },
                    docID: 'helpSystemOfferingDescription'
                  },																		
									systemvmtype: {
                    label: 'label.system.vm.type',
                    docID: 'helpSystemOfferingVMType',
                    select: function(args) {
                      var items = [];											
                      items.push({id: 'domainrouter', description: dictionary['label.domain.router']}); 
                      items.push({id: 'consoleproxy', description: dictionary['label.console.proxy']});
											items.push({id: 'secondarystoragevm', description: dictionary['label.secondary.storage.vm']});
                      args.response.success({data: items});
                    }
                  },									
                  storageType: {
                    label: 'label.storage.type',
                    docID: 'helpSystemOfferingStorageType',
                    select: function(args) {
                      var items = [];
                      items.push({id: 'shared', description: 'shared'});
                      items.push({id: 'local', description: 'local'});
                      args.response.success({data: items});
                    }
                  },
                  cpuNumber: {
                    label: 'label.num.cpu.cores',
                    docID: 'helpSystemOfferingCPUCores',
                    validation: {
                      required: true,
                      number: true
                    }
                  },
                  cpuSpeed: {
                    label: 'label.cpu.mhz',
                    docID: 'helpSystemOfferingCPUMHz',
                    validation: {
                      required: true,
                      number: true
                    }
                  },
                  memory: {
                    label: 'label.memory.mb',
                    docID: 'helpSystemOfferingMemory',
                    validation: {
                      required: true,
                      number: true
                    }
                  },
                  networkRate: {
                    label: 'label.network.rate',
                    docID: 'helpSystemOfferingNetworkRate',
                    validation: {
                      required: false, //optional
                      number: true
                    }
                  },
                  offerHA: {
                    label: 'label.offer.ha',
                    docID: 'helpSystemOfferingHA',
                    isBoolean: true,
                    isChecked: false
                  },
                  storageTags: {
                    label: 'label.storage.tags',
                    docID: 'helpSystemOfferingStorageTags'
                  },
                  hostTags: {
                    label: 'label.host.tags',
                    docID: 'helpSystemOfferingHostTags'
                  },
                  cpuCap: {
                    label: 'label.CPU.cap',
                    isBoolean: true,
                    isChecked: false,
                    docID: 'helpSystemOfferingCPUCap'
                  },
                  isPublic: {
                    label: 'label.public',
                    isBoolean: true,
                    isReverse: true,
                    isChecked: true,
                    docID: 'helpSystemOfferingPublic'
                  },
                  domainId: {
                    label: 'label.domain',
                    docID: 'helpSystemOfferingDomain',
                    dependsOn: 'isPublic',
                    select: function(args) {										
                      $.ajax({
                        url: createURL("listDomains&listAll=true"),
                        dataType: "json",
                        async: false,
                        success: function(json) {
                          var items = [];
                          var domainObjs = json.listdomainsresponse.domain;
                          $(domainObjs).each(function(){
                            items.push({id: this.id, description: this.path});
                          });
                          args.response.success({data: items});
                        }
                      });
                    },
                    isHidden: true
                  }
                }
              },

              action: function(args) {
                var data = {
								  issystem: true,
								  name: args.data.name,
									displaytext: args.data.description,
									systemvmtype: args.data.systemvmtype,
									storageType: args.data.storageType,
									cpuNumber: args.data.cpuNumber,
									cpuSpeed: args.data.cpuSpeed,
									memory: args.data.memory
								};		

                if(args.data.networkRate != null && args.data.networkRate.length > 0) {
								  $.extend(data, {
									  networkrate: args.data.networkRate
									});								
								}

								$.extend(data, {
								  offerha: (args.data.offerHA == "on")
								});								
               
                if(args.data.storageTags != null && args.data.storageTags.length > 0) {
								  $.extend(data, {
									  tags: args.data.storageTags
									});		
								}

                if(args.data.hostTags != null && args.data.hostTags.length > 0) {
								  $.extend(data, {
									  hosttags: args.data.hostTags
									});								
								}

								$.extend(data, {
								  limitcpuuse: (args.data.cpuCap == "on")
								});
                
                if(args.$form.find('.form-item[rel=domainId]').css("display") != "none") {
								  $.extend(data, {
									  domainid: args.data.domainId
									});								
								}

                $.ajax({
                  url: createURL('createServiceOffering'),
                  data: data,                 
                  success: function(json) {
                    var item = json.createserviceofferingresponse.serviceoffering;
                    args.response.success({data: item});
                  },
                  error: function(data) {
                    args.response.error(parseXMLHttpResponse(data));
                  }
                });
              },

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

          dataProvider: function(args) {					  
						var data = {};
						listViewDataProvider(args, data);			

            $.extend(data, {
              issystem: true
            });						
											
            $.ajax({
              url: createURL('listServiceOfferings'),
              data: data,             
              success: function(json) {
                var items = json.listserviceofferingsresponse.serviceoffering;
                args.response.success({data:items});
              },
              error: function(data) {
                args.response.error(parseXMLHttpResponse(data));
              }
            });
          },

          detailView: {
            name: 'System service offering details',
            actions: {
              edit: {
                label: 'label.edit',
                action: function(args) {
                  var data = {
									  id: args.context.systemServiceOfferings[0].id,
										name: args.data.name,
                    displaytext: args.data.displaytext
									};                 
                  $.ajax({
                    url: createURL('updateServiceOffering'),
                    data: data,
                    success: function(json) {
                      var item = json.updateserviceofferingresponse.serviceoffering;
                      args.response.success({data: item});
                    },
                    error: function(data) {
                      args.response.error(parseXMLHttpResponse(data));
                    }
                  });
                }
              },

              remove: {
                label: 'label.action.delete.system.service.offering',
                messages: {
                  confirm: function(args) {
                    return 'message.action.delete.system.service.offering';
                  },
                  notification: function(args) {
                    return 'label.action.delete.system.service.offering';
                  }
                },
                action: function(args) {
								  var data = {
									  id: args.context.systemServiceOfferings[0].id
									};								
                  $.ajax({
                    url: createURL('deleteServiceOffering'),
                    data: data,                    
                    success: function(json) {
                      args.response.success();
                    },
                    error: function(data) {
                      args.response.error(parseXMLHttpResponse(data));
                    }
                  });
                },
                notification: {
                  poll: function(args) {
                    args.complete();
                  }
                }
              }
            },

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

                fields: [
                  {
                    name: {
                      label: 'label.name',
                      isEditable: true,
					            validation: { required: true }
                    }
                  },
                  {
                    id: { label: 'label.id' },
                    displaytext: {
                      label: 'label.description',
                      isEditable: true,
					            validation: { required: true }
                    },								
										systemvmtype: { 
										  label: 'label.system.vm.type',
											converter: function(args) {		                        
												var text = '';
												switch(args) {
												  case 'domainrouter':
													  text = dictionary['label.domain.router'];
													  break;
													case 'consoleproxy':
													  text = dictionary['label.console.proxy'];
													  break;
													case 'secondarystoragevm':
													  text = dictionary['label.secondary.storage.vm'];
													  break;
												}											
												return text;
											}
										},										
                    storagetype: { label: 'label.storage.type' },
                    cpunumber: { label: 'label.num.cpu.cores' },
                    cpuspeed: {
                      label: 'label.cpu.mhz',
                      converter: function(args) {
                        return cloudStack.converters.convertHz(args);
                      }
                    },
                    memory: {
                      label: 'label.memory.mb',
                      converter: function(args) {
                        return cloudStack.converters.convertBytes(args*1024*1024);
                      }
                    },
                    networkrate: { label: 'label.network.rate' },
                    offerha: {
                      label: 'label.offer.ha',
                      converter: cloudStack.converters.toBooleanText
                    },
                    limitcpuuse: {
                      label: 'label.CPU.cap',
                      converter: cloudStack.converters.toBooleanText
                    },
                    tags: { label: 'label.storage.tags' },
                    hosttags: { label: 'label.host.tags' },
                    domain: { label: 'label.domain' },
                    created: { label: 'label.created', converter: cloudStack.converters.toLocalDate }
                  }
                ],

                dataProvider: function(args) {		
                  var data = {
									  issystem: true,
										id: args.context.systemServiceOfferings[0].id
									};								
									$.ajax({
										url: createURL('listServiceOfferings'),
										data: data,										
										success: function(json) {										  
											var item = json.listserviceofferingsresponse.serviceoffering[0];
											args.response.success({
												actionFitler: systemServiceOfferingActionfilter,
												data: item
											});
										}
									});	        
                }
              }
            }
          }
        }
      },

      diskOfferings: {
        type: 'select',
        title: 'label.menu.disk.offerings',
        listView: {
          id: 'diskOfferings',
          label: 'label.menu.disk.offerings',
          fields: {
            name: { label: 'label.name' },
            displaytext: { label: 'label.description' },
            iscustomized: {
              label: 'label.custom.disk.size',
              converter: cloudStack.converters.toBooleanText
            },
            disksize: {
              label: 'label.disk.size.gb',
              converter: function(args) {
                if(args != 0)
                  return args;
                else
                  return "N/A";
              }
            }
          },

          reorder: cloudStack.api.actions.sort('updateDiskOffering', 'diskOfferings'),

          dataProvider: function(args) {					  
						var data = {};
						listViewDataProvider(args, data);						
											
            $.ajax({
              url: createURL('listDiskOfferings'),
              data: data,             
              success: function(json) {
                var items = json.listdiskofferingsresponse.diskoffering;
                args.response.success({data:items});
              },
              error: function(data) {
                args.response.error(parseXMLHttpResponse(data));
              }
            });
          },

          actions: {
            add: {
              label: 'label.add.disk.offering',

              messages: {
                confirm: function(args) {
                  return 'message.add.disk.offering';
                },
                notification: function(args) {
                  return 'label.add.disk.offering';
                }
              },

              createForm: {
                title: 'label.add.disk.offering',
                fields: {
                  name: {
                    label: 'label.name',
                    docID: 'helpDiskOfferingName',
                    validation: { required: true }
                  },
                  description: {
                    label: 'label.description',
                    docID: 'helpDiskOfferingDescription',
                    validation: { required: true }
                  },
                  storageType: {
                    label: 'label.storage.type',
                    docID: 'helpDiskOfferingStorageType',
                    select: function(args) {
                      var items = [];
                      items.push({id: 'shared', description: 'shared'});
                      items.push({id: 'local', description: 'local'});
                      args.response.success({data: items});
                    }
                  },
                  isCustomized: {
                    label: 'label.custom.disk.size',
                    docID: 'helpDiskOfferingCustomDiskSize',
                    isBoolean: true,
                    isReverse: true,
                    isChecked: false
                  },
                  disksize: {
                    label: 'label.disk.size.gb',
                    docID: 'helpDiskOfferingDiskSize',
                    dependsOn: 'isCustomized',
                    validation: { required: true, number: true }
                  },
                  tags: {
                    label: 'label.storage.tags',
                    docID: 'helpDiskOfferingStorageTags'
                  },
                  isPublic: {
                    label: 'label.public',
                    isBoolean: true,
                    isReverse: true,
                    isChecked: true,
                    docID: 'helpDiskOfferingPublic'
                  },
                  domainId: {
                    label: 'label.domain',
                    docID: 'helpDiskOfferingDomain',
                    dependsOn: 'isPublic',
                    select: function(args) {										 
                      $.ajax({
                        url: createURL("listDomains&listAll=true"),
                        dataType: "json",
                        async: false,
                        success: function(json) {
                          var items = [];
                          var domainObjs = json.listdomainsresponse.domain;
                          $(domainObjs).each(function(){
                            items.push({id: this.id, description: this.path});
                          });
                          args.response.success({data: items});
                        }
                      });
                    },
                    isHidden: true
                  }
                }
              },

              action: function(args) {
                var data = {
								  isMirrored: false,
									name: args.data.name,
									displaytext: args.data.description,
									storageType: args.data.storageType,
									customized: (args.data.isCustomized=="on")
								};																
               
                if(args.$form.find('.form-item[rel=disksize]').css("display") != "none") {
								  $.extend(data, {
									  disksize: args.data.disksize
									});		
								}

                if(args.data.tags != null && args.data.tags.length > 0) {
								  $.extend(data, {
									  tags: args.data.tags
									});	
								}

                if(args.$form.find('.form-item[rel=domainId]').css("display") != "none") {
								  $.extend(data, {
									  domainid: args.data.domainId
									});		
								}

                $.ajax({
                  url: createURL('createDiskOffering'),
                  data: data,                  
                  success: function(json) {
                    var item = json.creatediskofferingresponse.diskoffering;
                    args.response.success({data: item});
                  },
                  error: function(data) {
                    args.response.error(parseXMLHttpResponse(data));
                  }
                });
              },

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

          detailView: {
            name: 'Disk offering details',
            actions: {
              edit: {
                label: 'label.edit',
                action: function(args) {
                  var data = {
									  id: args.context.diskOfferings[0].id,
										name: args.data.name,
										displaytext: args.data.displaytext
									};									
                  $.ajax({
                    url: createURL('updateDiskOffering'),
                    data: data,
                    success: function(json) {
                      var item = json.updatediskofferingresponse.diskoffering;
                      args.response.success({data: item});
                    },
                    error: function(data) {
                      args.response.error(parseXMLHttpResponse(data));
                    }
                  });
                }
              },

              remove: {
                label: 'label.action.delete.disk.offering',
                messages: {
                  confirm: function(args) {
                    return 'message.action.delete.disk.offering';
                  },
                  notification: function(args) {
                    return 'label.action.delete.disk.offering';
                  }
                },
                action: function(args) {
								  var data = {
									  id: args.context.diskOfferings[0].id
									};								
                  $.ajax({
                    url: createURL('deleteDiskOffering'),
                    data: data,                    
                    success: function(json) {
                      args.response.success();
                    },
                    error: function(data) {
                      args.response.error(parseXMLHttpResponse(data));
                    }
                  });
                },
                notification: {
                  poll: function(args) {
                    args.complete();
                  }
                }
              }
            },

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

                fields: [
                  {
                    name: {
                      label: 'label.name',
                      isEditable: true,
					            validation: { required: true }
                    }
                  },
                  {
                    id: { label: 'label.id' },
                    displaytext: {
                      label: 'label.description',
                      isEditable: true,
					            validation: { required: true }
                    },
                    iscustomized: {
                      label: 'label.custom.disk.size',
                      converter: cloudStack.converters.toBooleanText
                    },
                    disksize: {
                      label: 'label.disk.size.gb',
                      converter: function(args) {
                        if(args != 0)
                          return args;
                        else
                          return "N/A";
                      }
                    },
                    tags: { label: 'label.storage.tags' },
                    domain: { label: 'label.domain' },
                    storagetype: { label: 'label.storage.type' }
                  }
                ],

                dataProvider: function(args) {								 
									var data = {
									  id: args.context.diskOfferings[0].id
									};
									$.ajax({
										url: createURL('listDiskOfferings'),
										data: data,										
										success: function(json) {
											var item = json.listdiskofferingsresponse.diskoffering[0];
											args.response.success({
											  actionFilter: diskOfferingActionfilter,
											  data: item
											});
										}
									});										              
                }
              }
            }
          }
        }
      },      

      networkOfferings: {
        type: 'select',
        title: 'label.menu.network.offerings',
        listView: {
          id: 'networkOfferings',
          label: 'label.menu.network.offerings',
          fields: {
            name: { label: 'label.name' },
            state: {              
              label: 'label.state', 
							indicator: { 
							  'Enabled': 'on', 
								'Disabled': 'off', 
								'Destroyed': 'off' 
							}
            }
          },

          dataProvider: function(args) {					  
						var data = {};
						listViewDataProvider(args, data);		
					
            $.ajax({
              url: createURL('listNetworkOfferings'),
              data: data,
              success: function(json) {
                var items = json.listnetworkofferingsresponse.networkoffering;
																
								$(items).each(function(){
								  if(this.availability == "Required") {
									  requiredNetworkOfferingExists = true;
										return false; //break each loop
									}
								});								
													
                args.response.success({
                  actionFilter: networkOfferingActionfilter,
                  data:items
                });
              },
              error: function(data) {
                args.response.error(parseXMLHttpResponse(data));
              }
            });
          },

          actions: {
            add: {
              label: 'label.add.network.offering',

							createForm: {
                title: 'label.add.network.offering',               														
								preFilter: function(args) {								  									
                  var $availability = args.$form.find('.form-item[rel=availability]');
                  var $serviceOfferingId = args.$form.find('.form-item[rel=serviceOfferingId]');									
									var $conservemode = args.$form.find('.form-item[rel=conservemode]');										
                  var $serviceSourceNatRedundantRouterCapabilityCheckbox = args.$form.find('.form-item[rel="service.SourceNat.redundantRouterCapabilityCheckbox"]');	                  		
                  var hasAdvancedZones = false;

                  // Check whether there are any advanced zones
                  $.ajax({
                    url: createURL('listZones'),
                    data: { listAll: true },
                    async: false,
                    success: function(json) {										  
											var zones = json.listzonesresponse.zone;
                      if (zones != null && zones.length > 0) {
											  for(var i = 0; i < zones.length; i++) {
												  if(zones[i].networktype == "Advanced")
													  hasAdvancedZones = true; 
												}			
                      }
                    }
                  });
												
                  args.$form.bind('change', function() { //when any field in the dialog is changed
									  //check whether to show or hide availability field
                    var $sourceNATField = args.$form.find('input[name=\"service.SourceNat.isEnabled\"]');
                    var $guestTypeField = args.$form.find('select[name=guestIpType]');
                    											
                    if($guestTypeField.val() == 'Shared') { //Shared network offering
                      args.$form.find('.form-item[rel=\"useVpc\"]').hide();
																						
											var $useVpcCb = args.$form.find('.form-item[rel=\"useVpc\"]').find("input[type=checkbox]");
											if($useVpcCb.is(':checked')) { //if useVpc is checked,											  
												$useVpcCb.removeAttr("checked");  //remove "checked" attribute in useVpc
												$useVpcCb.trigger("click");  //trigger useVpc.onChange()
											}
										}
										else { //Isolated network offering 
                      args.$form.find('.form-item[rel=\"useVpc\"]').css('display', 'inline-block');
										}
										
											
                    if (!requiredNetworkOfferingExists &&
                        $sourceNATField.is(':checked') &&
                        $guestTypeField.val() == 'Isolated') {
                      $availability.css('display', 'inline-block');
                    } else {
                      $availability.hide();
                    }

										
										//when service(s) has Virtual Router as provider.....							
                    var havingVirtualRouterForAtLeastOneService = false;									
										$(serviceCheckboxNames).each(function(){										  
											var checkboxName = this;                      								
											if($("input[name='" + checkboxName + "']").is(":checked") == true) {											  
											  var providerFieldName = checkboxName.replace(".isEnabled", ".provider"); //either dropdown or input hidden field
                        var providerName = $("[name='" + providerFieldName + "']").val(); 
												if(providerName == "VirtualRouter") {
												  havingVirtualRouterForAtLeastOneService = true;
													return false; //break each loop
												}
											}																					
										});                    
                    if(havingVirtualRouterForAtLeastOneService == true) {
                      $serviceOfferingId.css('display', 'inline-block');
										}
                    else {
                      $serviceOfferingId.hide();		
										}

										
										/*
										when service(s) has VPC Virtual Router as provider:
                    (1) conserve mode is set to unchecked and grayed out.	
                    (2) redundant router capability checkbox is set to unchecked and grayed out.	
                    (3) remove Firewall service, SecurityGroup service. 									
                    */										
                    var havingVpcVirtualRouterForAtLeastOneService = false;									
										$(serviceCheckboxNames).each(function(){										  
											var checkboxName = this;                      								
											if($("input[name='" + checkboxName + "']").is(":checked") == true) {											  
											  var providerFieldName = checkboxName.replace(".isEnabled", ".provider"); //either dropdown or input hidden field
                        var providerName = $("[name='" + providerFieldName + "']").val(); 
												if(providerName == "VpcVirtualRouter") {
												  havingVpcVirtualRouterForAtLeastOneService = true;
													return false; //break each loop
												}
											}																					
										});   
										if(havingVpcVirtualRouterForAtLeastOneService == true ) {			
										  $conservemode.find("input[type=checkbox]").attr("disabled", "disabled"); 
                      $conservemode.find("input[type=checkbox]").attr('checked', false);	
										
                      $serviceSourceNatRedundantRouterCapabilityCheckbox.find("input[type=checkbox]").attr("disabled", "disabled"); 
                      $serviceSourceNatRedundantRouterCapabilityCheckbox.find("input[type=checkbox]").attr('checked', false);										
										}
                    else {                      
                      $serviceSourceNatRedundantRouterCapabilityCheckbox.find("input[type=checkbox]").removeAttr("disabled"); 
                      $conservemode.find("input[type=checkbox]").removeAttr("disabled");       											
										}		
												
	                  $(':ui-dialog').dialog('option', 'position', 'center');
										
										//CS-16612 show all services regardless of guestIpType(Shared/Isolated)
										/*
										//hide/show service fields ***** (begin) *****					
										var serviceFieldsToHide = [];										
										if($guestTypeField.val() == 'Shared') { //Shared network offering
										  serviceFieldsToHide = [
												'service.SourceNat.isEnabled',													
												'service.PortForwarding.isEnabled',													
												'service.Firewall.isEnabled', 
												'service.Vpn.isEnabled' 
											];	                      
											if(havingVpcVirtualRouterForAtLeastOneService == true) { //add SecurityGroup to to-hide-list
											  serviceFieldsToHide.push('service.SecurityGroup.isEnabled');
											}
											else { //remove SecurityGroup from to-hide-list										 
											  var temp = $.map(serviceFieldsToHide, function(item) {												  
													if (item != 'service.SecurityGroup.isEnabled') {
													  return item;
													}
												});		
												serviceFieldsToHide = temp;
											}		
										}
										else { //Isolated network offering 
										  serviceFieldsToHide = [
											  'service.SecurityGroup.isEnabled'
											];											
											if(havingVpcVirtualRouterForAtLeastOneService == true) { //add firewall to to-hide-list
											  serviceFieldsToHide.push('service.Firewall.isEnabled');
											}
											else { //remove firewall from to-hide-list									 
											  var temp = $.map(serviceFieldsToHide, function(item) {												  
													if (item != 'service.Firewall.isEnabled') {
													  return item;
													}
												});		
												serviceFieldsToHide = temp;
											}
										}
                    */
										
										
										//CS-16687: NetworkACL should be removed when the guest_type is SHARED
										//hide/show service fields ***** (begin) *****	
										var serviceFieldsToHide = [];										
										if($guestTypeField.val() == 'Shared') { //Shared network offering
										  serviceFieldsToHide = [
												'service.NetworkACL.isEnabled'
											];	
										}
										else { //Isolated network offering 
										  serviceFieldsToHide = [];		
										}
										
										//hide service fields that are included in serviceFieldsToHide
										var $serviceCheckboxesToHide = args.$form.find('.form-item').filter(function() {                         											
                      if ($.inArray($(this).attr('rel'), serviceFieldsToHide) > -1) {
                        return true;
                      }                      
                      return false;
                    });				
										$serviceCheckboxesToHide.hide();
										$serviceCheckboxesToHide.find('input[type=checkbox]').attr('checked', false);					

                    var $serviceProviderDropdownsToHide = args.$form.find('.form-item').filter(function() {                        	
                      if ($.inArray($(this).attr('depends-on'), serviceFieldsToHide) > -1) {
                        return true;
                      }
                      return false;
                    });										
										$serviceProviderDropdownsToHide.hide();
																						
										//show service fields that are not included in serviceFieldsToHide                    								
                    for(var i=0; i < serviceFields.length; i++) {										  							
											var serviceField = serviceFields[i];
											if($.inArray(serviceField, serviceFieldsToHide) == -1) {
											  if(args.$form.find('.form-item[rel=\"' + serviceField + '\"]').css('display') == 'none' ) {
											     args.$form.find('.form-item[rel=\"' + serviceField + '\"]').css('display', 'inline-block');				
                        }													
											}											
										}
										//hide/show service fields ***** (end) *****			
												
                    //show LB InlineMode dropdown only when (1)LB service is checked and LB service provider is F5BigIp (2)Firewall service is checked and Firewall service provider is JuniperSRX 						
										if((args.$form.find('.form-item[rel=\"service.Lb.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true) && (args.$form.find('.form-item[rel=\"service.Lb.provider\"]').find('select').val() == 'F5BigIp') && 
										   (args.$form.find('.form-item[rel=\"service.Firewall.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true) && (args.$form.find('.form-item[rel=\"service.Firewall.provider\"]').find('select').val() == 'JuniperSRX'))
										{		
											args.$form.find('.form-item[rel=\"service.Lb.inlineModeDropdown\"]').css('display', 'inline-block');	
										}
										else {										  
											args.$form.find('.form-item[rel=\"service.Lb.inlineModeDropdown\"]').hide();	
										}												
										
										//show LB Isolation dropdown only when (1)LB Service is checked (2)Service Provider is Netscaler OR F5 						
										if((args.$form.find('.form-item[rel=\"service.Lb.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true)
										   &&(args.$form.find('.form-item[rel=\"service.Lb.provider\"]').find('select').val() == 'Netscaler' 
											    || args.$form.find('.form-item[rel=\"service.Lb.provider\"]').find('select').val() == 'F5BigIp')) {										  
											args.$form.find('.form-item[rel=\"service.Lb.lbIsolationDropdown\"]').css('display', 'inline-block');	
										}
										else {										  
											args.$form.find('.form-item[rel=\"service.Lb.lbIsolationDropdown\"]').hide();	
										}
										
										//show Elastic LB checkbox only when (1)LB Service is checked (2)Service Provider is Netscaler (3)Guest IP Type is Shared 
										if((args.$form.find('.form-item[rel=\"service.Lb.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true)
										   &&(args.$form.find('.form-item[rel=\"service.Lb.provider\"]').find('select').val() == 'Netscaler')
											 &&(args.$form.find('.form-item[rel=\"guestIpType\"]').find('select').val() == 'Shared')) {
										  args.$form.find('.form-item[rel=\"service.Lb.elasticLbCheckbox\"]').css('display', 'inline-block');		
										}
										else {
										  args.$form.find('.form-item[rel=\"service.Lb.elasticLbCheckbox\"]').hide();	                        
											args.$form.find('.form-item[rel=\"service.Lb.elasticLbCheckbox\"]').find('input[type=checkbox]').attr('checked', false);	
										}
																				
							      //show Elastic IP checkbox only when (1)StaticNat service is checked (2)StaticNat service provider is Netscaler 								
										if((args.$form.find('.form-item[rel=\"service.StaticNat.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true)
										   &&(args.$form.find('.form-item[rel=\"service.StaticNat.provider\"]').find('select').val() == 'Netscaler')
										) {
										  args.$form.find('.form-item[rel=\"service.StaticNat.elasticIpCheckbox\"]').css('display', 'inline-block');		                      										
										}
										else {		
										  args.$form.find('.form-item[rel=\"service.StaticNat.elasticIpCheckbox\"]').hide();			
                      args.$form.find('.form-item[rel=\"service.StaticNat.elasticIpCheckbox\"]').find('input[type=checkbox]').attr('checked', false);			                      			
										}
														
							      //show Associate Public IP checkbox only when (1)StaticNat Service is checked (2)Service Provider is Netscaler (3)Guest IP Type is Shared (4) Elastic IP checkbox is checked 										
										if((args.$form.find('.form-item[rel=\"service.StaticNat.isEnabled\"]').find('input[type=checkbox]').is(':checked') == true)
										   &&(args.$form.find('.form-item[rel=\"service.StaticNat.provider\"]').find('select').val() == 'Netscaler')
											 &&(args.$form.find('.form-item[rel=\"guestIpType\"]').find('select').val() == 'Shared')
											 &&(args.$form.find('.form-item[rel=\"service.StaticNat.elasticIpCheckbox\"]').find('input[type=checkbox]').attr('checked')	== "checked")) { 										  
                      args.$form.find('.form-item[rel=\"service.StaticNat.associatePublicIP\"]').css('display', 'inline-block');												
										}
										else {												  		
                      args.$form.find('.form-item[rel=\"service.StaticNat.associatePublicIP\"]').hide();		
                      args.$form.find('.form-item[rel=\"service.StaticNat.associatePublicIP\"]').find('input[type=checkbox]').attr('checked',false);									
										}							
                  });
									
									args.$form.change();
								},				
                fields: {
                  name: { label: 'label.name', validation: { required: true }, docID: 'helpNetworkOfferingName' },

                  displayText: { label: 'label.description', validation: { required: true }, docID: 'helpNetworkOfferingDescription' },

                  networkRate: { label: 'label.network.rate.megabytes', docID: 'helpNetworkOfferingNetworkRate' },

									/*
                  trafficType: {
                    label: 'label.traffic.type', validation: { required: true },
                    select: function(args) {
                      args.response.success({
                        data: [
                          { id: 'GUEST', description: 'Guest' }
                        ]
                      });
                    }
                  },
									*/

                  guestIpType: {
                    label: 'label.guest.type',
                    docID: 'helpNetworkOfferingGuestType',
                    select: function(args) {
                      args.response.success({
                        data: [
                          { id: 'Isolated', description: 'Isolated' },
                          { id: 'Shared', description: 'Shared' }
                        ]
                      });
																						
											args.$select.change(function() {											  
												var $form = $(this).closest("form");
                        
										if ($(this).val() == "Shared") {                          
											 $form.find('.form-item[rel=specifyVlan]').find('input[type=checkbox]').attr("disabled", "disabled"); //make it read-only
											 $form.find('.form-item[rel=specifyVlan]').find('input[type=checkbox]').attr('checked', true);	//make it checked
											 $form.find('.form-item[rel=isPersistent]').find('input[type=checkbox]').attr("disabled","disabled");


                                                                                } else {  //$(this).val() == "Isolated" 
											$form.find('.form-item[rel=specifyVlan]').find('input[type=checkbox]').removeAttr("disabled"); //make it editable													
                                                                                         $form.find('.form-item[rel=isPersistent]').find('input[type=checkbox]').removeAttr("disabled");

												}												
											});
                    }
                  },

                 isPersistent:{
                   label:'Persistent ',
                   isBoolean:true,
                   isChecked:false

                 },


                  specifyVlan: { label: 'label.specify.vlan', isBoolean: true, docID: 'helpNetworkOfferingSpecifyVLAN' },

                  useVpc: {
                    label: 'VPC',
                    docID: 'helpNetworkOfferingVPC',
                    isBoolean: true,
                    onChange: function(args) {
                      var $checkbox = args.$checkbox;
                      var $selects = $checkbox.closest('form').find('.dynamic-input select');
                      var $vpcOptions = $selects.find('option[value=VpcVirtualRouter]');
                     
                      if ($checkbox.is(':checked')) {
                        $vpcOptions.siblings().attr('disabled', true);
                        $selects.val('VpcVirtualRouter');
                      } else {
                        $vpcOptions.siblings().attr('disabled', false);
                        $vpcOptions.attr('disabled', true);
                        $selects.each(function() {
                          $(this).val($(this).find('option:first'));
                        });
                      }
                    }
                  },
								
                  supportedServices: {
                    label: 'label.supported.services',

                    dynamic: function(args) {
                      $.ajax({
                        url: createURL('listSupportedNetworkServices'),
                        dataType: 'json',
                        async: true,
                        success: function(data) {
                          networkServiceObjs = data.listsupportednetworkservicesresponse.networkservice;
													serviceFields = []; 
                          var fields = {}, providerCanenableindividualserviceMap = {}, providerServicesMap = {}, providerDropdownsForciblyChangedTogether = {};													
                          $(networkServiceObjs).each(function() {
                            var serviceName = this.name;		
                            var providerObjs = this.provider;
                            var serviceDisplayName;

                            // Sanitize names
                            switch (serviceName) {
                            case 'Vpn': serviceDisplayName = 'VPN'; break;
                            case 'Dhcp': serviceDisplayName = dictionary['label.dhcp']; break;
                            case 'Dns': serviceDisplayName = 'DNS'; break;
                            case 'Lb': serviceDisplayName = 'Load Balancer'; break;
                            case 'SourceNat': serviceDisplayName = 'Source NAT'; break;
                            case 'StaticNat': serviceDisplayName = 'Static NAT'; break;
                            case 'PortForwarding': serviceDisplayName = 'Port Forwarding'; break;
                            case 'SecurityGroup': serviceDisplayName = 'Security Groups'; break;
                            case 'UserData': serviceDisplayName = 'User Data'; break;
                            case 'Connectivity': serviceDisplayName = 'Virtual Networking'; break;
                            default: serviceDisplayName = serviceName; break;
                            }

                            var id = {
                              isEnabled: 'service' + '.' + serviceName + '.' + 'isEnabled',
                              capabilities: 'service' + '.' + serviceName + '.' + 'capabilities',
                              provider: 'service' + '.' + serviceName + '.' + 'provider'
                            };
                            
														serviceCheckboxNames.push(id.isEnabled);														
														
                            fields[id.isEnabled] = { label: serviceDisplayName, isBoolean: true };
														serviceFields.push(id.isEnabled);
																												
														if(providerObjs != null && providerObjs.length > 1) {	//present provider dropdown when there are multiple providers for a service												
															fields[id.provider] = {
																label: serviceDisplayName + ' Provider',
																isHidden: true,
																dependsOn: id.isEnabled,
																select: function(args) {																
																	//Virtual Router needs to be the first choice in provider dropdown (Bug 12509)																	
																	var items = [];
																	$(providerObjs).each(function(){
																	  if(this.name == "VirtualRouter")
																		  items.unshift({id: this.name, description: this.name});
																		else
																		  items.push({id: this.name, description: this.name});
																																				
																		if(!(this.name in providerCanenableindividualserviceMap))
																		  providerCanenableindividualserviceMap[this.name] = this.canenableindividualservice;
																																				
                                    if(!(this.name in providerServicesMap))													
                                      providerServicesMap[this.name] = [serviceName];
                                    else																			
																		  providerServicesMap[this.name].push(serviceName);																		
																	});
																															
																	args.response.success({
																		data: items
																	});

                                  // Disable VPC virtual router by default
                                  args.$select.find('option[value=VpcVirtualRouter]').attr('disabled', true);
																																																	
																	args.$select.change(function() {		
                                    var $thisProviderDropdown = $(this);																	
                                    var providerName = $(this).val();																	
																		var canenableindividualservice = providerCanenableindividualserviceMap[providerName];																	  
																		if(canenableindividualservice == false) { //This provider can NOT enable individual service, therefore, force all services supported by this provider have this provider selected in provider dropdown
																		  var serviceNames = providerServicesMap[providerName];			
																			if(serviceNames != null && serviceNames.length > 1) {			
                                        providerDropdownsForciblyChangedTogether = {};  //reset																			
																				$(serviceNames).each(function(){																			 
																					var providerDropdownId = 'service' + '.' + this + '.' + 'provider';		
                                          providerDropdownsForciblyChangedTogether[providerDropdownId] = 1;																					
																					$("select[name='" + providerDropdownId + "']").val(providerName);																				
																				});	
                                      }
																		}		
                                    else { //canenableindividualservice == true
																		  if($thisProviderDropdown.context.name in providerDropdownsForciblyChangedTogether) { //if this provider dropdown is one of provider dropdowns forcibly changed together earlier, make other forcibly changed provider dropdowns restore default option (i.e. 1st option in dropdown)
																			  for(var key in providerDropdownsForciblyChangedTogether) {																				  
																					if(key == $thisProviderDropdown.context.name)
																					  continue; //skip to next item in for loop
																					else 															
																						$("select[name='" + key + "'] option:first").attr("selected", "selected");																					
																				}																			 																																	
																				providerDropdownsForciblyChangedTogether = {};  //reset			
                                      }																				
																		}																		
																	});		
																}
															};
														}
														else if(providerObjs != null && providerObjs.length == 1){ //present hidden field when there is only one provider for a service		
														  fields[id.provider] = {
															  label: serviceDisplayName + ' Provider',
																isHidden: true,
																defaultValue: providerObjs[0].name
															};
														}														
                          });

                          args.response.success({
                            fields: fields
                          });
                        },
                        error: function(data) {
                          args.response.error(parseXMLHttpResponse(data));
                        }
                      });
                    }
                  },

									//show or hide upon checked services and selected providers above (begin)
                  serviceOfferingId: {
                    label: 'label.system.offering',
                    docID: 'helpNetworkOfferingSystemOffering',
                    select: function(args) {
                      $.ajax({
                        url: createURL('listServiceOfferings&issystem=true&systemvmtype=domainrouter'),
                        dataType: 'json',
                        async: true,
                        success: function(data) {
                          var serviceOfferings = data.listserviceofferingsresponse.serviceoffering;

                          args.response.success({
                            data: $.merge(
                              [{
                                id: null,
                                description: 'None'
                              }],
                              $.map(serviceOfferings, function(elem) {
                                return {
                                  id: elem.id,
                                  description: elem.name
                                };
                              })
                            )
                          });
                        },
                        error: function(data) {
                          args.response.error(parseXMLHttpResponse(data));
                        }
                      });
                    }
                  },
									
                  "service.SourceNat.redundantRouterCapabilityCheckbox" : {
                    label: "label.redundant.router.capability",
                    isHidden: true,
                    dependsOn: 'service.SourceNat.isEnabled',
                    docID: 'helpNetworkOfferingRedundantRouterCapability',
                    isBoolean: true
                  },

                  "service.SourceNat.sourceNatTypeDropdown": {
                    label: 'label.supported.source.NAT.type',
                    isHidden: true,
                    dependsOn: 'service.SourceNat.isEnabled',
                    select: function(args) {
                      args.response.success({
                        data: [                          
                          { id: 'perzone', description: 'Per zone'},
													{ id: 'peraccount', description: 'Per account'}
                        ]
                      });
                    }
                  },
									
									"service.Lb.elasticLbCheckbox" : {
                    label: "label.elastic.LB",
                    isHidden: true,                    
                    isBoolean: true
                  },                  
                  "service.Lb.lbIsolationDropdown": {
                    label: 'label.LB.isolation',
                    docID: 'helpNetworkOfferingLBIsolation',
                    isHidden: true,                   
                    select: function(args) {
                      args.response.success({
                        data: [
                          { id: 'dedicated', description: 'Dedicated' },
                          { id: 'shared', description: 'Shared' }
                        ]
                      })
                    }
                  },	                
									"service.Lb.inlineModeDropdown": {
										label: 'Mode',
                    docID: 'helpNetworkOfferingMode',
										select: function(args) {
											var items = [];
											items.push({id: "false", description: "side by side"});
											items.push({id: "true", description: "inline"});
											args.response.success({data: items});
										}
									},  		
									
									"service.StaticNat.elasticIpCheckbox" : {
										label: "label.elastic.IP",
										isHidden: true,										
										isBoolean: true
									},	

									"service.StaticNat.associatePublicIP": {
                    label: 'Associate Public IP',
                    docID: 'helpNetworkOfferingAssociatePublicIP',
                    isBoolean: true,
                    isHidden: true                  
                  },
                  //show or hide upon checked services and selected providers above (end)
									
									
									conservemode: { label: 'label.conserve.mode', isBoolean: true , docID: 'helpNetworkOfferingConserveMode'},
									
                  tags: { label: 'label.tags', docID: 'helpNetworkOfferingTags' },
									
									availability: {
                    label: 'label.availability',
                    isHidden: true,  
                    select: function(args) {
                      args.response.success({
                        data: [
                          { id: 'Optional', description: 'Optional' },
                          { id: 'Required', description: 'Required' }                          
                        ]
                      });
                    }
                  }
                }
              },
							
              action: function(args) {
                var formData = args.data;
                var inputData = {};
                var serviceProviderMap = {};
                var serviceCapabilityIndex = 0;
								
                $.each(formData, function(key, value) {
                  var serviceData = key.split('.');

                  if (serviceData.length > 1) {
                    if (serviceData[0] == 'service' &&
                        serviceData[2] == 'isEnabled' &&
                        value == 'on') { // Services field

                      serviceProviderMap[serviceData[1]] = formData[
                        'service.' + serviceData[1] + '.provider'
                      ];
                    } 	                   							
										else if((key == 'service.SourceNat.redundantRouterCapabilityCheckbox') && ("SourceNat" in serviceProviderMap)) { //if checkbox is unchecked, it won't be included in formData in the first place. i.e. it won't fall into this section
										  inputData['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'SourceNat';
											inputData['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = "RedundantRouter";
											inputData['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true; //because this checkbox's value == "on"
										  serviceCapabilityIndex++;
										}		
										else if ((key == 'service.SourceNat.sourceNatTypeDropdown') && ("SourceNat" in serviceProviderMap)) {											
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'SourceNat';
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'SupportedSourceNatTypes';
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = value;
										  serviceCapabilityIndex++;
										} 
                    else if ((key == 'service.Lb.elasticLbCheckbox') && ("Lb" in serviceProviderMap)) {	//if checkbox is unchecked, it won't be included in formData in the first place. i.e. it won't fall into this section								
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb';
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'ElasticLb'; 
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true; //because this checkbox's value == "on"
											serviceCapabilityIndex++;
										} 
                    else if ((key == 'service.Lb.inlineModeDropdown') && ("Lb" in serviceProviderMap) && (serviceProviderMap.Lb	== "F5BigIp")) {   
										  if(value == 'true') { //CS-16605 do not pass parameter if value is 'false'(side by side)
												inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb';
												inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'InlineMode';
												inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = value;
												serviceCapabilityIndex++;
											}
										} 										
										else if ((key == 'service.Lb.lbIsolationDropdown') && ("Lb" in serviceProviderMap)) {											
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb';
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'SupportedLbIsolation';
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = value;
											serviceCapabilityIndex++;
										} 
                    else if ((key == 'service.StaticNat.elasticIpCheckbox') && ("StaticNat" in serviceProviderMap)) {	//if checkbox is unchecked, it won't be included in formData in the first place. i.e. it won't fall into this section								
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'StaticNat';
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'ElasticIp'; 
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true; //because this checkbox's value == "on"
											serviceCapabilityIndex++;
										} 	
                    else if ((key == 'service.StaticNat.associatePublicIP') && ("StaticNat" in serviceProviderMap)) {	//if checkbox is unchecked, it won't be included in formData in the first place. i.e. it won't fall into this section								
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'StaticNat';
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'associatePublicIP'; 
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true; //because this checkbox's value == "on"
											serviceCapabilityIndex++;
										} 		
                  } 									
									else if (value != '') { // Normal data
                    inputData[key] = value;
                  }
                });
								
							  for(var key1 in inputData) { 								  
								  /* When capability ElasticIp=true is passed to API, if capability associatePublicIP is not passed to API, cloudStack API will assume associatePublicIP=true. 
									So, UI has to explicitly pass associatePublicIP=false to API if its checkbox is unchecked. */
								  if(inputData[key1] == 'ElasticIp') { //ElasticIp checkbox is checked 									 
										var associatePublicIPExists = false;
									  for(var key2 in inputData) { 										  
										  if(inputData[key2] == 'associatePublicIP') {
											  associatePublicIPExists = true;
											  break; //break key2 for loop
											}
										}											
                    if(associatePublicIPExists == false) { //but associatePublicIP checkbox is unchecked
                      //UI explicitly passes associatePublicIP=false to API 
										  inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'StaticNat';
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'associatePublicIP'; 
											inputData['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = false; //associatePublicIP checkbox is unchecked 		
                    }										
									  break; //break key1 for loop
									}
								}
																
                // Make supported services list
                inputData['supportedServices'] = $.map(serviceProviderMap, function(value, key) {
                  return key;
                }).join(',');

								
								if(inputData['guestIpType'] == "Shared"){ //specifyVlan checkbox is disabled, so inputData won't include specifyVlan
								  inputData['specifyVlan'] = true;  //hardcode inputData['specifyVlan']
									inputData['specifyIpRanges'] = true;
                                                                        inputData['isPersistent'] = false;
								}
								else if (inputData['guestIpType'] == "Isolated") { //specifyVlan checkbox is shown
									if (inputData['specifyVlan'] == 'on') { //specifyVlan checkbox is checked
										inputData['specifyVlan'] = true;	
                                                                                inputData['specifyIpRanges'] = true;							

                    

			
									}
									else { //specifyVlan checkbox is unchecked
										inputData['specifyVlan'] = false;
										inputData['specifyIpRanges'] = false;
									}	
                                                                        
                                                                        if(inputData['isPersistent'] == 'on') {  //It is a persistent network
                                                                               inputData['isPersistent'] = true;
                                                                        }
                                                                        else {    //Isolated Network with Non-persistent network
                                                                               inputData['isPersistent'] = false;
                                                                                              }
				
								}			
								
																
								if (inputData['conservemode'] == 'on') {
                  inputData['conservemode'] = true;
                } else {
                  inputData['conservemode'] = false;
                }
               
								
                // Make service provider map
                var serviceProviderIndex = 0;
                $.each(serviceProviderMap, function(key, value) {
                  inputData['serviceProviderList[' + serviceProviderIndex + '].service'] = key;
                  inputData['serviceProviderList[' + serviceProviderIndex + '].provider'] = value;
                  serviceProviderIndex++;
                });      
												
								if(args.$form.find('.form-item[rel=availability]').css("display") == "none")
                  inputData['availability'] = 'Optional';
								
                if(args.$form.find('.form-item[rel=serviceOfferingId]').css("display") == "none")									
									delete inputData.serviceOfferingId;
								
                inputData['traffictype'] = 'GUEST'; //traffic type dropdown has been removed since it has only one option ('Guest'). Hardcode traffic type value here.
								
                $.ajax({
                  url: createURL('createNetworkOffering'),
                  data: inputData,
                  dataType: 'json',
                  async: true,
                  success: function(data) {
									  var item = data.createnetworkofferingresponse.networkoffering;
								
										if(inputData['availability'] == "Required")
										  requiredNetworkOfferingExists = true;
																			
                    args.response.success({
                      data: item,
                      actionFilter: networkOfferingActionfilter
                    });
                  },

                  error: function(data) {
                    args.response.error(parseXMLHttpResponse(data));
                  }
                });
              },							             
							
              notification: {
                poll: function(args) {
                  args.complete({
                    actionFilter: networkOfferingActionfilter
                  });
                }
              },
							
              messages: {
                notification: function(args) {
                  return 'Added network offering';
                }
              }
            }
          },

          reorder: cloudStack.api.actions.sort('updateNetworkOffering', 'networkOfferings'),

          detailView: {
            name: 'Network offering details',
            actions: {						
							edit: {
                label: 'label.edit',
                action: function(args) {
                  var data = {
									  id: args.context.networkOfferings[0].id,
										name: args.data.name,
										displaytext: args.data.displaytext,
										availability: args.data.availability
									};
                					
                  $.ajax({
                    url: createURL('updateNetworkOffering'),
                    data: data,
                    success: function(json) {										 									
											//if availability is being updated from Required to Optional
										  if(args.context.networkOfferings[0].availability == "Required" && args.data.availability == "Optional") 
										    requiredNetworkOfferingExists = false;											
											//if availability is being updated from Optional to Required
										  if(args.context.networkOfferings[0].availability == "Optional" && args.data.availability == "Required") 
										    requiredNetworkOfferingExists = true;
																							
                      var item = json.updatenetworkofferingresponse.networkoffering;											
                      args.response.success({data: item});
                    },
                    error: function(data) {
                      args.response.error(parseXMLHttpResponse(data));
                    }
                  });
                }
              },
												
              enable: {
                label: 'Enable network offering',
                messages: {
                  confirm: function(args) {
                    return 'Are you sure you want to enable this network offering?';
                  },
                  notification: function(args) {
                    return 'Enabling network offering';
                  }
                },
                action: function(args) {
                  $.ajax({
                    url: createURL("updateNetworkOffering&id=" + args.context.networkOfferings[0].id + "&state=Enabled"),
                    dataType: "json",
                    async: true,
                    success: function(json) {
                      var item = json.updatenetworkofferingresponse.networkoffering;
                      args.response.success();
                    },
                    error: function(data) {
                      args.response.error(parseXMLHttpResponse(data));
                    }
                  });
                },
                notification: {
                  poll: function(args) {
                    args.complete({
                      data: { state: 'Enabled' }
                    });
                  }
                }
              },

              disable: {
                label: 'Disable network offering',
                messages: {
                  confirm: function(args) {
                    return 'Are you sure you want to disable this network offering?';
                  },
                  notification: function(args) {
                    return 'Disabling network offering';
                  }
                },
                action: function(args) {
                  $.ajax({
                    url: createURL("updateNetworkOffering&id=" + args.context.networkOfferings[0].id + "&state=Disabled"),
                    dataType: "json",
                    async: true,
                    success: function(json) {
                      var item = json.updatenetworkofferingresponse.networkoffering;
                      args.response.success();
                    },
                    error: function(data) {
                      args.response.error(parseXMLHttpResponse(data));
                    }
                  });
                },
                notification: {
                  poll: function(args) {
                    args.complete({ data: { state: 'Disabled' }});
                  }
                }
              },

              remove: {
                label: 'Remove network offering',
                action: function(args) {
                  $.ajax({
                    url: createURL('deleteNetworkOffering'),
                    data: {
                      id: args.context.networkOfferings[0].id
                    },
                    success: function(json) {			
											if(args.context.networkOfferings[0].availability == "Required") 
												requiredNetworkOfferingExists = false; //since only one or zero Required network offering can exist
																				
                      args.response.success();
                    },
                    error: function(data) {
                      args.response.error(parseXMLHttpResponse(data));
                    }
                  });
                },
                messages: {
                  confirm: function() { return 'Are you sure you want to remove this network offering?'; },
                  notification: function() { return 'Remove network offering'; }
                },
                notification: {
                  poll: function(args) {
                    args.complete({
                      data: {
                        state: 'Destroyed'
                      },
                      actionFilter: networkOfferingActionfilter
                    });
                  }
                }
              }
            },
            tabs: {
              details: {
                title: 'label.details',

                fields: [
                  {
                    name: {
                      label: 'label.name',
                      isEditable: true,
					            validation: { required: true }
                    }
                  },
                  {
                    id: { label: 'label.id' },
                    displaytext: {
                      label: 'label.description',
                      isEditable: true,
					            validation: { required: true }
                    },
                    state: { label: 'label.state' },
                    guestiptype: {
                      label: 'label.guest.type'
                    },

                    ispersistent:{
                      label:'Persistent ',
                      converter:cloudStack.converters.toBooleanText
                     },

                    availability: {
                      label: 'label.availability',
                      isEditable: true,
                      select: function(args) {
                        var items = [];
                        items.push({id: 'Required', description: 'Required'});
                        items.push({id: 'Optional', description: 'Optional'});
                        //items.push({id: 'Unavailable', description: 'Unavailable'});
                        args.response.success({data: items});
                      }
                    },
                    isdefault: { //created by system by default
                      label: 'label.created.by.system',
                      converter: cloudStack.converters.toBooleanText
                    },
                    specifyvlan: {
                      label: 'label.specify.vlan',
                      converter: cloudStack.converters.toBooleanText
                    },
										specifyipranges: { 
										  label: 'label.specify.IP.ranges', 
											converter: cloudStack.converters.toBooleanText
										},
										conservemode: {
                      label: 'label.conserve.mode',
                      converter: cloudStack.converters.toBooleanText
                    },
                    networkrate: {
                      label: 'label.network.rate',
                      converter: function(args) {
                        var networkRate = args;
                        if (args == null || args == -1) {
                          return "Unlimited";
                        }
                        else {
                          return _s(args) + " Mb/s";

                        }
                      }
                    },
                    traffictype: {
                      label: 'label.traffic.type'
                    },
                    supportedServices: {
                      label: 'label.supported.services'
                    },
                    serviceCapabilities: {
                      label: 'label.service.capabilities'
                    },
										tags: { label: 'label.tags' }
                  }
                ],

                dataProvider: function(args) {								
									$.ajax({
										url: createURL('listNetworkOfferings&id=' + args.context.networkOfferings[0].id),										
										dataType: "json",
										async: true,
										success: function(json) {
											var item = json.listnetworkofferingsresponse.networkoffering[0]; 			
											args.response.success({
												actionFilter: networkOfferingActionfilter,												
												data: $.extend(item, {
													supportedServices: $.map(item.service, function(service) {
														return service.name;
													}).join(', '),

													serviceCapabilities: $.map(item.service, function(service) {
														return service.provider ? $.map(service.provider, function(capability) {
															return service.name + ': ' + capability.name;
														}).join(', ') : null;
													}).join(', ')
												})												
											});
										}
									});											
                }
              }
            }
          }
        }
      }
    }
  };

  var serviceOfferingActionfilter = function(args) {
    var jsonObj = args.context.item;
    var allowedActions = [];
    allowedActions.push("edit");
    allowedActions.push("remove");
    return allowedActions;
  };

  var systemServiceOfferingActionfilter = function(args) {
    var jsonObj = args.context.item;
    var allowedActions = [];
    allowedActions.push("edit");
    allowedActions.push("remove");
    return allowedActions;
  };

  var diskOfferingActionfilter = function(args) {
    var jsonObj = args.context.item;
    var allowedActions = [];
    allowedActions.push("edit");
    allowedActions.push("remove");
    return allowedActions;
  };

  var networkOfferingActionfilter = function(args) {
    var jsonObj = args.context.item;

    if (jsonObj.state == 'Destroyed') 
      return [];
    
    var allowedActions = [];
    allowedActions.push("edit");	

    if(jsonObj.state == "Enabled")
			allowedActions.push("disable");
		else if(jsonObj.state == "Disabled")
			allowedActions.push("enable");
		
		if(jsonObj.isdefault == false) 
			allowedActions.push("remove");		
			
    return allowedActions;		
  };
	
})(cloudStack, jQuery);

