').addClass('title')
                                                            .append($('
').html(gpugroupObj.gpugroupname)));
                                        //vgpu details
                                        var $groupdetails = $('').listView({
                                            context: args.context,
                                            listView: {
                                                id: 'gputypes',
                                                hideToolbar: true,
                                                fields: {
                                                    vgputype: {
                                                        label: 'label.vgpu.type'
                                                    },
                                                    maxvgpuperpgpu: {
                                                        label: 'label.vgpu.max.vgpu.per.gpu',
                                                        converter: function (args) {
                                                            return (args == null || args == 0) ? "" : args;
                                                        }
                                                    },
                                                    videoram: {
                                                        label: 'label.vgpu.video.ram',
                                                        converter: function (args) {
                                                            return (args == null || args == 0) ? "" : cloudStack.converters.convertBytes(args);
                                                        }
                                                    },
                                                    maxresolution: {
                                                        label: 'label.vgpu.max.resolution'
                                                    },
                                                    remainingcapacity: {
                                                        label: 'label.vgpu.remaining.capacity'
                                                    }
                                                },
                                                dataProvider: function (args) {
                                                    var items;
                                                    if(typeof(gpugroupObj.vgpu) != "undefined") {
                                                        items = gpugroupObj.vgpu.sort(function(a, b) {
                                                            return a.maxvgpuperpgpu >= b.maxvgpuperpgpu;
                                                        });
                                                    }
                                                    else {
                                                        items = gpugroupObj.vgpu;
                                                    }
                                                    $(items).each(function () {
                                                        this.maxresolution = (this.maxresolutionx == null || this.maxresolutionx == 0
                                                                || this.maxresolutiony == null || this.maxresolutiony == 0)
                                                                ? "" : this.maxresolutionx + " x " + this.maxresolutiony;
                                                    });
                                                    args.response.success({
                                                        data: items
                                                    });
                                                }
                                            }
                                        });
                                        $groupcontainer.append($groupdetails);
                                        $tabcontent.append($groupcontainer);
                                    });
                                    return $tabcontent;
                                }
                            }
                        }
                    }
                }
            },
            'primary-storage': {
                title: 'label.primary.storage',
                id: 'primarystorages',
                listView: {
                    id: 'primarystorages',
                    section: 'primary-storage',
                    fields: {
                        name: {
                            label: 'label.name',
                            truncate: true
                        },
                        ipaddress: {
                            label: 'label.server'
                        },
                        path: {
                            label: 'label.path',
                            truncate: true
                        },
                        type: {
                            label: 'label.type'
                        },
                        scope: {
                            label: 'label.scope'
                        },
                        clustername: {
                            label: 'label.cluster',
                            truncate: true
                        },
                        zonename: {
                            label: 'label.zone'
                        },
                        state: {
                            label: 'label.state',
                            converter: function (str) {
                                // For localization
                                return str;
                            },
                            indicator: {
                                'Up': 'on',
                                'Down': 'off',
                                'Removed': 'off',
                                'ErrorInMaintenance': 'off',
                                'PrepareForMaintenance': 'warning',
                                'CancelMaintenance': 'warning',
                                'Maintenance': 'warning',
                            }
                        }
                    },
                    dataProvider: function (args) {
                        var array1 =[];
                        if (args.filterBy != null) {
                            if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
                                switch (args.filterBy.search.by) {
                                    case "name":
                                    if (args.filterBy.search.value.length > 0)
                                    array1.push("&keyword=" + args.filterBy.search.value);
                                    break;
                                }
                            }
                        }
                        array1.push("&zoneid=" + args.context.zones[0].id);
                        if ("pods" in args.context)
                        array1.push("&podid=" + args.context.pods[0].id);
                        if ("clusters" in args.context)
                        array1.push("&clusterid=" + args.context.clusters[0].id);
                        $.ajax({
                            url: createURL("listStoragePools&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                            dataType: "json",
                            async: true,
                            success: function (json) {
                                var items = json.liststoragepoolsresponse.storagepool;
                                args.response.success({
                                    actionFilter: primarystorageActionfilter,
                                    data: items
                                });
                            }
                        });
                    },
                    actions: {
                        add: {
                            label: 'label.add.primary.storage',
                            createForm: {
                                title: 'label.add.primary.storage',
                                fields: {
                                    scope: {
                                        label: 'label.scope',
                                        select: function (args) {
                                            var scope =[ {
                                                id: 'cluster',
                                                description: _l('label.cluster')
                                            },
                                            {
                                                id: 'zone',
                                                description: _l('label.zone.wide')
                                            }
                                            // { id: 'host', description: _l('label.host') }
                                            ];
                                            args.response.success({
                                                data: scope
                                            });
                                            args.$select.change(function () {
                                                var $form = $(this).closest('form');
                                                var scope = $(this).val();
                                                if (scope == 'zone') {
                                                    $form.find('.form-item[rel=podId]').hide();
                                                    $form.find('.form-item[rel=clusterId]').hide();
                                                    $form.find('.form-item[rel=hostId]').hide();
                                                    $form.find('.form-item[rel=hypervisor]').css('display', 'inline-block');
                                                } else if (scope == 'cluster') {
                                                    $form.find('.form-item[rel=hostId]').hide();
                                                    $form.find('.form-item[rel=podId]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=clusterId]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=hypervisor]').hide();
                                                } else if (scope == 'host') {
                                                    $form.find('.form-item[rel=podId]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=clusterId]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=hostId]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=hypervisor]').hide();
                                                }
                                            })
                                        }
                                    },
                                    hypervisor: {
                                        label: 'label.hypervisor',
                                        isHidden: true,
                                        select: function (args) {
                                            var items =[];
                                            items.push({
                                                id: 'KVM',
                                                description: _l('KVM')
                                            });
                                            items.push({
                                                id: 'VMware',
                                                description: _l('VMware')
                                            });
                                            items.push({
                                                id: 'Hyperv',
                                                description: _l('Hyperv')
                                            });
                                            items.push({
                                                id: 'Any',
                                                description: _l('Any')
                                            });
                                            args.response.success({
                                                data: items
                                            });
                                        }
                                    },
                                    zoneid: {
                                        label: 'label.zone',
                                        docID: 'helpPrimaryStorageZone',
                                        validation: {
                                            required: true
                                        },
                                        select: function (args) {
                                            var data = args.context.zones ? {
                                                id: args.context.zones[0].id
                                            }: {};
                                            $.ajax({
                                                url: createURL('listZones'),
                                                data: data,
                                                success: function (json) {
                                                    var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone:[];
                                                    args.response.success({
                                                        data: $.map(zones, function (zone) {
                                                            return {
                                                                id: zone.id,
                                                                description: zone.name
                                                            };
                                                        })
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    podId: {
                                        label: 'label.pod',
                                        dependsOn: 'zoneid',
                                        docID: 'helpPrimaryStoragePod',
                                        validation: {
                                            required: true
                                        },
                                        select: function (args) {
                                            $.ajax({
                                                url: createURL("listPods&zoneid=" + args.zoneid),
                                                dataType: "json",
                                                async: true,
                                                success: function (json) {
                                                    var pods = json.listpodsresponse.pod;
                                                    var items =[];
                                                    $(pods).each(function () {
                                                        items.push({
                                                            id: this.id,
                                                            description: this.name
                                                        });
                                                    });
                                                    args.response.success({
                                                        data: items
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    clusterId: {
                                        label: 'label.cluster',
                                        docID: 'helpPrimaryStorageCluster',
                                        validation: {
                                            required: true
                                        },
                                        dependsOn: 'podId',
                                        select: function (args) {
                                            $.ajax({
                                                url: createURL("listClusters&podid=" + args.podId),
                                                dataType: "json",
                                                async: false,
                                                success: function (json) {
                                                    clusterObjs = json.listclustersresponse.cluster;
                                                    var items =[];
                                                    $(clusterObjs).each(function () {
                                                        items.push({
                                                            id: this.id,
                                                            description: this.name
                                                        });
                                                    });
                                                    args.response.success({
                                                        actionFilter: clusterActionfilter,
                                                        data: items
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    hostId: {
                                        label: 'label.host',
                                        validation: {
                                            required: true
                                        },
                                        dependsOn: 'clusterId',
                                        select: function (args) {
                                            $.ajax({
                                                url: createURL('listHosts'),
                                                data: {
                                                    clusterid: args.clusterId
                                                },
                                                success: function (json) {
                                                    var hosts = json.listhostsresponse.host ?
                                                    json.listhostsresponse.host:[]
                                                    args.response.success({
                                                        data: $.map(hosts, function (host) {
                                                            return {
                                                                id: host.id,
                                                                description: host.name
                                                            }
                                                        })
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    name: {
                                        label: 'label.name',
                                        docID: 'helpPrimaryStorageName',
                                        validation: {
                                            required: true
                                        }
                                    },
                                    protocol: {
                                        label: 'label.protocol',
                                        docID: 'helpPrimaryStorageProtocol',
                                        validation: {
                                            required: true
                                        },
                                        dependsOn: 'clusterId',
                                        select: function (args) {
                                            var clusterId = args.clusterId;
                                            if (clusterId == null || clusterId.length == 0) {
                                                args.response.success({
                                                    data: []
                                                });
                                            return;
                                            }
                                            $(clusterObjs).each(function () {
                                                if (this.id == clusterId) {
                                                    selectedClusterObj = this;
                                                    return false; //break the $.each() loop
                                                }
                                            });
                                            if (selectedClusterObj.hypervisortype == "KVM") {
                                                var items =[];
                                                items.push({
                                                    id: "nfs",
                                                    description: "nfs"
                                                });
                                                items.push({
                                                    id: "SharedMountPoint",
                                                    description: "SharedMountPoint"
                                                });
                                                items.push({
                                                    id: "rbd",
                                                    description: "RBD"
                                                });
                                                items.push({
                                                    id: "clvm",
                                                    description: "CLVM"
                                                });
                                                items.push({
                                                    id: "gluster",
                                                    description: "Gluster"
                                                });
                                                items.push({
                                                    id: "custom",
                                                    description: "custom"
                                                });
                                                args.response.success({
                                                    data: items
                                                });
                                            } else if (selectedClusterObj.hypervisortype == "XenServer") {
                                                var items =[];
                                                items.push({
                                                    id: "nfs",
                                                    description: "nfs"
                                                });
                                                items.push({
                                                    id: "PreSetup",
                                                    description: "PreSetup"
                                                });
                                                items.push({
                                                    id: "iscsi",
                                                    description: "iscsi"
                                                });
                                                items.push({
                                                    id: "custom",
                                                    description: "custom"
                                                });
                                                args.response.success({
                                                    data: items
                                                });
                                            } else if (selectedClusterObj.hypervisortype == "VMware") {
                                                var items =[];
                                                items.push({
                                                    id: "nfs",
                                                    description: "nfs"
                                                });
                                                items.push({
                                                    id: "vmfs",
                                                    description: "vmfs"
                                                });
                                                items.push({
                                                    id: "custom",
                                                    description: "custom"
                                                });
                                                args.response.success({
                                                    data: items
                                                });
                                            } else if (selectedClusterObj.hypervisortype == "Hyperv") {
                                                var items =[];
                                                items.push({
                                                    id: "SMB",
                                                    description: "SMB/CIFS"
                                                });
                                                args.response.success({
                                                    data: items
                                                });
                                            } else if (selectedClusterObj.hypervisortype == "Ovm") {
                                                var items =[];
                                                items.push({
                                                    id: "nfs",
                                                    description: "nfs"
                                                });
                                                items.push({
                                                    id: "ocfs2",
                                                    description: "ocfs2"
                                                });
                                                args.response.success({
                                                    data: items
                                                });
                                            } else if (selectedClusterObj.hypervisortype == "LXC") {
                                                var items =[];
                                                items.push({
                                                    id: "nfs",
                                                    description: "nfs"
                                                });
                                                items.push({
                                                    id: "SharedMountPoint",
                                                    description: "SharedMountPoint"
                                                });
                                                items.push({
                                                    id: "rbd",
                                                    description: "RBD"
                                                });
                                                args.response.success({
                                                    data: items
                                                });
                                            // 3.3.2 has ceph/ocfs2/iscsi etc
                                            } else if (selectedClusterObj.hypervisortype == "Ovm3") {
                                                var items =[];
                                                items.push({
                                                    id: "nfs",
                                                    description: "nfs"
                                                });
                                            } else {
                                                args.response.success({
                                                    data:[]
                                                });
                                            }
                                            args.$select.change(function () {
                                                var $form = $(this).closest('form');
                                                var protocol = $(this).val();
                                                if (protocol == null)
                                                return;
                                                if (protocol == "nfs") {
                                                    $form.find('.form-item[rel=server]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("");
                                                    $form.find('.form-item[rel=path]').css('display', 'inline-block');
                                                    var $required = $form.find('.form-item[rel=path]').find(".name").find("label span");
                                                    $form.find('.form-item[rel=path]').find(".name").find("label").text("Path:").prepend($required);
                                                    $form.find('.form-item[rel=smbUsername]').hide();
                                                    $form.find('.form-item[rel=smbPassword]').hide();
                                                    $form.find('.form-item[rel=smbDomain]').hide();
                                                    $form.find('.form-item[rel=iqn]').hide();
                                                    $form.find('.form-item[rel=lun]').hide();
                                                    $form.find('.form-item[rel=volumegroup]').hide();
                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
                                                    $form.find('.form-item[rel=rbdpool]').hide();
                                                    $form.find('.form-item[rel=rbdid]').hide();
                                                    $form.find('.form-item[rel=rbdsecret]').hide();
                                                    $form.find('.form-item[rel=glustervolume]').hide();
                                                } else if (protocol == "SMB") {
                                                    //"SMB" show almost the same fields as "nfs" does, except 3 more SMB-specific fields.
                                                    $form.find('.form-item[rel=server]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("");
                                                    $form.find('.form-item[rel=path]').css('display', 'inline-block');
                                                    var $required = $form.find('.form-item[rel=path]').find(".name").find("label span");
                                                    $form.find('.form-item[rel=path]').find(".name").find("label").text("Path:").prepend($required);
                                                    $form.find('.form-item[rel=smbUsername]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=smbPassword]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=smbDomain]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=iqn]').hide();
                                                    $form.find('.form-item[rel=lun]').hide();
                                                    $form.find('.form-item[rel=volumegroup]').hide();
                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
                                                    $form.find('.form-item[rel=rbdpool]').hide();
                                                    $form.find('.form-item[rel=rbdid]').hide();
                                                    $form.find('.form-item[rel=rbdsecret]').hide();
                                                    $form.find('.form-item[rel=glustervolume]').hide();
                                                } else if (protocol == "ocfs2") {
                                                    //ocfs2 is the same as nfs, except no server field.
                                                    $form.find('.form-item[rel=server]').hide();
                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("");
                                                    $form.find('.form-item[rel=path]').css('display', 'inline-block');
                                                    var $required = $form.find('.form-item[rel=path]').find(".name").find("label span");
                                                    $form.find('.form-item[rel=path]').find(".name").find("label").text("Path:").prepend($required);
                                                    $form.find('.form-item[rel=smbUsername]').hide();
                                                    $form.find('.form-item[rel=smbPassword]').hide();
                                                    $form.find('.form-item[rel=smbDomain]').hide();
                                                    $form.find('.form-item[rel=iqn]').hide();
                                                    $form.find('.form-item[rel=lun]').hide();
                                                    $form.find('.form-item[rel=volumegroup]').hide();
                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
                                                    $form.find('.form-item[rel=rbdpool]').hide();
                                                    $form.find('.form-item[rel=rbdid]').hide();
                                                    $form.find('.form-item[rel=rbdsecret]').hide();
                                                    $form.find('.form-item[rel=glustervolume]').hide();
                                                } else if (protocol == "PreSetup") {
                                                    $form.find('.form-item[rel=server]').hide();
                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("localhost");
                                                    $form.find('.form-item[rel=path]').css('display', 'inline-block');
                                                    var $required = $form.find('.form-item[rel=path]').find(".name").find("label span");
                                                    $form.find('.form-item[rel=path]').find(".name").find("label").text("SR Name-Label:").prepend($required);
                                                    $form.find('.form-item[rel=smbUsername]').hide();
                                                    $form.find('.form-item[rel=smbPassword]').hide();
                                                    $form.find('.form-item[rel=smbDomain]').hide();
                                                    $form.find('.form-item[rel=iqn]').hide();
                                                    $form.find('.form-item[rel=lun]').hide();
                                                    $form.find('.form-item[rel=volumegroup]').hide();
                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
                                                    $form.find('.form-item[rel=rbdpool]').hide();
                                                    $form.find('.form-item[rel=rbdid]').hide();
                                                    $form.find('.form-item[rel=rbdsecret]').hide();
                                                    $form.find('.form-item[rel=glustervolume]').hide();
                                                } else if (protocol == "custom") {
                                                    $form.find('.form-item[rel=server]').hide();
                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("localhost");
                                                    $form.find('.form-item[rel=path]').hide();
                                                    $form.find('.form-item[rel=smbUsername]').hide();
                                                    $form.find('.form-item[rel=smbPassword]').hide();
                                                    $form.find('.form-item[rel=smbDomain]').hide();
                                                    $form.find('.form-item[rel=iqn]').hide();
                                                    $form.find('.form-item[rel=lun]').hide();
                                                    $form.find('.form-item[rel=volumegroup]').hide();
                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
                                                    $form.find('.form-item[rel=rbdpool]').hide();
                                                    $form.find('.form-item[rel=rbdid]').hide();
                                                    $form.find('.form-item[rel=rbdsecret]').hide();
                                                    $form.find('.form-item[rel=glustervolume]').hide();
                                                } else if (protocol == "iscsi") {
                                                    $form.find('.form-item[rel=server]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("");
                                                    $form.find('.form-item[rel=path]').hide();
                                                    $form.find('.form-item[rel=smbUsername]').hide();
                                                    $form.find('.form-item[rel=smbPassword]').hide();
                                                    $form.find('.form-item[rel=smbDomain]').hide();
                                                    $form.find('.form-item[rel=iqn]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=lun]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=volumegroup]').hide();
                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
                                                    $form.find('.form-item[rel=rbdpool]').hide();
                                                    $form.find('.form-item[rel=rbdid]').hide();
                                                    $form.find('.form-item[rel=rbdsecret]').hide();
                                                    $form.find('.form-item[rel=glustervolume]').hide();
                                                } else if ($(this).val() == "clvm") {
                                                    $form.find('.form-item[rel=server]').hide();
                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("localhost");
                                                    $form.find('.form-item[rel=path]').hide();
                                                    $form.find('.form-item[rel=smbUsername]').hide();
                                                    $form.find('.form-item[rel=smbPassword]').hide();
                                                    $form.find('.form-item[rel=smbDomain]').hide();
                                                    $form.find('.form-item[rel=iqn]').hide();
                                                    $form.find('.form-item[rel=lun]').hide();
                                                    $form.find('.form-item[rel=volumegroup]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
                                                    $form.find('.form-item[rel=rbdpool]').hide();
                                                    $form.find('.form-item[rel=rbdid]').hide();
                                                    $form.find('.form-item[rel=rbdsecret]').hide();
                                                    $form.find('.form-item[rel=glustervolume]').hide();
                                                } else if (protocol == "vmfs") {
                                                    $form.find('.form-item[rel=server]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("");
                                                    $form.find('.form-item[rel=path]').hide();
                                                    $form.find('.form-item[rel=smbUsername]').hide();
                                                    $form.find('.form-item[rel=smbPassword]').hide();
                                                    $form.find('.form-item[rel=smbDomain]').hide();
                                                    $form.find('.form-item[rel=iqn]').hide();
                                                    $form.find('.form-item[rel=lun]').hide();
                                                    $form.find('.form-item[rel=volumegroup]').hide();
                                                    $form.find('.form-item[rel=vCenterDataCenter]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=vCenterDataStore]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
                                                    $form.find('.form-item[rel=rbdpool]').hide();
                                                    $form.find('.form-item[rel=rbdid]').hide();
                                                    $form.find('.form-item[rel=rbdsecret]').hide();
                                                    $form.find('.form-item[rel=glustervolume]').hide();
                                                } else if (protocol == "SharedMountPoint") {
                                                    //"SharedMountPoint" show the same fields as "nfs" does.
                                                    $form.find('.form-item[rel=server]').hide();
                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("localhost");
                                                    $form.find('.form-item[rel=path]').css('display', 'inline-block');
                                                    var $required = $form.find('.form-item[rel=path]').find(".name").find("label span");
                                                    $form.find('.form-item[rel=path]').find(".name").find("label").text("Path:").prepend($required);
                                                    $form.find('.form-item[rel=smbUsername]').hide();
                                                    $form.find('.form-item[rel=smbPassword]').hide();
                                                    $form.find('.form-item[rel=smbDomain]').hide();
                                                    $form.find('.form-item[rel=iqn]').hide();
                                                    $form.find('.form-item[rel=lun]').hide();
                                                    $form.find('.form-item[rel=volumegroup]').hide();
                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
                                                    $form.find('.form-item[rel=rbdpool]').hide();
                                                    $form.find('.form-item[rel=rbdid]').hide();
                                                    $form.find('.form-item[rel=rbdsecret]').hide();
                                                    $form.find('.form-item[rel=glustervolume]').hide();
                                                } else if (protocol == "rbd") {
                                                    $form.find('.form-item[rel=rbdmonitor]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=rbdmonitor]').find(".name").find("label").text("RADOS Monitor:");
                                                    $form.find('.form-item[rel=rbdpool]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=rbdpool]').find(".name").find("label").text("RADOS Pool:");
                                                    $form.find('.form-item[rel=rbdid]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=rbdid]').find(".name").find("label").text("RADOS User:");
                                                    $form.find('.form-item[rel=rbdsecret]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=rbdsecret]').find(".name").find("label").text("RADOS Secret:");
                                                    $form.find('.form-item[rel=server]').hide();
                                                    $form.find('.form-item[rel=iqn]').hide();
                                                    $form.find('.form-item[rel=lun]').hide();
                                                    $form.find('.form-item[rel=volumegroup]').hide();
                                                    $form.find('.form-item[rel=path]').hide();
                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
                                                    $form.find('.form-item[rel=smbUsername]').hide();
                                                    $form.find('.form-item[rel=smbPassword]').hide();
                                                    $form.find('.form-item[rel=smbDomain]').hide();
                                                    $form.find('.form-item[rel=glustervolume]').hide();
                                                } else if (protocol == "gluster") {
                                                    $form.find('.form-item[rel=server]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=server]').find(".value").find("input");
                                                    $form.find('.form-item[rel=glustervolume]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=glustervolume]').find(".name").find("label").text("Volume:");
                                                    $form.find('.form-item[rel=path]').hide();
                                                    $form.find('.form-item[rel=smbUsername]').hide();
                                                    $form.find('.form-item[rel=smbPassword]').hide();
                                                    $form.find('.form-item[rel=smbDomain]').hide();
                                                    $form.find('.form-item[rel=iqn]').hide();
                                                    $form.find('.form-item[rel=lun]').hide();
                                                    $form.find('.form-item[rel=volumegroup]').hide();
                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
                                                    $form.find('.form-item[rel=rbdpool]').hide();
                                                    $form.find('.form-item[rel=rbdid]').hide();
                                                    $form.find('.form-item[rel=rbdsecret]').hide();
                                                } else {
                                                    $form.find('.form-item[rel=server]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=server]').find(".value").find("input").val("");
                                                    $form.find('.form-item[rel=iqn]').hide();
                                                    $form.find('.form-item[rel=lun]').hide();
                                                    $form.find('.form-item[rel=volumegroup]').hide();
                                                    $form.find('.form-item[rel=vCenterDataCenter]').hide();
                                                    $form.find('.form-item[rel=vCenterDataStore]').hide();
                                                    $form.find('.form-item[rel=rbdmonitor]').hide();
                                                    $form.find('.form-item[rel=rbdpool]').hide();
                                                    $form.find('.form-item[rel=rbdid]').hide();
                                                    $form.find('.form-item[rel=rbdsecret]').hide();
                                                    $form.find('.form-item[rel=smbUsername]').hide();
                                                    $form.find('.form-item[rel=smbPassword]').hide();
                                                    $form.find('.form-item[rel=smbDomain]').hide();
                                                    $form.find('.form-item[rel=glustervolume]').hide();
                                                }
                                            });
                                            args.$select.trigger("change");
                                        }
                                    },
                                    //always appear (end)
                                    server: {
                                        label: 'label.server',
                                        docID: 'helpPrimaryStorageServer',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    //nfs
                                    path: {
                                        label: 'label.path',
                                        docID: 'helpPrimaryStoragePath',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    provider: {
                                        label: 'label.provider',
                                        validation: {
                                            required: true
                                        },
                                        select: function (args) {
                                            var data = args.context.providers ?
                                                { id: args.context.providers[0].id } :
                                                {};
                                            $.ajax({
                                                url: createURL('listStorageProviders'),
                                                data: {
                                                    type: 'primary'
                                                },
                                                success: function (json) {
                                                    var providers = json.liststorageprovidersresponse.dataStoreProvider ? json.liststorageprovidersresponse.dataStoreProvider : [];
                                                    args.response.success({
                                                        data: $.map(providers, function (provider) {
                                                            return {
                                                                id: provider.name,
                                                                description: provider.name
                                                            };
                                                        })
                                                    });
                                                }
                                            });
                                            args.$select.change(function () {
                                                var $form = $(this).closest('form');
                                                var scope = $(this).val();
                                                if (scope == 'DefaultPrimary') {
                                                    $form.find('.form-item[rel=isManaged]').hide();
                                                    $form.find('.form-item[rel=capacityIops]').hide();
                                                    $form.find('.form-item[rel=capacityBytes]').hide();
                                                    $form.find('.form-item[rel=url]').hide();
                                                } else {
                                                    $form.find('.form-item[rel=isManaged]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=capacityIops]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=capacityBytes]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=url]').css('display', 'inline-block');
                                                }
                                            }
                                        )
                                    }},
                                    isManaged: {
                                        label: 'label.managed',
                                        docID: 'helpManaged',
                                        isBoolean: true,
                                        isChecked: false,
                                        validation: {
                                            required: false
                                        }
                                    },
                                    capacityBytes: {
                                        label: 'label.capacity.bytes',
                                        docID: 'helpCapacityBytes',
                                        validation: {
                                            required: false
                                        }
                                    },
                                    capacityIops: {
                                        label: 'label.capacity.iops',
                                        docID: 'helpCapacityIops',
                                        validation: {
                                            required: false
                                        }
                                    },
                                    url: {
                                        label: 'label.url',
                                        docID: 'helpUrl',
                                        validation: {
                                            required: false
                                        }
                                    },
                                    //SMB
                                    smbUsername: {
                                        label: 'label.smb.username',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    smbPassword: {
                                        label: 'label.smb.password',
                                        isPassword: true,
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    smbDomain: {
                                        label: 'label.smb.domain',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    //iscsi
                                    iqn: {
                                        label: 'label.target.iqn',
                                        docID: 'helpPrimaryStorageTargetIQN',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    lun: {
                                        label: 'label.LUN.number',
                                        docID: 'helpPrimaryStorageLun',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    //clvm
                                    volumegroup: {
                                        label: 'label.volgroup',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    //vmfs
                                    vCenterDataCenter: {
                                        label: 'label.vcenter.datacenter',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    vCenterDataStore: {
                                        label: 'label.vcenter.datastore',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    // RBD
                                    rbdmonitor: {
                                        label: 'label.rbd.monitor',
                                        docID: 'helpPrimaryStorageRBDMonitor',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    rbdpool: {
                                        label: 'label.rbd.pool',
                                        docID: 'helpPrimaryStorageRBDPool',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    rbdid: {
                                        label: 'label.rbd.id',
                                        docID: 'helpPrimaryStorageRBDId',
                                        validation: {
                                            required: false
                                        },
                                        isHidden: true
                                    },
                                    rbdsecret: {
                                        label: 'label.rbd.secret',
                                        docID: 'helpPrimaryStorageRBDSecret',
                                        validation: {
                                            required: false
                                        },
                                        isHidden: true
                                    },
                                    //gluster
                                    glustervolume: {
                                        label: 'label.gluster.volume',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    //always appear (begin)
                                    storageTags: {
                                        label: 'label.storage.tags',
                                        docID: 'helpPrimaryStorageTags',
                                        isTokenInput: true,
                                        validation: {
                                            required: false
                                        },
                                        dataProvider: function(args) {
                                            $.ajax({
                                                url: createURL("listStorageTags"),
                                                dataType: "json",
                                                success: function(json) {
                                                    var item = json.liststoragetagsresponse.storagetag;
                                                    var tags = [];
                                                    if (item != null)
                                                    {
                                                        tags = $.map(item, function(tag) {
                                                            return {
                                                                       id: tag.name,
                                                                       name: tag.name
                                                                   };
                                                        });
                                                    }
                                                    args.response.success({
                                                        data: tags,
                                                        hintText: _l('hint.type.part.storage.tag'),
                                                        noResultsText: _l('hint.no.storage.tags')
                                                    });
                                                },
                                                error: function(XMLHttpResponse) {
                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                    args.response.error(errorMsg);
                                                }
                                            });
                                        }
                                    }
                                    //always appear (end)
                                }
                            },
                            /******************************/
                            action: function (args) {
                                var array1 =[];
                                array1.push("&scope=" + encodeURIComponent(args.data.scope));
                                array1.push("&zoneid=" + args.data.zoneid);
                                if (args.data.scope == 'zone') {
                                    array1.push("&hypervisor=" + args.data.hypervisor);
                                }
                                if (args.data.scope == 'cluster') {
                                    array1.push("&podid=" + args.data.podId);
                                    array1.push("&clusterid=" + args.data.clusterId);
                                }
                                if (args.data.scope == 'host') {
                                    array1.push("&podid=" + args.data.podId);
                                    array1.push("&clusterid=" + args.data.clusterId);
                                    array1.push("&hostid=" + args.data.hostId);
                                }
                                array1.push("&name=" + encodeURIComponent(args.data.name));
                                array1.push("&provider=" + encodeURIComponent(args.data.provider));
                                if (args.data.provider == "DefaultPrimary")
                                {
                                    var server = args.data.server;
                                    var url = null;
                                    if (args.data.protocol == "nfs") {
                                        var path = args.data.path;
                                        if (path.substring(0, 1) != "/")
                                            path = "/" + path;
                                        url = nfsURL(server, path);
                                    } else if (args.data.protocol == "SMB") {
                                        var path = args.data.path;
                                        if (path.substring(0, 1) != "/")
                                            path = "/" + path;
                                        url = smbURL(server, path);
                                        array1.push("&details[0].user=" + args.data.smbUsername);
                                        array1.push("&details[1].password=" + encodeURIComponent(args.data.smbPassword));
                                        array1.push("&details[2].domain=" + args.data.smbDomain);
                                    } else if (args.data.protocol == "PreSetup") {
                                        var path = args.data.path;
                                        if (path.substring(0, 1) != "/")
                                            path = "/" + path;
                                        url = presetupURL(server, path);
                                    } else if (args.data.protocol == "ocfs2") {
                                        var path = args.data.path;
                                        if (path.substring(0, 1) != "/")
                                            path = "/" + path;
                                        url = ocfs2URL(server, path);
                                    } else if (args.data.protocol == "SharedMountPoint") {
                                        var path = args.data.path;
                                        if (path.substring(0, 1) != "/")
                                            path = "/" + path;
                                        url = SharedMountPointURL(server, path);
                                    } else if (args.data.protocol == "clvm") {
                                        var vg = args.data.volumegroup;
                                        if (vg.substring(0, 1) != "/")
                                            vg = "/" + vg;
                                        url = clvmURL(vg);
                                    } else if (args.data.protocol == "rbd") {
                                        var rbdmonitor = args.data.rbdmonitor;
                                        var rbdpool = args.data.rbdpool;
                                        var rbdid = args.data.rbdid;
                                        var rbdsecret = args.data.rbdsecret;
                                        url = rbdURL(rbdmonitor, rbdpool, rbdid, rbdsecret);
                                    } else if (args.data.protocol == "vmfs") {
                                        var path = args.data.vCenterDataCenter;
                                        if (path.substring(0, 1) != "/")
                                            path = "/" + path;
                                        path += "/" + args.data.vCenterDataStore;
                                        url = vmfsURL("dummy", path);
                                    } else if (args.data.protocol == "gluster") {
                                        var glustervolume = args.data.glustervolume;
                                        if (glustervolume.substring(0, 1) != "/")
                                            glustervolume = "/" + glustervolume;
                                        url = glusterURL(server, glustervolume);
                                    } else if (args.data.protocol == "iscsi") {
                                        var iqn = args.data.iqn;
                                        if (iqn.substring(0, 1) != "/")
                                            iqn = "/" + iqn;
                                        var lun = args.data.lun;
                                        url = iscsiURL(server, iqn, lun);
                                    } else {
                                        url = "";
                                    }
                                    array1.push("&url=" + encodeURIComponent(url));
                                }
                                else
                                {
                                    array1.push("&managed=" + (args.data.isManaged == "on").toString());
                                    if (args.data.capacityBytes != null && args.data.capacityBytes.length > 0)
                                    {
                                        array1.push("&capacityBytes=" + args.data.capacityBytes.split(",").join(""));
                                    }
                                    if (args.data.capacityIops != null && args.data.capacityIops.length > 0)
                                    {
                                        array1.push("&capacityIops=" + args.data.capacityIops.split(",").join(""));
                                    }
                                    if (args.data.url != null && args.data.url.length > 0)
                                    {
                                        array1.push("&url=" + encodeURIComponent(args.data.url));
                                    }
                                }
                                if (args.data.storageTags != null && args.data.storageTags.length > 0)
                                {
                                    array1.push("&tags=" + encodeURIComponent(args.data.storageTags));
                                }
                                if ("custom" in args.response) {
                                    args.response.custom(array1);
                                    return;
                                }
                                $.ajax({
                                    url: createURL("createStoragePool" + array1.join("")),
                                    dataType: "json",
                                    success: function (json) {
                                        var item = json.createstoragepoolresponse.storagepool;
                                        args.response.success({
                                            data: item
                                        });
                                    },
                                    error: function (XMLHttpResponse) {
                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                        args.response.error(errorMsg);
                                    }
                                });
                            },
                            notification: {
                                poll: function (args) {
                                    args.complete({
                                        actionFilter: primarystorageActionfilter
                                    });
                                }
                            },
                            messages: {
                                notification: function (args) {
                                    return 'label.add.primary.storage';
                                }
                            }
                        },
                        viewMetrics: {
                            label: 'label.metrics',
                            isHeader: true,
                            addRow: false,
                            action: {
                                custom: cloudStack.uiCustom.metricsView({resource: 'storagepool'})
                            },
                            messages: {
                                notification: function (args) {
                                    return 'label.metrics';
                                }
                            }
                        }
                    },
                    detailView: {
                        name: "Primary storage details",
                        viewAll: {
                            label: 'label.volumes',
                            path: 'storage.volumes'
                        },
                        isMaximized: true,
                        actions: {
                            edit: {
                                label: 'label.edit',
                                action: function (args) {
                                    var array1 =[];
                                    array1.push("&tags=" + encodeURIComponent(args.data.tags));
                                    if (args.data.disksizetotal != null && args.data.disksizetotal.length > 0) {
                                        var diskSizeTotal = args.data.disksizetotal.split(",").join("");
                                        array1.push("&capacitybytes=" + cloudStack.converters.toBytes(diskSizeTotal));
                                    }
                                    if (args.data.capacityiops != null && args.data.capacityiops.length > 0) {
                                        var capacityIops = args.data.capacityiops.split(",").join("");
                                        array1.push("&capacityiops=" + capacityIops);
                                    }
                                    $.ajax({
                                        url: createURL("updateStoragePool&id=" + args.context.primarystorages[0].id + array1.join("")),
                                        dataType: "json",
                                        success: function (json) {
                                            var item = json.updatestoragepoolresponse.storagepool;
                                            args.response.success({
                                                data: item
                                            });
                                        },
                                        error: function (XMLHttpResponse) {
                                            args.response.error(parseXMLHttpResponse(XMLHttpResponse));
                                        }
                                    });
                                }
                            },
                            enableMaintenanceMode: {
                                label: 'label.action.enable.maintenance.mode',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("enableStorageMaintenance&id=" + args.context.primarystorages[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.prepareprimarystorageformaintenanceresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        return json.queryasyncjobresultresponse.jobresult.storagepool;
                                                    },
                                                    getActionFilter: function () {
                                                        return primarystorageActionfilter;
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.primarystorage.enable.maintenance.mode';
                                    },
                                    notification: function (args) {
                                        return 'label.action.enable.maintenance.mode';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            cancelMaintenanceMode: {
                                label: 'label.action.cancel.maintenance.mode',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.cancel.maintenance.mode';
                                    },
                                    notification: function (args) {
                                        return 'label.action.cancel.maintenance.mode';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("cancelStorageMaintenance&id=" + args.context.primarystorages[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.cancelprimarystoragemaintenanceresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        return json.queryasyncjobresultresponse.jobresult.storagepool;
                                                    },
                                                    getActionFilter: function () {
                                                        return primarystorageActionfilter;
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            'remove': {
                                label: 'label.action.delete.primary.storage',
                                messages: {
                                    notification: function (args) {
                                        return 'label.action.delete.primary.storage';
                                    }
                                },
                                createForm: {
                                    title: 'label.action.delete.primary.storage',
                                    fields: {
                                        isForced: {
                                            label: 'force.remove',
                                            isBoolean: true
                                        }
                                    }
                                },
                                action: function (args) {
                                    var array1 =[];
                                    array1.push("&forced=" + (args.data.isForced == "on"));
                                    $.ajax({
                                        url: createURL("deleteStoragePool&id=" + args.context.primarystorages[0].id + array1.join("")),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            args.response.success({
                                                data: {
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: function (args) {
                                        args.complete();
                                    }
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    id: {
                                        label: 'label.id'
                                    },
                                    state: {
                                        label: 'label.state'
                                    },
                                    tags: {
                                        label: 'label.storage.tags',
                                        isTokenInput : true,
                                        isEditable: true,
                                        dataProvider: function(args) {
                                            $.ajax({
                                                url: createURL("listStorageTags"),
                                                dataType: "json",
                                                success: function(json) {
                                                    var item = json.liststoragetagsresponse.storagetag;
                                                    var tags = [];
                                                    if (item != null)
                                                    {
                                                        tags = $.map(item, function(tag) {
                                                            return {
                                                                       id: tag.name,
                                                                       name: tag.name
                                                                   };
                                                        });
                                                    }
                                                    args.response.success({
                                                        data: tags,
                                                        hintText: _l('hint.type.part.storage.tag'),
                                                        noResultsText: _l('hint.no.storage.tags')
                                                    });
                                                },
                                                error: function(XMLHttpResponse) {
                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                    args.response.error(errorMsg);
                                                }
                                            });
                                        }
                                    },
                                    zonename: {
                                        label: 'label.zone'
                                    },
                                    podname: {
                                        label: 'label.pod'
                                    },
                                    clustername: {
                                        label: 'label.cluster'
                                    },
                                    type: {
                                        label: 'label.type'
                                    },
                                    ipaddress: {
                                        label: 'label.ip.address'
                                    },
                                    path: {
                                        label: 'label.path'
                                    },
                                    disksizetotal: {
                                        label: 'label.disk.total',
                                        isEditable: true,
                                        converter: function (args) {
                                            if (args == null || args == 0)
                                            return ""; else
                                            return cloudStack.converters.convertBytes(args);
                                        }
                                    },
                                    disksizeallocated: {
                                        label: 'label.disk.allocated',
                                        converter: function (args) {
                                            if (args == null || args == 0)
                                            return ""; else
                                            return cloudStack.converters.convertBytes(args);
                                        }
                                    },
                                    capacityiops: {
                                        label: 'label.disk.iops.total',
                                        isEditable: true,
                                        converter: function (args) {
                                            if (args == null || args == 0)
                                            return ""; else
                                            return args;
                                        }
                                    },
                                    allocatediops: {
                                        label: 'label.disk.iops.allocated',
                                        isEditable: false,
                                        converter: function (args) {
                                            if (args == null || args == 0)
                                            return ""; else
                                            return args;
                                        }
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listStoragePools&id=" + args.context.primarystorages[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.liststoragepoolsresponse.storagepool[0];
                                            args.response.success({
                                                actionFilter: primarystorageActionfilter,
                                                data: item
                                            });
                                        }
                                    });
                                }
                            },
                            // Granular settings for storage pool
                            settings: {
                                title: 'label.settings',
                                custom: cloudStack.uiCustom.granularSettings({
                                    dataProvider: function (args) {
                                        $.ajax({
                                            url: createURL('listConfigurations&storageid=' + args.context.primarystorages[0].id),
                                            data: listViewDataProvider(args, {
                                            },
                                            {
                                                searchBy: 'name'
                                            }),
                                            success: function (json) {
                                                args.response.success({
                                                    data: json.listconfigurationsresponse.configuration
                                                });
                                            },
                                            error: function (json) {
                                                args.response.error(parseXMLHttpResponse(json));
                                            }
                                        });
                                    },
                                    actions: {
                                        edit: function (args) {
                                            // call updateStorageLevelParameters
                                            var data = {
                                                name: args.data.jsonObj.name,
                                                value: args.data.value
                                            };
                                            $.ajax({
                                                url: createURL('updateConfiguration&storageid=' + args.context.primarystorages[0].id),
                                                data: data,
                                                success: function (json) {
                                                    var item = json.updateconfigurationresponse.configuration;
                                                    args.response.success({
                                                        data: item
                                                    });
                                                },
                                                error: function (json) {
                                                    args.response.error(parseXMLHttpResponse(json));
                                                }
                                            });
                                        }
                                    }
                                })
                            }
                        }
                    }
                }
            },
            ucs: {
                title: 'UCS',
                id: 'ucs',
                listView: {
                    id: 'ucsManagers',
                    fields: {
                        name: {
                            label: 'label.name'
                        },
                        url: {
                            label: 'label.url'
                        }
                    },
                    dataProvider: function (args) {
                        $.ajax({
                            url: createURL('listUcsManagers'),
                            data: {
                                zoneid: args.context.physicalResources[0].id
                            },
                            success: function (json) {
                                //for testing only (begin)
                                /*
                                json =
                                {
                                "listucsmanagerreponse": {
                                "count": 1,
                                "ucsmanager": [
                                {
                                "id": "07b5b813-83ed-4859-952c-c95cafb63ac4",
                                "name": "ucsmanager",
                                "url": "10.223.184.2",
                                "zoneid": "54c9a65c-ba89-4380-96e9-1d429c5372e3"
                                }
                                ]
                                }
                                };
                                 */
                                //for testing only (end)
                                var items = json.listucsmanagerreponse.ucsmanager;
                                args.response.success({
                                    data: items
                                });
                            }
                        });
                    },
                    actions: {
                        add: {
                            label: 'label.add.ucs.manager',
                            messages: {
                                notification: function (args) {
                                    return 'label.add.ucs.manager';
                                }
                            },
                            createForm: {
                                title: 'label.add.ucs.manager',
                                fields: {
                                    name: {
                                        label: 'label.name',
                                        validation: {
                                            required: false
                                        }
                                    },
                                    url: {
                                        label: 'label.ip', //CLOUDSTACK-4629
                                        validation: {
                                            required: true
                                        }
                                    },
                                    username: {
                                        label: 'label.username',
                                        validation: {
                                            required: true
                                        }
                                    },
                                    password: {
                                        label: 'label.password',
                                        isPassword: true,
                                        validation: {
                                            required: true
                                        }
                                    }
                                }
                            },
                            action: function (args) {
                                var data = {
                                    zoneid: args.context.physicalResources[0].id,
                                    url: args.data.url,
                                    username: args.data.username,
                                    password: args.data.password
                                };
                                if (args.data.name != null && args.data.name.length > 0) {
                                    $.extend(data, {
                                        name: args.data.name
                                    });
                                }
                                $.ajax({
                                    url: createURL('addUcsManager'),
                                    data: data,
                                    type: "POST",
                                    success: function (json) {
                                        //e.g. json == { "addUcsManagerResponse" :  { "ucsmanager" : {"id":"11","name":"ucsmanager","url":"10.223.184.2","zoneid":"2"} }  }
                                        var item = json.addUcsManagerResponse.ucsmanager;
                                        args.response.success({
                                            data: item
                                        });
                                    },
                                    error: function (data) {
                                        args.response.error(parseXMLHttpResponse(data));
                                    }
                                });
                            },
                            notification: {
                                poll: function (args) {
                                    args.complete();
                                }
                            }
                        }
                    },
                    detailView: {
                        isMaximized: true,
                        noCompact: true,
                        actions: {
                            remove: {
                                label: 'label.delete.ucs.manager',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.delete.ucs.manager';
                                    },
                                    notification: function (args) {
                                        return 'label.delete.ucs.manager';
                                    }
                                },
                                action: function (args) {
                                    var data = {
                                        ucsmanagerid: args.context.ucsManagers[0].id
                                    };
                                    $.ajax({
                                        url: createURL('deleteUcsManager'),
                                        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'
                                    }
                                },
                                {
                                    id: {
                                        label: 'label.id'
                                    },
                                    url: {
                                        label: 'label.url'
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL('listUcsManagers'),
                                        data: {
                                            id: args.context.ucsManagers[0].id
                                        },
                                        success: function (json) {
                                            //for testing only (begin)
                                            /*
                                            json =
                                            {
                                            "listucsmanagerreponse": {
                                            "count": 1,
                                            "ucsmanager": [
                                            {
                                            "id": "07b5b813-83ed-4859-952c-c95cafb63ac4",
                                            "name": "ucsmanager",
                                            "url": "10.223.184.2",
                                            "zoneid": "54c9a65c-ba89-4380-96e9-1d429c5372e3"
                                            }
                                            ]
                                            }
                                            };
                                             */
                                            //for testing only (end)
                                            var item = json.listucsmanagerreponse.ucsmanager[0];
                                            args.response.success({
                                                data: item
                                            });
                                        }
                                    });
                                }
                            },
                            blades: {
                                title: 'label.blades',
                                listView: {
                                    id: 'blades',
                                    hideSearchBar: true,
                                    fields: {
                                        chassis: {
                                            label: 'label.chassis'
                                        },
                                        bladeid: {
                                            label: 'label.blade.id'
                                        },
                                        profiledn: {
                                            label: 'label.associated.profile'
                                        }
                                    },
                                    dataProvider: function (args) {
                                        $.ajax({
                                            url: createURL('listUcsBlades'),
                                            data: {
                                                ucsmanagerid: args.context.ucsManagers[0].id
                                            },
                                            success: function (json) {
                                                //for testing only (begin)
                                                /*
                                                json = {
                                                "listucsbladeresponse": {
                                                "count": 4,
                                                "ucsblade": [
                                                {
                                                "id": "84edb958-cf8a-4e71-99c6-190ccc3fe2bd",
                                                "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4",
                                                "bladedn": "sys/chassis-1/blade-1",
                                                "profiledn": "org-root/ls-profile-for-blade-1"
                                                },
                                                {
                                                "id": "524a3e55-5b61-4561-9464-1b19e3543189",
                                                "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4",
                                                "bladedn": "sys/chassis-1/blade-2",
                                                "profiledn": "org-root/ls-profile-for-blade-2"
                                                },
                                                {
                                                "id": "4828f560-6191-46e6-8a4c-23d1d7d017f0",
                                                "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4",
                                                "bladedn": "sys/chassis-1/blade-3"
                                                },
                                                {
                                                "id": "80ab25c8-3dcf-400e-8849-84dc5e1e6594",
                                                "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4",
                                                "bladedn": "sys/chassis-1/blade-4"
                                                }
                                                ]
                                                }
                                                };
                                                 */
                                                //for testing only (end)
                                                var items = json.listucsbladeresponse.ucsblade ? json.listucsbladeresponse.ucsblade:[];
                                                for (var i = 0; i < items.length; i++) {
                                                    addExtraPropertiesToUcsBladeObject(items[i]);
                                                }
                                                args.response.success({
                                                    actionFilter: bladeActionfilter,
                                                    data: items
                                                });
                                            }
                                        });
                                    },
                                    actions: {
                                        refreshUcsBlades: {
                                            isHeader: true,
                                            label: 'label.refresh.blades',
                                            messages: {
                                                confirm: function (args) {
                                                    return 'message.confirm.refresh.blades';
                                                },
                                                notification: function (args) {
                                                    return 'label.refresh.blades';
                                                }
                                            },
                                            action: function (args) {
                                                $.ajax({
                                                    url: createURL('refreshUcsBlades'),
                                                    data: {
                                                        ucsmanagerid: args.context.ucsManagers[0].id
                                                    },
                                                    success: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                });
                                            },
                                            notification: {
                                                poll: function (args) {
                                                    args.complete();
                                                }
                                            }
                                        },
                                        associateTemplateToBlade: {
                                            label: 'label.instanciate.template.associate.profile.blade',
                                            addRow: 'false',
                                            messages: {
                                                notification: function (args) {
                                                    return 'label.instanciate.template.associate.profile.blade';
                                                }
                                            },
                                            createForm: {
                                                title: 'label.instanciate.template.associate.profile.blade',
                                                fields: {
                                                    templatedn: {
                                                        label: 'label.select.template',
                                                        select: function (args) {
                                                            var items =[];
                                                            $.ajax({
                                                                url: createURL('listUcsTemplates'),
                                                                data: {
                                                                    ucsmanagerid: args.context.ucsManagers[0].id
                                                                },
                                                                async: false,
                                                                success: function (json) {
                                                                    //for testing only (begin)
                                                                    /*
                                                                    json = {
                                                                    "listucstemplatesresponse": {
                                                                    "count": 1,
                                                                    "ucstemplate": [
                                                                    {
                                                                    "ucsdn": "org-root/ls-test"
                                                                    }
                                                                    ]
                                                                    }
                                                                    };
                                                                     */
                                                                    //for testing only (end)
                                                                    var ucstemplates = json.listucstemplatesresponse.ucstemplate;
                                                                    if (ucstemplates != null) {
                                                                        for (var i = 0; i < ucstemplates.length; i++) {
                                                                            items.push({
                                                                                id: ucstemplates[i].ucsdn,
                                                                                description: ucstemplates[i].ucsdn
                                                                            });
                                                                        }
                                                                    }
                                                                }
                                                            });
                                                            args.response.success({
                                                                data: items
                                                            });
                                                        },
                                                        validation: {
                                                            required: true
                                                        }
                                                    },
                                                    profilename: {
                                                        label: 'label.profile'
                                                    }
                                                }
                                            },
                                            action: function (args) {
                                                var data = {
                                                    ucsmanagerid: args.context.ucsManagers[0].id,
                                                    templatedn: args.data.templatedn,
                                                    bladeid: args.context.blades[0].id
                                                };
                                                if (args.data.profilename != null && args.data.profilename.length > 0) {
                                                    $.extend(data, {
                                                        profilename: args.data.profilename
                                                    });
                                                }
                                                $.ajax({
                                                    url: createURL('instantiateUcsTemplateAndAssocaciateToBlade'),
                                                    data: data,
                                                    success: function (json) {
                                                        //for testing only (begin)
                                                        /*
                                                        json = {
                                                        "instantiateucstemplateandassociatetobladeresponse": {
                                                        "jobid": "cd9d0282-4dae-463f-80b6-451e168e2e92"
                                                        }
                                                        }
                                                         */
                                                        //for testing only (end)
                                                        var jid = json.instantiateucstemplateandassociatetobladeresponse.jobid;
                                                        args.response.success({
                                                            _custom: {
                                                                jobId: jid,
                                                                getUpdatedItem: function (json) {
                                                                    //for testing only (begin)
                                                                    /*
                                                                    json = {
                                                                    "queryasyncjobresultresponse": {
                                                                    "accountid": "970b694a-2f8c-11e3-a77d-000c29b36ff5",
                                                                    "userid": "970b7b4f-2f8c-11e3-a77d-000c29b36ff5",
                                                                    "cmd": "org.apache.cloudstack.api.InstantiateUcsTemplateAndAssociateToBladeCmd",
                                                                    "jobstatus": 1,
                                                                    "jobprocstatus": 0,
                                                                    "jobresultcode": 0,
                                                                    "jobresulttype": "object",
                                                                    "jobresult": {
                                                                    "ucsblade": {
                                                                    "id": "3d491c6e-f0b6-40b0-bf6e-f89efdd73c30",
                                                                    "ucsmanagerid": "9a34c186-12fa-4bbc-af04-5f1a2bf7ae4a",
                                                                    "bladedn": "sys/chassis-1/blade-3",
                                                                    "profiledn": "org-root/ls-xxxx"
                                                                    }
                                                                    },
                                                                    "created": "2013-10-10T17:29:00-0700",
                                                                    "jobid": "cd9d0282-4dae-463f-80b6-451e168e2e92"
                                                                    }
                                                                    };
                                                                     */
                                                                    //for testing only (end)
                                                                    addExtraPropertiesToUcsBladeObject(json.queryasyncjobresultresponse.jobresult.ucsblade);
                                                                    return json.queryasyncjobresultresponse.jobresult.ucsblade;
                                                                }
                                                            }
                                                        });
                                                    }
                                                });
                                            },
                                            notification: {
                                                poll: pollAsyncJobResult
                                            }
                                        },
                                        disassociateProfileFromBlade: {
                                            label: 'label.disassociate.profile.blade',
                                            addRow: 'false',
                                            messages: {
                                                notification: function (args) {
                                                    return 'label.disassociate.profile.blade';
                                                }
                                            },
                                            createForm: {
                                                title: 'label.disassociate.profile.blade',
                                                fields: {
                                                    deleteprofile: {
                                                        label: 'label.delete.profile',
                                                        isBoolean: true,
                                                        isChecked: true
                                                    }
                                                }
                                            },
                                            action: function (args) {
                                                $.ajax({
                                                    url: createURL('disassociateUcsProfileFromBlade'),
                                                    data: {
                                                        bladeid: args.context.blades[0].id,
                                                        deleteprofile: (args.data.deleteprofile == 'on' ? true: false)
                                                    },
                                                    success: function (json) {
                                                        //for testing only (begin)
                                                        /*
                                                        json = {
                                                        "disassociateucsprofilefrombladeresponse": {
                                                        "jobid": "e371592e-31be-4e53-9346-a5c565d420df"
                                                        }
                                                        }
                                                         */
                                                        //for testing only (end)
                                                        var jid = json.disassociateucsprofilefrombladeresponse.jobid;
                                                        args.response.success({
                                                            _custom: {
                                                                jobId: jid,
                                                                getUpdatedItem: function (json) {
                                                                    //for testing only (begin)
                                                                    /*
                                                                    json = {
                                                                    "queryasyncjobresultresponse": {
                                                                    "accountid": "835fb2d5-0b76-11e3-9350-f4f3e49b5dfe",
                                                                    "userid": "835fc0e5-0b76-11e3-9350-f4f3e49b5dfe",
                                                                    "cmd": "org.apache.cloudstack.api.DisassociateUcsProfileCmd",
                                                                    "jobstatus": 1,
                                                                    "jobprocstatus": 0,
                                                                    "jobresultcode": 0,
                                                                    "jobresulttype": "object",
                                                                    "jobresult": {
                                                                    "ucsblade": {
                                                                    "id": "f8d08575-7a1c-4f79-a588-d129c38bcc4f",
                                                                    "ucsmanagerid": "0d87c1a6-5664-425c-9024-2ddd9605d260",
                                                                    "bladedn": "sys/chassis-1/blade-1"
                                                                    }
                                                                    },
                                                                    "created": "2013-09-13T22:17:29-0700",
                                                                    "jobid": "2c3698a8-39ac-43e6-8ade-86eb2d3726a0"
                                                                    }
                                                                    };
                                                                     */
                                                                    //for testing only (end)
                                                                    addExtraPropertiesToUcsBladeObject(json.queryasyncjobresultresponse.jobresult.ucsblade);
                                                                    return json.queryasyncjobresultresponse.jobresult.ucsblade;
                                                                }
                                                            }
                                                        });
                                                    }
                                                });
                                            },
                                            notification: {
                                                poll: pollAsyncJobResult
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            },
            'secondary-storage': {
                title: 'label.secondary.storage',
                id: 'secondarystorages',
                sectionSelect: {
                    label: 'label.select-view'
                },
                sections: {
                    secondaryStorage: {
                        type: 'select',
                        title: 'label.secondary.storage',
                        listView: {
                            id: 'secondarystorages',
                            section: 'seconary-storage',
                            fields: {
                                name: {
                                    label: 'label.name'
                                },
                                url: {
                                    label: 'label.url'
                                },
                                protocol: {
                                    label: 'label.protocol'
                                },
                                scope: {
                                    label: 'label.scope'
                                },
                                zonename: {
                                    label: 'label.zone'
                                }
                            },
                            dataProvider: function (args) {
                                var array1 =[];
                                if (args.filterBy != null) {
                                    if (args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
                                        switch (args.filterBy.search.by) {
                                            case "name":
                                            if (args.filterBy.search.value.length > 0)
                                            array1.push("&keyword=" + args.filterBy.search.value);
                                            break;
                                        }
                                    }
                                }
                                array1.push("&zoneid=" + args.context.zones[0].id);
                                $.ajax({
                                    url: createURL("listImageStores&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                    dataType: "json",
                                    async: true,
                                    success: function (json) {
                                        var items = json.listimagestoresresponse.imagestore;
                                        args.response.success({
                                            actionFilter: secondarystorageActionfilter,
                                            data: items
                                        });
                                    }
                                });
                            },
                            actions: {
                                add: {
                                    label: 'label.add.secondary.storage',
                                    createForm: {
                                        title: 'label.add.secondary.storage',
                                        fields: {
                                            name: {
                                                label: 'label.name'
                                            },
                                            provider: {
                                                label: 'label.provider',
                                                select: function (args) {
                                                    /*
                                                    UI no longer gets providers from "listStorageProviders&type=image" because:
                                                    (1) Not all of returned values are handled by UI.
                                                    (2) Provider "SMB" which is handled by UI is not returned from "listStorageProviders&type=image"
                                                     */
                                                    var items =[ {
                                                        id: 'NFS',
                                                        description: 'NFS'
                                                    },
                                                    {
                                                        id: 'SMB',
                                                        description: 'SMB/CIFS'
                                                    },
                                                    {
                                                        id: 'S3',
                                                        description: 'S3'
                                                    },
                                                    {
                                                        id: 'Swift',
                                                        description: 'Swift'
                                                    }];
                                                    args.response.success({
                                                        data: items
                                                    });
                                                    args.$select.change(function () {
                                                        var $form = $(this).closest('form');
                                                        if ($(this).val() == "NFS") {
                                                            //NFS, SMB
                                                            $form.find('.form-item[rel=zoneid]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=nfsServer]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=path]').css('display', 'inline-block');
                                                            //SMB
                                                            $form.find('.form-item[rel=smbUsername]').hide();
                                                            $form.find('.form-item[rel=smbPassword]').hide();
                                                            $form.find('.form-item[rel=smbDomain]').hide();
                                                            //S3
                                                            $form.find('.form-item[rel=accesskey]').hide();
                                                            $form.find('.form-item[rel=secretkey]').hide();
                                                            $form.find('.form-item[rel=bucket]').hide();
                                                            $form.find('.form-item[rel=endpoint]').hide();
                                                            $form.find('.form-item[rel=usehttps]').hide();
                                                            $form.find('.form-item[rel=connectiontimeout]').hide();
                                                            $form.find('.form-item[rel=maxerrorretry]').hide();
                                                            $form.find('.form-item[rel=sockettimeout]').hide();
                                                            $form.find('.form-item[rel=createNfsCache]').find('input').removeAttr('checked');
                                                            $form.find('.form-item[rel=createNfsCache]').hide();
                                                            $form.find('.form-item[rel=nfsCacheZoneid]').hide();
                                                            $form.find('.form-item[rel=nfsCacheNfsServer]').hide();
                                                            $form.find('.form-item[rel=nfsCachePath]').hide();
                                                            //Swift
                                                            $form.find('.form-item[rel=url]').hide();
                                                            $form.find('.form-item[rel=account]').hide();
                                                            $form.find('.form-item[rel=username]').hide();
                                                            $form.find('.form-item[rel=key]').hide();
                                                            $form.find('.form-item[rel=storagepolicy]').hide();
                                                        } else if ($(this).val() == "SMB") {
                                                            //NFS, SMB
                                                            $form.find('.form-item[rel=zoneid]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=nfsServer]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=path]').css('display', 'inline-block');
                                                            //SMB
                                                            $form.find('.form-item[rel=smbUsername]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=smbPassword]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=smbDomain]').css('display', 'inline-block');
                                                            //S3
                                                            $form.find('.form-item[rel=accesskey]').hide();
                                                            $form.find('.form-item[rel=secretkey]').hide();
                                                            $form.find('.form-item[rel=bucket]').hide();
                                                            $form.find('.form-item[rel=endpoint]').hide();
                                                            $form.find('.form-item[rel=usehttps]').hide();
                                                            $form.find('.form-item[rel=connectiontimeout]').hide();
                                                            $form.find('.form-item[rel=maxerrorretry]').hide();
                                                            $form.find('.form-item[rel=sockettimeout]').hide();
                                                            $form.find('.form-item[rel=createNfsCache]').find('input').removeAttr('checked');
                                                            $form.find('.form-item[rel=createNfsCache]').hide();
                                                            $form.find('.form-item[rel=nfsCacheZoneid]').hide();
                                                            $form.find('.form-item[rel=nfsCacheNfsServer]').hide();
                                                            $form.find('.form-item[rel=nfsCachePath]').hide();
                                                            //Swift
                                                            $form.find('.form-item[rel=url]').hide();
                                                            $form.find('.form-item[rel=account]').hide();
                                                            $form.find('.form-item[rel=username]').hide();
                                                            $form.find('.form-item[rel=key]').hide();
                                                            $form.find('.form-item[rel=storagepolicy]').hide();
                                                        } else if ($(this).val() == "S3") {
                                                            //NFS, SMB
                                                            $form.find('.form-item[rel=zoneid]').hide();
                                                            $form.find('.form-item[rel=nfsServer]').hide();
                                                            $form.find('.form-item[rel=path]').hide();
                                                            //SMB
                                                            $form.find('.form-item[rel=smbUsername]').hide();
                                                            $form.find('.form-item[rel=smbPassword]').hide();
                                                            $form.find('.form-item[rel=smbDomain]').hide();
                                                            //S3
                                                            $form.find('.form-item[rel=accesskey]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=secretkey]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=bucket]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=endpoint]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=usehttps]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=connectiontimeout]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=maxerrorretry]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=sockettimeout]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=createNfsCache]').find('input').attr('checked', 'checked');
                                                            //$form.find('.form-item[rel=createNfsCache]').find('input').attr('disabled', 'disabled');  //This checkbox should not be disabled any more because NFS staging (of a zone) might already exist (from "NFS secondary storage => Prepare Object Store Migration => NFS staging")
                                                            $form.find('.form-item[rel=createNfsCache]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=nfsCacheZoneid]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=nfsCacheNfsServer]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=nfsCachePath]').css('display', 'inline-block');
                                                            //Swift
                                                            $form.find('.form-item[rel=url]').hide();
                                                            $form.find('.form-item[rel=account]').hide();
                                                            $form.find('.form-item[rel=username]').hide();
                                                            $form.find('.form-item[rel=key]').hide();
                                                            $form.find('.form-item[rel=storagepolicy]').hide();
                                                        } else if ($(this).val() == "Swift") {
                                                            //NFS, SMB
                                                            $form.find('.form-item[rel=zoneid]').hide();
                                                            $form.find('.form-item[rel=nfsServer]').hide();
                                                            $form.find('.form-item[rel=path]').hide();
                                                            //SMB
                                                            $form.find('.form-item[rel=smbUsername]').hide();
                                                            $form.find('.form-item[rel=smbPassword]').hide();
                                                            $form.find('.form-item[rel=smbDomain]').hide();
                                                            //S3
                                                            $form.find('.form-item[rel=accesskey]').hide();
                                                            $form.find('.form-item[rel=secretkey]').hide();
                                                            $form.find('.form-item[rel=bucket]').hide();
                                                            $form.find('.form-item[rel=endpoint]').hide();
                                                            $form.find('.form-item[rel=usehttps]').hide();
                                                            $form.find('.form-item[rel=connectiontimeout]').hide();
                                                            $form.find('.form-item[rel=maxerrorretry]').hide();
                                                            $form.find('.form-item[rel=sockettimeout]').hide();
                                                            $form.find('.form-item[rel=createNfsCache]').find('input').removeAttr('checked');
                                                            $form.find('.form-item[rel=createNfsCache]').hide();
                                                            $form.find('.form-item[rel=nfsCacheZoneid]').hide();
                                                            $form.find('.form-item[rel=nfsCacheNfsServer]').hide();
                                                            $form.find('.form-item[rel=nfsCachePath]').hide();
                                                            //Swift
                                                            $form.find('.form-item[rel=url]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=account]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=username]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=key]').css('display', 'inline-block');
                                                            $form.find('.form-item[rel=storagepolicy]').css('display', 'inline-block');
                                                        }
                                                    });
                                                    args.$select.change();
                                                }
                                            },
                                            //NFS, SMB (begin)
                                            zoneid: {
                                                label: 'label.zone',
                                                docID: 'helpSecondaryStorageZone',
                                                validation: {
                                                    required: true
                                                },
                                                select: function (args) {
                                                    $.ajax({
                                                        url: createURL('listZones'),
                                                        data: {},
                                                        success: function (json) {
                                                            var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone:[];
                                                            if (zones != null) {
                                                                //$.map(items, fn) - items can not be null
                                                                args.response.success({
                                                                    data: $.map(zones, function (zone) {
                                                                        return {
                                                                            id: zone.id,
                                                                            description: zone.name
                                                                        };
                                                                    })
                                                                });
                                                            } else {
                                                                args.response.success({
                                                                    data: null
                                                                });
                                                            }
                                                        }
                                                    });
                                                }
                                            },
                                            nfsServer: {
                                                label: 'label.server', //change label from "NFS Server" to "Server" since this field is also shown when provider "SMB/CIFS" is elected.
                                                docID: 'helpSecondaryStorageNFSServer',
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            path: {
                                                label: 'label.path',
                                                docID: 'helpSecondaryStoragePath',
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            //NFS, SMB (end)
                                            //SMB (begin)
                                            smbUsername: {
                                                label: 'label.smb.username',
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            smbPassword: {
                                                label: 'label.smb.password',
                                                isPassword: true,
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            smbDomain: {
                                                label: 'label.smb.domain',
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            //SMB (end)
                                            //S3 (begin)
                                            accesskey: {
                                                label: 'label.s3.access_key',
                                                docID: 'helpS3AccessKey',
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            secretkey: {
                                                label: 'label.s3.secret_key',
                                                docID: 'helpS3SecretKey',
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            bucket: {
                                                label: 'label.s3.bucket',
                                                docID: 'helpS3Bucket',
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            endpoint: {
                                                label: 'label.s3.endpoint',
                                                docID: 'helpS3Endpoint'
                                            },
                                            usehttps: {
                                                label: 'label.s3.use_https',
                                                isEditable: true,
                                                isBoolean: true,
                                                isChecked: true,
                                                converter: cloudStack.converters.toBooleanText
                                            },
                                            connectiontimeout: {
                                                label: 'label.s3.connection_timeout',
                                                docID: 'helpS3ConnectionTimeout'
                                            },
                                            maxerrorretry: {
                                                label: 'label.s3.max_error_retry',
                                                docID: 'helpS3MaxErrorRetry'
                                            },
                                            sockettimeout: {
                                                label: 'label.s3.socket_timeout',
                                                docID: 'helpS3SocketTimeout'
                                            },
                                            createNfsCache: {
                                                label: 'label.create.nfs.secondary.staging.store',
                                                isBoolean: true,
                                                isChecked: true
                                            },
                                            nfsCacheZoneid: {
                                                dependsOn: 'createNfsCache',
                                                label: 'label.zone',
                                                validation: {
                                                    required: true
                                                },
                                                select: function (args) {
                                                    $.ajax({
                                                        url: createURL('listZones'),
                                                        data: {},
                                                        success: function (json) {
                                                            var zones = json.listzonesresponse.zone;
                                                            if (zones != null) {
                                                                //$.map(items, fn) - items can not be null
                                                                args.response.success({
                                                                    data: $.map(zones, function (zone) {
                                                                        return {
                                                                            id: zone.id,
                                                                            description: zone.name
                                                                        };
                                                                    })
                                                                });
                                                            } else {
                                                                args.response.success({
                                                                    data: null
                                                                });
                                                            }
                                                        }
                                                    });
                                                }
                                            },
                                            nfsCacheNfsServer: {
                                                dependsOn: 'createNfsCache',
                                                label: 'label.nfs.server',
                                                docID: 'helpNFSStagingServer',
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            nfsCachePath: {
                                                dependsOn: 'createNfsCache',
                                                label: 'label.path',
                                                docID: 'helpNFSStagingPath',
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            //S3 (end)
                                            //Swift (begin)
                                            url: {
                                                label: 'label.url',
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            account: {
                                                label: 'label.account',
                                                 validation: {
                                                     required: true
                                                 }
                                            },
                                            username: {
                                                label: 'label.username',
                                                 validation: {
                                                     required: true
                                                 }
                                            },
                                            key: {
                                                label: 'label.key',
                                                 validation: {
                                                     required: true
                                                 }
                                            },
                                             storagepolicy: {
                                                 label: 'label.storagepolicy'
                                             }
                                            //Swift (end)
                                        }
                                    },
                                    action: function (args) {
                                        var data = {
                                        };
                                        if (args.data.name != null && args.data.name.length > 0) {
                                            $.extend(data, {
                                                name: args.data.name
                                            });
                                        }
                                        if (args.data.provider == 'NFS') {
                                            var zoneid = args.data.zoneid;
                                            var nfs_server = args.data.nfsServer;
                                            var path = args.data.path;
                                            var url = nfsURL(nfs_server, path);
                                            $.extend(data, {
                                                provider: args.data.provider,
                                                zoneid: zoneid,
                                                url: url
                                            });
                                            $.ajax({
                                                url: createURL('addImageStore'),
                                                data: data,
                                                success: function (json) {
                                                    var item = json.addimagestoreresponse.imagestore;
                                                    args.response.success({
                                                        data: item
                                                    });
                                                },
                                                error: function (XMLHttpResponse) {
                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                    args.response.error(errorMsg);
                                                }
                                            });
                                        } else if (args.data.provider == 'SMB') {
                                            var zoneid = args.data.zoneid;
                                            var nfs_server = args.data.nfsServer;
                                            var path = args.data.path;
                                            var url = smbURL(nfs_server, path);
                                            $.extend(data, {
                                                provider: args.data.provider,
                                                zoneid: zoneid,
                                                url: url,
                                                'details[0].key': 'user',
                                                'details[0].value': args.data.smbUsername,
                                                'details[1].key': 'password',
                                                'details[1].value': args.data.smbPassword,
                                                'details[2].key': 'domain',
                                                'details[2].value': args.data.smbDomain
                                            });
                                            $.ajax({
                                                url: createURL('addImageStore'),
                                                data: data,
                                                success: function (json) {
                                                    var item = json.addimagestoreresponse.imagestore;
                                                    args.response.success({
                                                        data: item
                                                    });
                                                },
                                                error: function (XMLHttpResponse) {
                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                    args.response.error(errorMsg);
                                                }
                                            });
                                        } else if (args.data.provider == 'S3') {
                                            $.extend(data, {
                                                provider: args.data.provider,
                                                'details[0].key': 'accesskey',
                                                'details[0].value': args.data.accesskey,
                                                'details[1].key': 'secretkey',
                                                'details[1].value': args.data.secretkey,
                                                'details[2].key': 'bucket',
                                                'details[2].value': args.data.bucket,
                                                'details[3].key': 'usehttps',
                                                'details[3].value': (args.data.usehttps != null && args.data.usehttps == 'on' ? 'true': 'false')
                                            });
                                            var index = 4;
                                            if (args.data.endpoint != null && args.data.endpoint.length > 0) {
                                                data[ 'details[' + index.toString() + '].key'] = 'endpoint';
                                                data[ 'details[' + index.toString() + '].value'] = args.data.endpoint;
                                                index++;
                                            }
                                            if (args.data.connectiontimeout != null && args.data.connectiontimeout.length > 0) {
                                                data[ 'details[' + index.toString() + '].key'] = 'connectiontimeout';
                                                data[ 'details[' + index.toString() + '].value'] = args.data.connectiontimeout;
                                                index++;
                                            }
                                            if (args.data.maxerrorretry != null && args.data.maxerrorretry.length > 0) {
                                                data[ 'details[' + index.toString() + '].key'] = 'maxerrorretry';
                                                data[ 'details[' + index.toString() + '].value'] = args.data.maxerrorretry;
                                                index++;
                                            }
                                            if (args.data.sockettimeout != null && args.data.sockettimeout.length > 0) {
                                                data[ 'details[' + index.toString() + '].key'] = 'sockettimeout';
                                                data[ 'details[' + index.toString() + '].value'] = args.data.sockettimeout;
                                                index++;
                                            }
                                            $.ajax({
                                                url: createURL('addImageStore'),
                                                data: data,
                                                success: function (json) {
                                                    g_regionsecondaryenabled = true;
                                                    var item = json.addimagestoreresponse.imagestore;
                                                    args.response.success({
                                                        data: item
                                                    });
                                                },
                                                error: function (json) {
                                                    args.response.error(parseXMLHttpResponse(json));
                                                }
                                            });
                                            if (args.data.createNfsCache == 'on') {
                                                var zoneid = args.data.nfsCacheZoneid;
                                                var nfs_server = args.data.nfsCacheNfsServer;
                                                var path = args.data.nfsCachePath;
                                                var url = nfsURL(nfs_server, path);
                                                var nfsCacheData = {
                                                    provider: 'NFS',
                                                    zoneid: zoneid,
                                                    url: url
                                                };
                                                $.ajax({
                                                    url: createURL('createSecondaryStagingStore'),
                                                    data: nfsCacheData,
                                                    success: function (json) {
                                                        //do nothing
                                                    },
                                                    error: function (json) {
                                                        args.response.error(parseXMLHttpResponse(json));
                                                    }
                                                });
                                            }
                                        } else if (args.data.provider == 'Swift') {
                                            $.extend(data, {
                                                provider: args.data.provider,
                                                url: args.data.url
                                            });
                                            var index = 0;
                                            if (args.data.account != null && args.data.account.length > 0) {
                                                data[ 'details[' + index.toString() + '].key'] = 'account';
                                                data[ 'details[' + index.toString() + '].value'] = args.data.account;
                                                index++;
                                            }
                                            if (args.data.username != null && args.data.username.length > 0) {
                                                data[ 'details[' + index.toString() + '].key'] = 'username';
                                                data[ 'details[' + index.toString() + '].value'] = args.data.username;
                                                index++;
                                            }
                                            if (args.data.key != null && args.data.key.length > 0) {
                                                data[ 'details[' + index.toString() + '].key'] = 'key';
                                                data[ 'details[' + index.toString() + '].value'] = args.data.key;
                                                index++;
                                            }
                                            if (args.data.storagepolicy != null && args.data.storagepolicy.length > 0) {
                                                data[ 'details[' + index.toString() + '].key'] = 'storagepolicy';
                                                data[ 'details[' + index.toString() + '].value'] = args.data.storagepolicy;
                                                index++;
                                            }
                                            $.ajax({
                                                url: createURL('addImageStore'),
                                                data: data,
                                                success: function (json) {
                                                    g_regionsecondaryenabled = true;
                                                    var item = json.addimagestoreresponse.imagestore;
                                                    args.response.success({
                                                        data: item
                                                    });
                                                },
                                                error: function (json) {
                                                    args.response.error(parseXMLHttpResponse(json));
                                                }
                                            });
                                        }
                                    },
                                    notification: {
                                        poll: function (args) {
                                            args.complete({
                                                actionFilter: secondarystorageActionfilter
                                            });
                                        }
                                    },
                                    messages: {
                                        notification: function (args) {
                                            return 'label.add.secondary.storage';
                                        }
                                    }
                                }
                            },
                            detailView: {
                                name: 'label.secondary.storage.details',
                                isMaximized: true,
                                actions: {
                                    remove: {
                                        label: 'label.action.delete.secondary.storage',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.action.delete.secondary.storage';
                                            },
                                            notification: function (args) {
                                                return 'label.action.delete.secondary.storage';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL("deleteImageStore&id=" + args.context.secondaryStorage[0].id),
                                                dataType: "json",
                                                async: true,
                                                success: function (json) {
                                                    args.response.success();
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: function (args) {
                                                args.complete({
                                                    data: {
                                                        resourcestate: 'Destroyed'
                                                    }
                                                });
                                            }
                                        }
                                    }
                                },
                                tabs: {
                                    details: {
                                        title: 'label.details',
                                        fields:[ {
                                            name: {
                                                label: 'label.name'
                                            }
                                        },
                                        {
                                            url: {
                                                label: 'label.url'
                                            },
                                            protocol: {
                                                label: 'label.protocol'
                                            },
                                            providername: {
                                                label: 'label.provider'
                                            },
                                            scope: {
                                                label: 'label.scope'
                                            },
                                            zonename: {
                                                label: 'label.zone'
                                            },
                                            id: {
                                                label: 'label.id'
                                            }
                                        }],
                                        dataProvider: function (args) {
                                            $.ajax({
                                                url: createURL("listImageStores&id=" + args.context.secondaryStorage[0].id),
                                                dataType: "json",
                                                async: true,
                                                success: function (json) {
                                                    var item = json.listimagestoresresponse.imagestore[0];
                                                    processPropertiesInImagestoreObject(item);
                                                    args.response.success({
                                                        actionFilter: secondarystorageActionfilter,
                                                        data: item
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    // Granular settings for image store
									settings: {
										title: 'label.settings',
										custom: cloudStack.uiCustom.granularSettings({
											dataProvider: function (args) {
												$.ajax({
													url: createURL('listConfigurations&imagestoreuuid=' + args.context.secondaryStorage[0].id),
													data: listViewDataProvider(args, {
													},
													{
														searchBy: 'name'
													}),
													success: function (json) {
														args.response.success({
															data: json.listconfigurationsresponse.configuration
														});
													},
													error: function (json) {
														args.response.error(parseXMLHttpResponse(json));
													}
												});
											},
											actions: {
												edit: function (args) {
													// call updateStorageLevelParameters
													var data = {
														name: args.data.jsonObj.name,
														value: args.data.value
													};
													$.ajax({
														url: createURL('updateConfiguration&imagestoreuuid=' + args.context.secondaryStorage[0].id),
														data: data,
														success: function (json) {
															var item = json.updateconfigurationresponse.configuration;
															args.response.success({
																data: item
															});
														},
														error: function (json) {
															args.response.error(parseXMLHttpResponse(json));
														}
													});
												}
											}
										})
									}
                                }
                            }
                        }
                    },
                    cacheStorage: {
                        type: 'select',
                        title: 'label.secondary.staging.store',
                        listView: {
                            id: 'secondarystorages',
                            section: 'seconary-storage',
                            fields: {
                                name: {
                                    label: 'label.name'
                                },
                                url: {
                                    label: 'label.url'
                                },
                                providername: {
                                    label: 'label.provider'
                                }
                            },
                            /*
                            dataProvider: function(args) {  //being replaced with dataProvider in line 6898
                            var array1 = [];
                            if(args.filterBy != null) {
                            if(args.filterBy.search != null && args.filterBy.search.by != null && args.filterBy.search.value != null) {
                            switch(args.filterBy.search.by) {
                            case "name":
                            if(args.filterBy.search.value.length > 0)
                            array1.push("&keyword=" + args.filterBy.search.value);
                            break;
                            }
                            }
                            }
                            array1.push("&zoneid=" + args.context.zones[0].id);
                            $.ajax({
                            url: createURL("listImageStores&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                            dataType: "json",
                            async: true,
                            success: function(json) {
                            var items = json.listimagestoreresponse.imagestore;
                            args.response.success({
                            actionFilter: secondarystorageActionfilter,
                            data:items
                            });
                            }
                            });
                            },
                             */
                            actions: {
                                add: {
                                    label: 'label.add.nfs.secondary.staging.store',
                                    createForm: {
                                        title: 'label.add.nfs.secondary.staging.store',
                                        fields: {
                                            zoneid: {
                                                label: 'label.zone',
                                                validation: {
                                                    required: true
                                                },
                                                select: function (args) {
                                                    $.ajax({
                                                        url: createURL('listZones'),
                                                        data: {},
                                                        success: function (json) {
                                                            var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone:[];
                                                            if (zones != null) {
                                                                //$.map(items, fn) - items can not be null
                                                                args.response.success({
                                                                    data: $.map(zones, function (zone) {
                                                                        return {
                                                                            id: zone.id,
                                                                            description: zone.name
                                                                        };
                                                                    })
                                                                });
                                                            } else {
                                                                args.response.success({
                                                                    data: null
                                                                });
                                                            }
                                                        }
                                                    });
                                                }
                                            },
                                            nfsServer: {
                                                label: 'label.nfs.server',
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            path: {
                                                label: 'label.path',
                                                validation: {
                                                    required: true
                                                }
                                            }
                                        }
                                    },
                                    action: function (args) {
                                        var data = {
                                            provider: 'NFS',
                                            zoneid: args.data.zoneid,
                                            url: nfsURL(args.data.nfsServer, args.data.path)
                                        };
                                        $.ajax({
                                            url: createURL('createSecondaryStagingStore'),
                                            data: data,
                                            success: function (json) {
                                                var item = json.createsecondarystagingstoreresponse.secondarystorage;
                                                args.response.success({
                                                    data: item
                                                });
                                            },
                                            error: function (json) {
                                                args.response.error(parseXMLHttpResponse(json));
                                            }
                                        });
                                    },
                                    notification: {
                                        poll: function (args) {
                                            args.complete();
                                        }
                                    },
                                    messages: {
                                        notification: function (args) {
                                            return 'label.add.nfs.secondary.staging.store';
                                        }
                                    }
                                }
                            },
                            detailView: {
                                name: 'label.secondary.staging.store.details',
                                isMaximized: true,
                                actions: {
                                    remove: {
                                        label: 'label.delete.secondary.staging.store',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.confirm.delete.secondary.staging.store';
                                            },
                                            notification: function (args) {
                                                return 'label.delete.secondary.staging.store';
                                            }
                                        },
                                        action: function (args) {
                                            var data = {
                                                id: args.context.cacheStorage[0].id
                                            };
                                            $.ajax({
                                                url: createURL('deleteSecondaryStagingStore'),
                                                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'
                                            }
                                        },
                                        {
                                            url: {
                                                label: 'label.url'
                                            },
                                            providername: {
                                                label: 'label.provider'
                                            },
                                            scope: {
                                                label: 'label.scope'
                                            },
                                            zonename: {
                                                label: 'label.zone'
                                            },
                                            details: {
                                                label: 'label.details',
                                                converter: function (array1) {
                                                    var string1 = '';
                                                    if (array1 != null) {
                                                        for (var i = 0; i < array1.length; i++) {
                                                            if (i > 0)
                                                            string1 += ', ';
                                                            string1 += array1[i].name + ': ' + array1[i].value;
                                                        }
                                                    }
                                                    return string1;
                                                }
                                            },
                                            id: {
                                                label: 'label.id'
                                            }
                                        }],
                                        dataProvider: function (args) {
                                            $.ajax({
                                                url: createURL('listSecondaryStagingStores'),
                                                data: {
                                                    id: args.context.cacheStorage[0].id
                                                },
                                                async: false,
                                                success: function (json) {
                                                    var item = json.listsecondarystagingstoreresponse.imagestore[0];
                                                    args.response.success({
                                                        data: item
                                                    });
                                                }
                                            });
                                        }
                                    }
                                    // Granular settings for storage pool for secondary storage is not required
                                    /*  settings: {
                                    title: 'label.menu.global.settings',
                                    custom: cloudStack.uiCustom.granularSettings({
                                    dataProvider: function(args) {
                                    args.response.success({
                                    data: [
                                    { name: 'config.param.1', value: 1 },
                                    { name: 'config.param.2', value: 2 }
                                    ]
                                    });
                                    },
                                    actions: {
                                    edit: function(args) {
                                    // call updateStorageLevelParameters
                                    args.response.success();
                                    }
                                    }
                                    })
                                    } */
                                }
                            }
                        }
                    }
                }
            },
            guestIpRanges: {
                //Advanced zone - Guest traffic type - Network tab - Network detailView - View IP Ranges
                title: 'label.guest.ip.range',
                id: 'guestIpRanges',
                listView: {
                    section: 'guest-IP-range',
                    fields: {
                        startip: {
                            label: 'label.ipv4.start.ip'
                        },
                        endip: {
                            label: 'label.ipv4.end.ip'
                        },
                        startipv6: {
                            label: 'label.ipv6.start.ip'
                        },
                        endipv6: {
                            label: 'label.ipv6.end.ip'
                        },
                        gateway: {
                            label: 'label.gateway'
                        },
                        netmask: {
                            label: 'label.netmask'
                        }
                    },
                    dataProvider: function (args) {
                        $.ajax({
                            url: createURL("listVlanIpRanges&zoneid=" + selectedZoneObj.id + "&networkid=" + args.context.networks[0].id + "&page=" + args.page + "&pagesize=" + pageSize),
                            dataType: "json",
                            async: true,
                            success: function (json) {
                                var items = json.listvlaniprangesresponse.vlaniprange;
                                args.response.success({
                                    data: items
                                });
                            }
                        });
                    },
                    actions: {
                        add: {
                            label: 'label.add.ip.range',
                            createForm: {
                                title: 'label.add.ip.range',
                                fields: {
                                    gateway: {
                                        label: 'label.gateway'
                                    },
                                    netmask: {
                                        label: 'label.netmask'
                                    },
                                    startipv4: {
                                        label: 'label.ipv4.start.ip'
                                    },
                                    endipv4: {
                                        label: 'label.ipv4.end.ip'
                                    },
                                    ip6cidr: {
                                        label: 'label.ipv6.CIDR'
                                    },
                                    ip6gateway: {
                                        label: 'label.ipv6.gateway'
                                    },
                                    startipv6: {
                                        label: 'label.ipv6.start.ip'
                                    },
                                    endipv6: {
                                        label: 'label.ipv6.end.ip'
                                    }
                                }
                            },
                            action: function (args) {
                                var array2 =[];
                                if (args.data.gateway != null && args.data.gateway.length > 0)
                                array2.push("&gateway=" + args.data.gateway);
                                if (args.data.netmask != null && args.data.netmask.length > 0)
                                array2.push("&netmask=" + args.data.netmask);
                                if (args.data.startipv4 != null && args.data.startipv4.length > 0)
                                array2.push("&startip=" + args.data.startipv4);
                                if (args.data.endipv4 != null && args.data.endipv4.length > 0)
                                array2.push("&endip=" + args.data.endipv4);
                                if (args.data.ip6cidr != null && args.data.ip6cidr.length > 0)
                                array2.push("&ip6cidr=" + args.data.ip6cidr);
                                if (args.data.ip6gateway != null && args.data.ip6gateway.length > 0)
                                array2.push("&ip6gateway=" + args.data.ip6gateway);
                                if (args.data.startipv6 != null && args.data.startipv6.length > 0)
                                array2.push("&startipv6=" + args.data.startipv6);
                                if (args.data.endipv6 != null && args.data.endipv6.length > 0)
                                array2.push("&endipv6=" + args.data.endipv6);
                                $.ajax({
                                    url: createURL("createVlanIpRange&forVirtualNetwork=false&networkid=" + args.context.networks[0].id + array2.join("")),
                                    dataType: "json",
                                    success: function (json) {
                                        var item = json.createvlaniprangeresponse.vlan;
                                        args.response.success({
                                            data: item
                                        });
                                    },
                                    error: function (XMLHttpResponse) {
                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                        args.response.error(errorMsg);
                                    }
                                });
                            },
                            notification: {
                                poll: function (args) {
                                    args.complete();
                                }
                            },
                            messages: {
                                notification: function (args) {
                                    return 'label.add.ip.range';
                                }
                            }
                        },
                        'remove': {
                            label: 'label.remove.ip.range',
                            messages: {
                                confirm: function (args) {
                                    return 'message.confirm.remove.IP.range';
                                },
                                notification: function (args) {
                                    return 'label.remove.ip.range';
                                }
                            },
                            action: function (args) {
                                $.ajax({
                                    url: createURL("deleteVlanIpRange&id=" + args.data.id),
                                    dataType: "json",
                                    async: true,
                                    success: function (json) {
                                        args.response.success({
                                            data: {
                                            }
                                        });
                                    },
                                    error: function (json) {
                                        args.response.error(parseXMLHttpResponse(json));
                                    }
                                });
                            },
                            notification: {
                                poll: function (args) {
                                    args.complete();
                                }
                            }
                        }
                    }
                }
            }
        }
    };
    function addBaremetalDhcpDeviceFn(args) {
        if (nspMap[ "BaremetalDhcpProvider"] == null) {
            $.ajax({
                url: createURL("addNetworkServiceProvider&name=BaremetalDhcpProvider&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                dataType: "json",
                async: true,
                success: function (json) {
                    var jobId = json.addnetworkserviceproviderresponse.jobid;
                    var addBaremetalDhcpProviderIntervalID = setInterval(function () {
                        $.ajax({
                            url: createURL("queryAsyncJobResult&jobId=" + jobId),
                            dataType: "json",
                            success: function (json) {
                                var result = json.queryasyncjobresultresponse;
                                if (result.jobstatus == 0) {
                                    return; //Job has not completed
                                } else {
                                    clearInterval(addBaremetalDhcpProviderIntervalID);
                                    if (result.jobstatus == 1) {
                                        nspMap[ "BaremetalDhcpProvider"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                        $.ajax({
                                            url: createURL('addBaremetalDhcp'),
                                            data: {
                                                physicalnetworkid: selectedPhysicalNetworkObj.id,
                                                dhcpservertype: 'DHCPD',
                                                url: args.data.url,
                                                username: args.data.username,
                                                password: args.data.password
                                            },
                                            type: "POST",
                                            success: function (json) {
                                                var jid = json.addbaremetaldhcpresponse.jobid;
                                                args.response.success({
                                                    _custom: {
                                                        jobId: jid,
                                                        getUpdatedItem: function (json) {
                                                            var item = json.queryasyncjobresultresponse.jobresult.baremetaldhcp;
                                                            return item;
                                                        }
                                                    }
                                                });
                                            }
                                        });
                                    } else if (result.jobstatus == 2) {
                                        alert(_s(result.jobresult.errortext));
                                    }
                                }
                            },
                            error: function (XMLHttpResponse) {
                                alert(parseXMLHttpResponse(XMLHttpResponse));
                            }
                        });
                    },
                    g_queryAsyncJobResultInterval);
                }
            });
        } else {
            $.ajax({
                url: createURL('addBaremetalDhcp'),
                data: {
                    physicalnetworkid: selectedPhysicalNetworkObj.id,
                    dhcpservertype: 'DHCPD',
                    url: args.data.url,
                    username: args.data.username,
                    password: args.data.password
                },
                type: "POST",
                success: function (json) {
                    var jid = json.addbaremetaldhcpresponse.jobid;
                    args.response.success({
                        _custom: {
                            jobId: jid,
                            getUpdatedItem: function (json) {
                                var item = json.queryasyncjobresultresponse.jobresult.baremetaldhcp;
                                return item;
                            }
                        }
                    });
                }
            });
        }
    }
    function addBaremetalPxeDeviceFn(args) {
        if (nspMap[ "BaremetalPxeProvider"] == null) {
            $.ajax({
                url: createURL("addNetworkServiceProvider&name=BaremetalPxeProvider&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                dataType: "json",
                async: true,
                success: function (json) {
                    var jobId = json.addnetworkserviceproviderresponse.jobid;
                    var addBaremetalPxeProviderIntervalID = setInterval(function () {
                        $.ajax({
                            url: createURL("queryAsyncJobResult&jobId=" + jobId),
                            dataType: "json",
                            success: function (json) {
                                var result = json.queryasyncjobresultresponse;
                                if (result.jobstatus == 0) {
                                    return; //Job has not completed
                                } else {
                                    clearInterval(addBaremetalPxeProviderIntervalID);
                                    if (result.jobstatus == 1) {
                                        nspMap[ "BaremetalPxeProvider"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                        $.ajax({
                                            url: createURL('addBaremetalPxeKickStartServer'),
                                            data: {
                                                physicalnetworkid: selectedPhysicalNetworkObj.id,
                                                pxeservertype: 'KICK_START',
                                                url: args.data.url,
                                                username: args.data.username,
                                                password: args.data.password,
                                                tftpdir: args.data.tftpdir
                                            },
                                            type: "POST",
                                            success: function (json) {
                                                var jid = json.addbaremetalpxeresponse.jobid;
                                                args.response.success({
                                                    _custom: {
                                                        jobId: jid,
                                                        getUpdatedItem: function (json) {
                                                            var item = json.queryasyncjobresultresponse.jobresult.baremetalpxeserver;
                                                            return item;
                                                        }
                                                    }
                                                });
                                            }
                                        });
                                    } else if (result.jobstatus == 2) {
                                        alert(_s(result.jobresult.errortext));
                                    }
                                }
                            },
                            error: function (XMLHttpResponse) {
                                alert(parseXMLHttpResponse(XMLHttpResponse));
                            }
                        });
                    },
                    g_queryAsyncJobResultInterval);
                }
            });
        } else {
            $.ajax({
                url: createURL('addBaremetalPxeKickStartServer'),
                data: {
                    physicalnetworkid: selectedPhysicalNetworkObj.id,
                    pxeservertype: 'KICK_START',
                    url: args.data.url,
                    username: args.data.username,
                    password: args.data.password,
                    tftpdir: args.data.tftpdir
                },
                type: "POST",
                success: function (json) {
                    var jid = json.addbaremetalpxeresponse.jobid;
                    args.response.success({
                        _custom: {
                            jobId: jid,
                            getUpdatedItem: function (json) {
                                var item = json.queryasyncjobresultresponse.jobresult.baremetalpxeserver;
                                return item;
                            }
                        }
                    });
                }
            });
        }
    }
    // Inject cloudStack infra page
    cloudStack.sections.system.show = cloudStack.uiCustom.physicalResources(cloudStack.sections.system.physicalResourceSection);
    function addExternalLoadBalancer(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
        var array1 =[];
        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.username, args.data.password);
        array1.push("&networkdevicetype=" + encodeURIComponent(args.data.networkdevicetype));
        if (apiCmd == "addNetscalerLoadBalancer") {
            array1.push("&gslbprovider=" + (args.data.gslbprovider == "on"));
            array1.push("&gslbproviderpublicip=" + encodeURIComponent(args.data.gslbproviderpublicip));
            array1.push("&gslbproviderprivateip=" + encodeURIComponent(args.data.gslbproviderprivateip));
        }
        //construct URL starts here
        var url =[];
        var ip = args.data.ip;
        url.push("https://" + ip);
        var isQuestionMarkAdded = false;
        var publicInterface = args.data.publicinterface;
        if (publicInterface != null && publicInterface.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("publicinterface=" + publicInterface);
        }
        var privateInterface = args.data.privateinterface;
        if (privateInterface != null && privateInterface.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("privateinterface=" + privateInterface);
        }
        var numretries = args.data.numretries;
        if (numretries != null && numretries.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("numretries=" + numretries);
        }
        var isInline = args.data.inline;
        if (isInline != null && isInline.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("inline=" + isInline);
        }
        var capacity = args.data.capacity;
        if (capacity != null && capacity.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("lbdevicecapacity=" + capacity);
        }
        var dedicated = (args.data.dedicated == "on");
        //boolean    (true/false)
        if (isQuestionMarkAdded == false) {
            url.push("?");
            isQuestionMarkAdded = true;
        } else {
            url.push("&");
        }
        url.push("lbdevicededicated=" + dedicated.toString());
        array1.push("&url=" + encodeURIComponent(url.join("")));
        //construct URL ends here
        $.ajax({
            url: createURL(apiCmd + array1.join("")),
            dataType: "json",
            type: "POST",
            success: function (json) {
                var jid = json[apiCmdRes].jobid;
                args.response.success({
                    _custom: {
                        jobId: jid,
                        getUpdatedItem: function (json) {
                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
                            return item;
                        }
                    }
                });
            }
        });
    }
    function addExternalFirewall(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
        var array1 =[];
        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.username, args.data.password); 
        array1.push("&networkdevicetype=" + encodeURIComponent(args.data.networkdevicetype));
        //construct URL starts here
        var url =[];
        var ip = args.data.ip;
        url.push("https://" + ip);
        var isQuestionMarkAdded = false;
        var publicInterface = args.data.publicinterface;
        if (publicInterface != null && publicInterface.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("publicinterface=" + publicInterface);
        }
        var privateInterface = args.data.privateinterface;
        if (privateInterface != null && privateInterface.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("privateinterface=" + privateInterface);
        }
        var usageInterface = args.data.usageinterface;
        if (usageInterface != null && usageInterface.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("usageinterface=" + usageInterface);
        }
        var numretries = args.data.numretries;
        if (numretries != null && numretries.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("numretries=" + numretries);
        }
        var timeout = args.data.timeout;
        if (timeout != null && timeout.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("timeout=" + timeout);
        }
        var isInline = args.data.inline;
        if (isInline != null && isInline.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("inline=" + isInline);
        }
        var publicNetwork = args.data.publicnetwork;
        if (publicNetwork != null && publicNetwork.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("publicnetwork=" + publicNetwork);
        }
        var privateNetwork = args.data.privatenetwork;
        if (privateNetwork != null && privateNetwork.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("privatenetwork=" + privateNetwork);
        }
        var capacity = args.data.capacity;
        if (capacity != null && capacity.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("fwdevicecapacity=" + capacity);
        }
        var dedicated = (args.data.dedicated == "on");
        //boolean    (true/false)
        if (isQuestionMarkAdded == false) {
            url.push("?");
            isQuestionMarkAdded = true;
        } else {
            url.push("&");
        }
        url.push("fwdevicededicated=" + dedicated.toString());
        // START - Palo Alto Specific Fields
        var externalVirtualRouter = args.data.pavr;
        if (externalVirtualRouter != null && externalVirtualRouter.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("pavr=" + encodeURIComponent(externalVirtualRouter));
        }
        var externalThreatProfile = args.data.patp;
        if (externalThreatProfile != null && externalThreatProfile.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("patp=" + encodeURIComponent(externalThreatProfile));
        }
        var externalLogProfile = args.data.palp;
        if (externalLogProfile != null && externalLogProfile.length > 0) {
            if (isQuestionMarkAdded == false) {
                url.push("?");
                isQuestionMarkAdded = true;
            } else {
                url.push("&");
            }
            url.push("palp=" + encodeURIComponent(externalLogProfile));
        }
        // END - Palo Alto Specific Fields
        array1.push("&url=" + encodeURIComponent(url.join("")));
        //construct URL ends here
        $.ajax({
            url: createURL(apiCmd + array1.join("")),
            dataType: "json",
            type: "POST",
            success: function (json) {
                var jid = json[apiCmdRes].jobid;
                args.response.success({
                    _custom: {
                        jobId: jid,
                        getUpdatedItem: function (json) {
                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
                            return item;
                        }
                    }
                });
            }
        });
    }
    function addNiciraNvpDevice(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
        var array1 =[];
        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, rgs.data.username, args.data.password);
        array1.push("&hostname=" + encodeURIComponent(args.data.host));
        array1.push("&transportzoneuuid=" + encodeURIComponent(args.data.transportzoneuuid));
        var l3GatewayServiceUuid = args.data.l3gatewayserviceuuid;
        if (l3GatewayServiceUuid != null && l3GatewayServiceUuid.length > 0) {
            array1.push("&l3gatewayserviceuuid=" + encodeURIComponent(args.data.l3gatewayserviceuuid));
        }
		
		var l2GatewayServiceUuid = args.data.l2gatewayserviceuuid;
        if (l2GatewayServiceUuid != null && l2GatewayServiceUuid.length > 0) {
            array1.push("&l2gatewayserviceuuid=" + encodeURIComponent(args.data.l2gatewayserviceuuid));
        }
        $.ajax({
            url: createURL(apiCmd + array1.join("")),
            dataType: "json",
            type: "POST",
            success: function (json) {
                var jid = json[apiCmdRes].jobid;
                args.response.success({
                    _custom: {
                        jobId: jid,
                        getUpdatedItem: function (json) {
                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
                            return item;
                        }
                    }
                });
            }
        });
    }
    function addBrocadeVcsDevice(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
        var array1 =[];
        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.username, args.data.password);
        array1.push("&hostname=" + encodeURIComponent(args.data.host));
        $.ajax({
            url: createURL(apiCmd + array1.join("")),
            dataType: "json",
            type: "POST",
            success: function (json) {
                var jid = json[apiCmdRes].jobid;
                args.response.success({
                    _custom: {
                        jobId: jid,
                        getUpdatedItem: function (json) {
                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
                            return item;
                        }
                    }
                });
            }
        });
    }
    function addOpenDaylightController(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
        var array1 =[];
        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.username, args.data.password);
        array1.push("&url=" + encodeURIComponent(args.data.url));
        $.ajax({
            url: createURL(apiCmd + array1.join("")),
            dataType: "json",
            type: "POST",
            success: function (json) {
                var jid = json[apiCmdRes].jobid;
                args.response.success({
                    _custom: {
                        jobId: jid,
                        getUpdatedItem: function (json) {
                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
                            return item;
                        }
                    }
                });
            }
        });
    }
    function addBigSwitchBcfDevice(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
        var array1 =[];
        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
        array1.push("&hostname=" + encodeURIComponent(args.data.host));
        array1.push("&username=" + encodeURIComponent(args.data.username));
        cloudStack.addPasswordToCommandUrlParameterArray(array1, args.data.password);
        array1.push("&nat=" + (args.data.nat == 'on' ? "true": "false"));
        $.ajax({
            url: createURL(apiCmd + array1.join("")),
            dataType: "json",
            success: function (json) {
                var jid = json[apiCmdRes].jobid;
                args.response.success({
                    _custom: {
                        jobId: jid,
                        getUpdatedItem: function (json) {
                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
                            return item;
                        }
                    }
                });
            }
        });
    }
    function addNuageVspDevice(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
        var array1 = [];
        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
        array1.push("&hostname=" + encodeURIComponent(args.data.hostname));
        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.username, args.data.password);
        array1.push("&port=" + encodeURIComponent(args.data.port));
        array1.push("&apiversion=" + encodeURIComponent(args.data.apiversion));
        array1.push("&retrycount=" + encodeURIComponent(args.data.retrycount));
        array1.push("&retryinterval=" + encodeURIComponent(args.data.retryinterval));
        $.ajax({
            url: createURL(apiCmd + array1.join("")),
            dataType: "json",
            type: "POST",
            success: function(json) {
                var jid = json[apiCmdRes].jobid;
                args.response.success({
                    _custom: {
                        jobId: jid,
                        getUpdatedItem: function(json) {
                            var item = json.queryasyncjobresultresponse.jobresult[apiCmdObj];
                            return item;
                        }
                    }
                });
            }
        });
    }
    function addGloboDnsHost(args, physicalNetworkObj, apiCmd, apiCmdRes) {
        var array1 = [];
        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
        cloudStack.addUsernameAndPasswordToCommandUrlParameterArrayIfItIsNotNullAndNotEmpty(array1, args.data.username, args.data.password);
        array1.push("&url=" + encodeURIComponent(args.data.url));
        $.ajax({
            url: createURL(apiCmd + array1.join("")),
            dataType: "json",
            type: "POST",
            success: function(json) {
                var jid = json[apiCmdRes].jobid;
                args.response.success({
                    _custom: {
                        jobId: jid
                    }
                });
            }
        });
    }
    var afterCreateZonePhysicalNetworkTrafficTypes = function (args, newZoneObj, newPhysicalnetwork) {
                $.ajax({
            url: createURL("updatePhysicalNetwork&state=Enabled&id=" + newPhysicalnetwork.id),
            dataType: "json",
            success: function (json) {
                var jobId = json.updatephysicalnetworkresponse.jobid;
                var enablePhysicalNetworkIntervalID = setInterval(function () {
                    $.ajax({
                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
                        dataType: "json",
                        success: function (json) {
                            var result = json.queryasyncjobresultresponse;
                            if (result.jobstatus == 0) {
                                return; //Job has not completed
                            } else {
                                clearInterval(enablePhysicalNetworkIntervalID);
                                if (result.jobstatus == 1) {
                                    //alert("updatePhysicalNetwork succeeded.");
                                    // get network service provider ID of Virtual Router
                                    var virtualRouterProviderId;
                                    $.ajax({
                                        url: createURL("listNetworkServiceProviders&name=VirtualRouter&physicalNetworkId=" + newPhysicalnetwork.id),
                                        dataType: "json",
                                        async: false,
                                        success: function (json) {
                                            var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
                                            if (items != null && items.length > 0) {
                                                virtualRouterProviderId = items[0].id;
                                            }
                                        }
                                    });
                                    if (virtualRouterProviderId == null) {
                                        alert("error: listNetworkServiceProviders API doesn't return VirtualRouter provider ID");
                                        return;
                                    }
                                    var virtualRouterElementId;
                                    $.ajax({
                                        url: createURL("listVirtualRouterElements&nspid=" + virtualRouterProviderId),
                                        dataType: "json",
                                        async: false,
                                        success: function (json) {
                                            var items = json.listvirtualrouterelementsresponse.virtualrouterelement;
                                            if (items != null && items.length > 0) {
                                                virtualRouterElementId = items[0].id;
                                            }
                                        }
                                    });
                                    if (virtualRouterElementId == null) {
                                        alert("error: listVirtualRouterElements API doesn't return Virtual Router Element Id");
                                        return;
                                    }
                                    $.ajax({
                                        url: createURL("configureVirtualRouterElement&enabled=true&id=" + virtualRouterElementId),
                                        dataType: "json",
                                        async: false,
                                        success: function (json) {
                                            var jobId = json.configurevirtualrouterelementresponse.jobid;
                                            var enableVirtualRouterElementIntervalID = setInterval(function () {
                                                $.ajax({
                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
                                                    dataType: "json",
                                                    success: function (json) {
                                                        var result = json.queryasyncjobresultresponse;
                                                        if (result.jobstatus == 0) {
                                                            return; //Job has not completed
                                                        } else {
                                                            clearInterval(enableVirtualRouterElementIntervalID);
                                                            if (result.jobstatus == 1) {
                                                                //alert("configureVirtualRouterElement succeeded.");
                                                                $.ajax({
                                                                    url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + virtualRouterProviderId),
                                                                    dataType: "json",
                                                                    async: false,
                                                                    success: function (json) {
                                                                        var jobId = json.updatenetworkserviceproviderresponse.jobid;
                                                                        var enableVirtualRouterProviderIntervalID = setInterval(function () {
                                                                            $.ajax({
                                                                                url: createURL("queryAsyncJobResult&jobId=" + jobId),
                                                                                dataType: "json",
                                                                                success: function (json) {
                                                                                    var result = json.queryasyncjobresultresponse;
                                                                                    if (result.jobstatus == 0) {
                                                                                        return; //Job has not completed
                                                                                    } else {
                                                                                        clearInterval(enableVirtualRouterProviderIntervalID);
                                                                                        if (result.jobstatus == 1) {
                                                                                            //alert("Virtual Router Provider is enabled");
                                                                                            if (newZoneObj.networktype == "Basic") {
                                                                                                if (args.data[ "security-groups-enabled"] == "on") {
                                                                                                    //need to Enable security group provider first
                                                                                                    // get network service provider ID of Security Group
                                                                                                    var securityGroupProviderId;
                                                                                                    $.ajax({
                                                                                                        url: createURL("listNetworkServiceProviders&name=SecurityGroupProvider&physicalNetworkId=" + newPhysicalnetwork.id),
                                                                                                        dataType: "json",
                                                                                                        async: false,
                                                                                                        success: function (json) {
                                                                                                            var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
                                                                                                            if (items != null && items.length > 0) {
                                                                                                                securityGroupProviderId = items[0].id;
                                                                                                            }
                                                                                                        }
                                                                                                    });
                                                                                                    if (securityGroupProviderId == null) {
                                                                                                        alert("error: listNetworkServiceProviders API doesn't return security group provider ID");
                                                                                                        return;
                                                                                                    }
                                                                                                    $.ajax({
                                                                                                        url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + securityGroupProviderId),
                                                                                                        dataType: "json",
                                                                                                        async: false,
                                                                                                        success: function (json) {
                                                                                                            var jobId = json.updatenetworkserviceproviderresponse.jobid;
                                                                                                            var enableSecurityGroupProviderIntervalID = setInterval(function () {
                                                                                                                $.ajax({
                                                                                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
                                                                                                                    dataType: "json",
                                                                                                                    success: function (json) {
                                                                                                                        var result = json.queryasyncjobresultresponse;
                                                                                                                        if (result.jobstatus == 0) {
                                                                                                                            return; //Job has not completed
                                                                                                                        } else {
                                                                                                                            clearInterval(enableSecurityGroupProviderIntervalID);
                                                                                                                            if (result.jobstatus == 1) {
                                                                                                                                //alert("Security group provider is enabled");
                                                                                                                                //create network (for basic zone only)
                                                                                                                                var array2 =[];
                                                                                                                                array2.push("&zoneid=" + newZoneObj.id);
                                                                                                                                array2.push("&name=guestNetworkForBasicZone");
                                                                                                                                array2.push("&displaytext=guestNetworkForBasicZone");
                                                                                                                                array2.push("&networkofferingid=" + args.data.networkOfferingId);
                                                                                                                                $.ajax({
                                                                                                                                    url: createURL("createNetwork" + array2.join("")),
                                                                                                                                    dataType: "json",
                                                                                                                                    async: false,
                                                                                                                                    success: function (json) {
                                                                                                                                        var arrayOfParameters = cloudStack.createArrayOfParametersForCreatePodCommand(newZoneObj.id, args.data);
                                                                                                                                        $.ajax({
                                                                                                                                            url: createURL("createPod" + arrayOfParameters.join("")),
                                                                                                                                            dataType: "json",
                                                                                                                                            async: false,
                                                                                                                                            success: function (json) {
                                                                                                                                            },
                                                                                                                                            error: function (XMLHttpResponse) {
                                                                                                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                                                                                                                alert("createPod failed. Error: " + errorMsg);
                                                                                                                                            }
                                                                                                                                        });
                                                                                                                                    }
                                                                                                                                });
                                                                                                                            } else if (result.jobstatus == 2) {
                                                                                                                                alert("failed to enable security group provider. Error: " + _s(result.jobresult.errortext));
                                                                                                                            }
                                                                                                                        }
                                                                                                                    },
                                                                                                                    error: function (XMLHttpResponse) {
                                                                                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                                                                                        alert("updateNetworkServiceProvider failed. Error: " + errorMsg);
                                                                                                                    }
                                                                                                                });
                                                                                                            },
                                                                                                            g_queryAsyncJobResultInterval);
                                                                                                        }
                                                                                                    });
                                                                                                } else {
                                                                                                    //create network (for basic zone only)
                                                                                                    var array2 =[];
                                                                                                    array2.push("&zoneid=" + newZoneObj.id);
                                                                                                    array2.push("&name=guestNetworkForBasicZone");
                                                                                                    array2.push("&displaytext=guestNetworkForBasicZone");
                                                                                                    array2.push("&networkofferingid=" + args.data.networkOfferingId);
                                                                                                    $.ajax({
                                                                                                        url: createURL("createNetwork" + array2.join("")),
                                                                                                        dataType: "json",
                                                                                                        async: false,
                                                                                                        success: function (json) {
                                                                                                            var arrayOfParameters = cloudStack.createArrayOfParametersForCreatePodCommand(newZoneObj.id, args.data);
                                                                                                            $.ajax({
                                                                                                                url: createURL("createPod" + arrayOfParameters.join("")),
                                                                                                                dataType: "json",
                                                                                                                async: false,
                                                                                                                success: function (json) {
                                                                                                                },
                                                                                                                error: function (XMLHttpResponse) {
                                                                                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                                                                                    alert("createPod failed. Error: " + errorMsg);
                                                                                                                }
                                                                                                            });
                                                                                                        }
                                                                                                    });
                                                                                                }
                                                                                            } else {
                                                                                                var arrayOfParameters = cloudStack.createArrayOfParametersForCreatePodCommand(newZoneObj.id, args.data);
                                                                                                $.ajax({
                                                                                                    url: createURL("createPod" + arrayOfParameters.join("")),
                                                                                                    dataType: "json",
                                                                                                    async: false,
                                                                                                    success: function (json) {
                                                                                                    },
                                                                                                    error: function (XMLHttpResponse) {
                                                                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                                                                        alert("createPod failed. Error: " + errorMsg);
                                                                                                    }
                                                                                                });
                                                                                            }
                                                                                        } else if (result.jobstatus == 2) {
                                                                                            alert("failed to enable Virtual Router Provider. Error: " + _s(result.jobresult.errortext));
                                                                                        }
                                                                                    }
                                                                                },
                                                                                error: function (XMLHttpResponse) {
                                                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                                                    alert("updateNetworkServiceProvider failed. Error: " + errorMsg);
                                                                                }
                                                                            });
                                                                        },
                                                                        g_queryAsyncJobResultInterval);
                                                                    }
                                                                });
                                                            } else if (result.jobstatus == 2) {
                                                                alert("configureVirtualRouterElement failed. Error: " + _s(result.jobresult.errortext));
                                                            }
                                                        }
                                                    },
                                                    error: function (XMLHttpResponse) {
                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                        alert("configureVirtualRouterElement failed. Error: " + errorMsg);
                                                    }
                                                });
                                            },
                                            g_queryAsyncJobResultInterval);
                                        }
                                    });
                                } else if (result.jobstatus == 2) {
                                    alert("updatePhysicalNetwork failed. Error: " + _s(result.jobresult.errortext));
                                }
                            }
                        },
                        error: function (XMLHttpResponse) {
                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                            alert("updatePhysicalNetwork failed. Error: " + errorMsg);
                        }
                    });
                },
                g_queryAsyncJobResultInterval);
            }
        });
    };
    //action filters (begin)
    var zoneActionfilter = cloudStack.actionFilter.zoneActionfilter = function (args) {
        var jsonObj = args.context.item;
        var allowedActions =[ 'enableSwift'];
        if (jsonObj.vmwaredcId == null)
        allowedActions.push('addVmwareDc'); else
        allowedActions.push('removeVmwareDc');
        if (jsonObj.domainid != null)
        allowedActions.push("releaseDedicatedZone"); else
        allowedActions.push("dedicateZone");
        allowedActions.push("edit");
        if (jsonObj.allocationstate == "Disabled")
        allowedActions.push("enable"); else if (jsonObj.allocationstate == "Enabled")
        allowedActions.push("disable");
        allowedActions.push("remove");
        if (jsonObj.hasOwnProperty('resourcedetails') && jsonObj['resourcedetails'].hasOwnProperty('outOfBandManagementEnabled') && jsonObj['resourcedetails']['outOfBandManagementEnabled'] == 'false') {
            allowedActions.push("enableOutOfBandManagement");
        } else {
            allowedActions.push("disableOutOfBandManagement");
        }
        if (jsonObj.hasOwnProperty('resourcedetails') && jsonObj['resourcedetails'].hasOwnProperty('resourceHAEnabled') && jsonObj['resourcedetails']['resourceHAEnabled'] == 'false') {
            allowedActions.push("enableHA");
        } else {
            allowedActions.push("disableHA");
        }
        return allowedActions;
    }
    var nexusActionfilter = function (args) {
        var nexusObj = args.context.item;
        var allowedActions =[];
        allowedActions.push("edit");
        if (nexusObj.vsmdevicestate == "Disabled")
        allowedActions.push("enable"); else if (nexusObj.vsmdevicestate == "Enabled")
        allowedActions.push("disable");
        allowedActions.push("remove");
        return allowedActions;
    }
    var podActionfilter = function (args) {
        var podObj = args.context.item;
        var dedicatedPodObj = args.context.podItem;
        var allowedActions =[];
        if (podObj.domainid != null)
        allowedActions.push("release"); else
        allowedActions.push("dedicate");
        allowedActions.push("edit");
        if (podObj.allocationstate == "Disabled")
        allowedActions.push("enable"); else if (podObj.allocationstate == "Enabled")
        allowedActions.push("disable");
        allowedActions.push("remove");
        /*
        var selectedZoneObj;
        $(zoneObjs).each(function(){
        if(this.id == podObj.zoneid) {
        selectedZoneObj = this;
        return false;  //break the $.each() loop
        }
        });
         */
        if (selectedZoneObj.networktype == "Basic") {
            //basic-mode network (pod-wide VLAN)
            //$("#tab_ipallocation, #add_iprange_button, #tab_network_device, #add_network_device_button").show();
            allowedActions.push("addIpRange");
            allowedActions.push("addNetworkDevice");
        } else if (selectedZoneObj.networktype == "Advanced") {
            //advanced-mode network (zone-wide VLAN)
            //$("#tab_ipallocation, #add_iprange_button, #tab_network_device, #add_network_device_button").hide();
        }
        return allowedActions;
    }
    var networkDeviceActionfilter = function (args) {
        var jsonObj = args.context.item;
        var allowedActions =[];
        return allowedActions;
    }
    var clusterActionfilter = function (args) {
        var jsonObj = args.context.item;
        var allowedActions =[];
        if (jsonObj.domainid != null)
        allowedActions.push("release"); else
        allowedActions.push("dedicate");
        if (jsonObj.state == "Enabled") {
            //managed, allocation enabled
            allowedActions.push("unmanage");
            allowedActions.push("disable");
            //allowedActions.push("edit"); // No fields to edit
        } else if (jsonObj.state == "Disabled") {
            //managed, allocation disabled
            allowedActions.push("unmanage");
            allowedActions.push("enable");
            //allowedActions.push("edit"); // No fields to edit
        } else {
            //Unmanaged, PrepareUnmanaged , PrepareUnmanagedError
            allowedActions.push("manage");
        }
        allowedActions.push("remove");
        if (jsonObj.hasOwnProperty('resourcedetails') && jsonObj['resourcedetails'].hasOwnProperty('outOfBandManagementEnabled') && jsonObj['resourcedetails']['outOfBandManagementEnabled'] == 'false') {
            allowedActions.push("enableOutOfBandManagement");
        } else {
            allowedActions.push("disableOutOfBandManagement");
        }
        if (jsonObj.hasOwnProperty('resourcedetails') && jsonObj['resourcedetails'].hasOwnProperty('resourceHAEnabled') && jsonObj['resourcedetails']['resourceHAEnabled'] == 'false') {
            allowedActions.push("enableHA");
        } else {
            allowedActions.push("disableHA");
        }
        return allowedActions;
    }
    var hostActionfilter = function (args) {
        var jsonObj = args.context.item;
        var allowedActions =[];
        if (jsonObj.domainid != null)
        allowedActions.push("release"); else
        allowedActions.push("dedicate");
        if (jsonObj.resourcestate == "Enabled") {
            allowedActions.push("edit");
            allowedActions.push("enableMaintenanceMode");
            allowedActions.push("disable");
            if (jsonObj.state != "Disconnected")
            allowedActions.push("forceReconnect");
            if (jsonObj.hypervisor == "KVM") {
                allowedActions.push("secureKVMHost");
            }
        } else if (jsonObj.resourcestate == "ErrorInMaintenance") {
            allowedActions.push("edit");
            allowedActions.push("enableMaintenanceMode");
            allowedActions.push("cancelMaintenanceMode");
        } else if (jsonObj.resourcestate == "PrepareForMaintenance") {
            allowedActions.push("edit");
            allowedActions.push("cancelMaintenanceMode");
        } else if (jsonObj.resourcestate == "Maintenance") {
            allowedActions.push("edit");
            allowedActions.push("cancelMaintenanceMode");
            allowedActions.push("remove");
        } else if (jsonObj.resourcestate == "Disabled") {
            allowedActions.push("edit");
            allowedActions.push("enable");
            allowedActions.push("remove");
        }
        allowedActions.push("blankHAForHost");
        allowedActions.push("configureHAForHost");
        if (jsonObj.hasOwnProperty("hostha") && jsonObj.hostha.haenable) {
            allowedActions.push("disableHA");
        } else {
            allowedActions.push("enableHA");
        }
        allowedActions.push("blankOutOfBandManagement");
        allowedActions.push("configureOutOfBandManagement");
        if (jsonObj.hasOwnProperty("outofbandmanagement") && jsonObj.outofbandmanagement.enabled) {
            allowedActions.push("issueOutOfBandManagementPowerAction");
            allowedActions.push("changeOutOfBandManagementPassword");
            allowedActions.push("disableOutOfBandManagement");
        } else {
            allowedActions.push("enableOutOfBandManagement");
        }
        if ((jsonObj.state == "Down" || jsonObj.state == "Alert" || jsonObj.state == "Disconnected") && ($.inArray("remove", allowedActions) == -1)) {
            allowedActions.push("remove");
        }
        return allowedActions;
    }
    var primarystorageActionfilter = function (args) {
        var jsonObj = args.context.item;
        var allowedActions =[];
        allowedActions.push("edit");
        if (jsonObj.state == 'Up' || jsonObj.state == "Connecting") {
            allowedActions.push("enableMaintenanceMode");
        } else if (jsonObj.state == 'Down') {
            allowedActions.push("enableMaintenanceMode");
            allowedActions.push("remove");
        } else if (jsonObj.state == "Alert") {
            allowedActions.push("remove");
        } else if (jsonObj.state == "ErrorInMaintenance") {
            allowedActions.push("enableMaintenanceMode");
            allowedActions.push("cancelMaintenanceMode");
        } else if (jsonObj.state == "PrepareForMaintenance") {
            allowedActions.push("cancelMaintenanceMode");
        } else if (jsonObj.state == "Maintenance") {
            allowedActions.push("cancelMaintenanceMode");
            allowedActions.push("remove");
        } else if (jsonObj.state == "Disconnected") {
            allowedActions.push("remove");
        }
        return allowedActions;
    }
    var secondarystorageActionfilter = function (args) {
        var jsonObj = args.context.item;
        var allowedActions = [];
        allowedActions.push("remove");
        return allowedActions;
    }
    var routerActionfilter = cloudStack.sections.system.routerActionFilter = function (args) {
        var jsonObj = args.context.item;
        var allowedActions =[];
        if (jsonObj.requiresupgrade == true) {
            allowedActions.push('upgradeRouterToUseNewerTemplate');
        }
        if (jsonObj.state == 'Running') {
            allowedActions.push("stop");
            //when router is Running, only VMware support scaleUp(change service offering)
            if (jsonObj.hypervisor == "VMware") {
                allowedActions.push("scaleUp");
            }
            allowedActions.push("restart");
            allowedActions.push("remove");
            allowedActions.push("viewConsole");
            if (isAdmin())
            allowedActions.push("migrate");
        } else if (jsonObj.state == 'Stopped') {
            allowedActions.push("start");
            //when router is Stopped, all hypervisors support scaleUp(change service offering)
            allowedActions.push("scaleUp");
            allowedActions.push("remove");
        }
        return allowedActions;
    }
    var internallbinstanceActionfilter = function (args) {
        var jsonObj = args.context.item;
        var allowedActions =[];
        if (jsonObj.state == 'Running') {
            allowedActions.push("stop");
            allowedActions.push("viewConsole");
            if (isAdmin())
            allowedActions.push("migrate");
        } else if (jsonObj.state == 'Stopped') {
            allowedActions.push("start");
        }
        return allowedActions;
    }
    var systemvmActionfilter = function (args) {
        var jsonObj = args.context.item;
        var allowedActions =[];
        if (jsonObj.state == 'Running') {
            allowedActions.push("stop");
            allowedActions.push("restart");
            allowedActions.push("remove");
            //when systemvm is Running, only VMware support scaleUp(change service offering)
            if (jsonObj.hypervisor == "VMware") {
                allowedActions.push("scaleUp");
            }
            allowedActions.push("viewConsole");
            if (isAdmin())
            allowedActions.push("migrate");
        } else if (jsonObj.state == 'Stopped') {
            allowedActions.push("start");
            //when systemvm is Stopped, all hypervisors support scaleUp(change service offering)
            allowedActions.push("scaleUp");
            allowedActions.push("remove");
        } else if (jsonObj.state == 'Error') {
            allowedActions.push("remove");
        }
        return allowedActions;
    }
    var routerGroupActionfilter = function (args) {
        var jsonObj = args.context.item;
        var allowedActions =[];
        if (jsonObj.routerRequiresUpgrade > 0) {
            allowedActions.push("upgradeRouterToUseNewerTemplate");
        }
        return allowedActions;
    }
    var bladeActionfilter = function (args) {
        var jsonObj = args.context.item;
        var allowedActions =[];
        if (jsonObj.profiledn == null) {
            allowedActions.push("associateTemplateToBlade");
        } else {
            allowedActions.push("disassociateProfileFromBlade");
        }
        return allowedActions;
    }
    //action filters (end)
    var networkProviderActionFilter = function (id) {
        return function (args) {
            var allowedActions =[];
            var jsonObj = nspMap[id] ?
            nspMap[id]: {
            };
            if (id == "netscaler") {
                var netscalerControlCenter = null;
                $.ajax({
                    url: createURL("listNetscalerControlCenter"),
                    dataType: "json",
                    async: false,
                    success: function(json) {
                        var items = json.listNetscalerControlCenter.netscalercontrolcenter;
                        if (items != null && items.length > 0) {
                            netscalerControlCenter = items[0];
                        }
                    }
                });
            }
            if (netscalerControlCenter != null) {
              if (jsonObj.state == undefined) {
                        $.ajax({
                            url: createURL("addNetworkServiceProvider&name=Netscaler&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                            dataType: "json",
                            async: true,
                            success: function (json) {
                                var jobId = json.addnetworkserviceproviderresponse.jobid;
                                var addNetscalerProviderIntervalID = setInterval(function () {
                                    $.ajax({
                                        url: createURL("queryAsyncJobResult&jobId=" + jobId),
                                        dataType: "json",
                                        success: function (json) {
                                            var result = json.queryasyncjobresultresponse;
                                            if (result.jobstatus == 0) {
                                                return; //Job has not completed
                                            } else {
                                                clearInterval(addNetscalerProviderIntervalID);
                                                if (result.jobstatus == 1) {
                                                    nspMap[ "netscaler"] = result.jobresult.networkserviceprovider;
                                                    addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addNetscalerLoadBalancer", "addnetscalerloadbalancerresponse", "netscalerloadbalancer");
                                                } else if (result.jobstatus == 2) {
                                                    alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + _s(result.jobresult.errortext));
                                                }
                                            }
                                        },
                                        error: function (XMLHttpResponse) {
                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                            alert("addNetworkServiceProvider&name=Netscaler failed. Error: " + errorMsg);
                                        }
                                    });
                                },
                                g_queryAsyncJobResultInterval);
                            }
                        });
                        jsonObj.state = "Disabled";
                    }
            }
            if (jsonObj.state) {
               if (jsonObj.state == "Enabled")
                 allowedActions.push("disable"); else if (jsonObj.state == "Disabled")
                 allowedActions.push("enable");
                 allowedActions.push("destroy");
            }
            allowedActions.push('add');
            return allowedActions;
        }
    };
    var addExtraPropertiesToClusterObject = function (jsonObj) {
        if (jsonObj.managedstate == "Managed") {
            jsonObj.state = jsonObj.allocationstate; //jsonObj.state == Enabled, Disabled
        } else {
            jsonObj.state = jsonObj.managedstate; //jsonObj.state == Unmanaged, PrepareUnmanaged, PrepareUnmanagedError
        }
    }
    var addExtraPropertiesToRouterInstanceObject = function (jsonObj) {
        if (jsonObj.isredundantrouter == true) {
            jsonObj[ "redundantRouterState"] = jsonObj.redundantstate;
        } else {
            jsonObj[ "redundantRouterState"] = "";
        }
    }
    var refreshNspData = function (nspName) {
        var array1 =[];
        if (nspName != null)
        array1.push("&name=" + nspName);
        $.ajax({
            url: createURL("listNetworkServiceProviders&physicalnetworkid=" + selectedPhysicalNetworkObj.id + array1.join("")),
            dataType: "json",
            async: false,
            success: function (json) {
                nspMap = {
                };
                //reset
                var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
                if (items != null) {
                    for (var i = 0; i < items.length; i++) {
                        switch (items[i].name) {
                            case "VirtualRouter":
                            nspMap[ "virtualRouter"] = items[i];
                            break;
                            case "InternalLbVm":
                            nspMap[ "InternalLbVm"] = items[i];
                            break;
                            case "VpcVirtualRouter":
                            nspMap[ "vpcVirtualRouter"] = items[i];
                            break;
                            case "Ovs":
                                nspMap["Ovs"] = items[i];
                                break;
                            case "Netscaler":
                            nspMap[ "netscaler"] = items[i];
                            break;
                            case "BaremetalDhcpProvider":
                            nspMap[ "BaremetalDhcpProvider"] = items[i];
                            break;
                            case "BaremetalPxeProvider":
                            nspMap[ "BaremetalPxeProvider"] = items[i];
                            break;
                            case "F5BigIp":
                            nspMap[ "f5"] = items[i];
                            break;
                            case "JuniperSRX":
                            nspMap[ "srx"] = items[i];
                            break;
                            case "PaloAlto":
                            nspMap[ "pa"] = items[i];
                            break;
                            case "SecurityGroupProvider":
                            nspMap[ "securityGroups"] = items[i];
                            break;
                            case "NiciraNvp":
                            nspMap[ "niciraNvp"] = items[i];
                            break;
                            case "BrocadeVcs":
                            nspMap[ "brocadeVcs"] = items[i];
                            break;
                            case "BigSwitchBcf":
                            nspMap[ "bigswitchBcf"] = items[i];
                            break;
                            case "Ovs":
                            nspMap[ "Ovs"] = items[i];
                            break;
                            case "Opendaylight":
                            nspMap[ "Opendaylight"] = items[i];
                            break;
                            case "NuageVsp":
                            nspMap["nuageVsp"] = items[i];
                            break;
                            case "GloboDns":
                                nspMap["GloboDns"] = items[i];
                                break;
                            case "ConfigDrive":
                                nspMap["ConfigDrive"] = items[i];
                                break;
                        }
                    }
                }
            }
        });
        nspHardcodingArray =[ {
            id: 'netscaler',
            name: 'NetScaler',
            state: nspMap.netscaler ? nspMap.netscaler.state: 'Disabled'
        },
        {
            id: 'virtualRouter',
            name: 'Virtual Router',
            state: nspMap.virtualRouter ? nspMap.virtualRouter.state: 'Disabled'
        },
        {
            id: 'niciraNvp',
            name: 'Nicira Nvp',
            state: nspMap.niciraNvp ? nspMap.niciraNvp.state: 'Disabled'
        },
        {
            id: 'brocadeVcs',
            name: 'Brocade',
            state: nspMap.brocadeVcs ? nspMap.brocadeVcs.state: 'Disabled'
        },
        {
            id: 'bigswitchBcf',
            name: 'BigSwitch BCF',
            state: nspMap.bigswitchBcf ? nspMap.bigswitchBcf.state: 'Disabled'
        },
        {
            id: 'BaremetalDhcpProvider',
            name: 'Baremetal DHCP',
            state: nspMap.BaremetalDhcpProvider ? nspMap.BaremetalDhcpProvider.state: 'Disabled'
        },
        {
            id: 'BaremetalPxeProvider',
            name: 'Baremetal PXE',
            state: nspMap.BaremetalPxeProvider ? nspMap.BaremetalPxeProvider.state: 'Disabled'
        },
        {
            id: 'Opendaylight',
            name: 'OpenDaylight (Experimental)',
            state: nspMap.Opendaylight ? nspMap.Opendaylight.state: 'Disabled'
        }];
        $(window).trigger('cloudStack.system.serviceProviders.makeHarcodedArray', {
            nspHardcodingArray: nspHardcodingArray,
            selectedZoneObj: selectedZoneObj,
            selectedPhysicalNetworkObj: selectedPhysicalNetworkObj
        });
        if (selectedZoneObj.networktype == "Basic") {
            nspHardcodingArray.push({
                id: 'securityGroups',
                name: 'Security Groups',
                state: nspMap.securityGroups ? nspMap.securityGroups.state: 'Disabled'
            });
        } else if (selectedZoneObj.networktype == "Advanced") {
            nspHardcodingArray.push({
                id: 'nuageVsp',
                name: 'Nuage Vsp',
                state: nspMap.nuageVsp ? nspMap.nuageVsp.state : 'Disabled'
            });
            nspHardcodingArray.push({
                id: 'InternalLbVm',
                name: 'Internal LB VM',
                state: nspMap.InternalLbVm ? nspMap.InternalLbVm.state: 'Disabled'
            });
            nspHardcodingArray.push({
                id: 'vpcVirtualRouter',
                name: 'VPC Virtual Router',
                state: nspMap.vpcVirtualRouter ? nspMap.vpcVirtualRouter.state: 'Disabled'
            });
            nspHardcodingArray.push({
                id: 'f5',
                name: 'F5',
                state: nspMap.f5 ? nspMap.f5.state: 'Disabled'
            });
            nspHardcodingArray.push({
                id: 'srx',
                name: 'SRX',
                state: nspMap.srx ? nspMap.srx.state: 'Disabled'
            });
            nspHardcodingArray.push({
                id: 'pa',
                name: 'Palo Alto',
                state: nspMap.pa ? nspMap.pa.state: 'Disabled'
            });
            nspHardcodingArray.push({
                id: 'GloboDns',
                name: 'GloboDNS',
                state: nspMap.GloboDns ? nspMap.GloboDns.state : 'Disabled'
            });
            nspHardcodingArray.push({
                id: "ConfigDrive",
                name: "ConfigDrive",
                state: nspMap.ConfigDrive ? nspMap.ConfigDrive.state : 'Disabled'
            });
            //CLOUDSTACK-6840: OVS refers to SDN provider. However, we are not supporting SDN in this release.
            /*
            nspHardcodingArray.push({
                id: 'Ovs',
                name: 'Ovs',
                state: nspMap.Ovs ? nspMap.Ovs.state: 'Disabled'
            });
            */
        }
    };
    cloudStack.actionFilter.physicalNetwork = function (args) {
        var state = args.context.item.state;
        if (state != 'Destroyed') {
            return[ 'remove'];
        }
        return[];
    };
    function addExtraPropertiesToGroupbyObjects(groupbyObjs, groupbyId) {
        for (var i = 0; i < groupbyObjs.length; i++) {
            addExtraPropertiesToGroupbyObject(groupbyObjs[i], groupbyId);
        }
    }
    function addExtraPropertiesToGroupbyObject(groupbyObj, groupbyId) {
        var currentPage = 1;
        var listRoutersData = {
            listAll: true,
            pagesize: pageSize //global variable
        };
        listRoutersData[groupbyId] = groupbyObj.id;
        $.ajax({
            url: createURL('listRouters'),
            data: $.extend({
            },
            listRoutersData, {
                page: currentPage
            }),
            async: false,
            success: function(json) {
                if (json.listroutersresponse.count != undefined) {
                    var routerCountFromAllPages = json.listroutersresponse.count;
                    var routerCountFromFirstPageToCurrentPage = json.listroutersresponse.router.length;
                    var routerRequiresUpgrade = 0;
                    var items = json.listroutersresponse.router;
                    for (var k = 0; k < items.length; k++) {
                        if (items[k].requiresupgrade) {
                            routerRequiresUpgrade++;
                        }
                    }
                    $.ajax({
                        url: createURL('listRouters'),
                        data: $.extend({}, listRoutersData, {
                            page: currentPage,
                            projectid: -1
                        }),
                        async: false,
                        success: function(json) {
                            if (json.listroutersresponse.count != undefined) {
                                routerCountFromAllPages += json.listroutersresponse.count;
                                groupbyObj.routerCount = routerCountFromAllPages;
                                routerCountFromFirstPageToCurrentPage += json.listroutersresponse.router.length;
                                var items = json.listroutersresponse.router;
                                for (var k = 0; k < items.length; k++) {
                                    if (items[k].requiresupgrade) {
                                        routerRequiresUpgrade++;
                                    }
                                }
                            } else {
                                groupbyObj.routerCount = routerCountFromAllPages;
                            }
                        }
                    });
                    var callListApiWithPage = function() {
                        $.ajax({
                            url: createURL('listRouters'),
                            async: false,
                            data: $.extend({}, listRoutersData, {
                                page: currentPage
                            }),
                            success: function(json) {
                                routerCountFromFirstPageToCurrentPage += json.listroutersresponse.router.length;
                                var items = json.listroutersresponse.router;
                                for (var k = 0; k < items.length; k++) {
                                    if (items[k].requiresupgrade) {
                                        routerRequiresUpgrade++;
                                    }
                                }
                                $.ajax({
                                    url: createURL('listRouters'),
                                    async: false,
                                    data: $.extend({}, listRoutersData, {
                                        page: currentPage,
                                        projectid: -1
                                    }),
                                    success: function(json) {
                                        if (json.listroutersresponse.count != undefined) {
                                            routerCountFromAllPages += json.listroutersresponse.count;
                                            groupbyObj.routerCount = routerCountFromAllPages;
                                            routerCountFromFirstPageToCurrentPage += json.listroutersresponse.router.length;
                                            var items = json.listroutersresponse.router;
                                            for (var k = 0; k < items.length; k++) {
                                                if (items[k].requiresupgrade) {
                                                    routerRequiresUpgrade++;
                                                }
                                            }
                                        } else {
                                            groupbyObj.routerCount = routerCountFromAllPages;
                                        }
                                    }
                                });
                                if (routerCountFromFirstPageToCurrentPage < routerCountFromAllPages) {
                                    currentPage++;
                                    callListApiWithPage();
                                }
                            }
                        });
                    }
                    if (routerCountFromFirstPageToCurrentPage < routerCountFromAllPages) {
                        currentPage++;
                        callListApiWithPage();
                    }
                    groupbyObj.routerRequiresUpgrade = routerRequiresUpgrade;
                    groupbyObj.numberOfRouterRequiresUpgrade = routerRequiresUpgrade;
                } else {
                    groupbyObj.routerCount = 0;
                    groupbyObj.routerRequiresUpgrade = 0;
                    groupbyObj.numberOfRouterRequiresUpgrade = 0;
                }
            }
        });
    }
})($, cloudStack);