// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

(function ($, cloudStack) {
    
    var zoneObjs, podObjs, clusterObjs, domainObjs, networkOfferingObjs, physicalNetworkObjs;
    var selectedClusterObj, selectedZoneObj, selectedPublicNetworkObj, selectedManagementNetworkObj, selectedPhysicalNetworkObj, selectedGuestNetworkObj;
    var nspMap = {
    };
    //from listNetworkServiceProviders API
    var nspHardcodingArray =[]; //for service providers listView (hardcoding, not from listNetworkServiceProviders API)
    
    // Add router type to virtual router
    // -- can be either Project, VPC, or System (standard)
    var mapRouterType = function (index, router) {
        var routerType = _l('label.menu.system');
        
        if (router.projectid) routerType = _l('label.project');
        if (router.vpcid) routerType = 'VPC';
        
        return $.extend(router, {
            routerType: routerType
        });
    };
    
    cloudStack.publicIpRangeAccount = {
        dialog: function (args) {
            return function (args) {
                var data = args.data ? args.data: {
                };
                var fields = {
                    account: {
                        label: 'label.account',
                        defaultValue: data.account
                    },
                    domainid: {
                        label: 'label.domain',
                        defaultValue: data.domainid,
                        select: function (args) {
                            $.ajax({
                                url: createURL('listDomains'),
                                data: {
                                    listAll: true
                                },
                                success: function (json) {
                                    args.response.success({
                                        data: $.map(json.listdomainsresponse.domain, function (domain) {
                                            return {
                                                id: domain.id,
                                                description: domain.path
                                            };
                                        })
                                    });
                                }
                            });
                        }
                    }
                };
                var success = args.response.success;
                
                if (args.$item) {
                    // Account data is read-only after creation
                    $.ajax({
                        url: createURL('listDomains'),
                        data: {
                            id: data.domainid,
                            listAll: true
                        },
                        success: function (json) {
                            var domain = json.listdomainsresponse.domain[0];
                            
                            cloudStack.dialog.notice({
                                message: '<ul><li>' + _l('label.account') + ': ' + data.account + '</li>' + '<li>' + _l('label.domain') + ': ' + domain.path + '</li></ul>'
                            });
                        }
                    });
                } else {
                    cloudStack.dialog.createForm({
                        form: {
                            title: 'label.add.account',
                            desc: '(optional) Please specify an account to be associated with this IP range.',
                            fields: fields
                        },
                        after: function (args) {
                            var data = cloudStack.serializeForm(args.$form);
                            
                            success({
                                data: data
                            });
                        }
                    });
                }
            };
        }
    };
    
    var getTrafficType = function (physicalNetwork, typeID) {
        var trafficType = {
        };
        
        $.ajax({
            url: createURL('listTrafficTypes'),
            data: {
                physicalnetworkid: physicalNetwork.id
            },
            async: false,
            success: function (json) {
                trafficType = $.grep(
                json.listtraffictypesresponse.traffictype,
                function (trafficType) {
                    return trafficType.traffictype == typeID;
                })[0];
            }
        });
        
        if (trafficType.xenservernetworklabel == null || trafficType.xenservernetworklabel == 0)
        trafficType.xenservernetworklabel = dictionary[ 'label.network.label.display.for.blank.value'];
        if (trafficType.kvmnetworklabel == null || trafficType.kvmnetworklabel == 0)
        trafficType.kvmnetworklabel = dictionary[ 'label.network.label.display.for.blank.value'];
        if (trafficType.vmwarenetworklabel == null || trafficType.vmwarenetworklabel == 0)
        trafficType.vmwarenetworklabel = dictionary[ 'label.network.label.display.for.blank.value'];
        if (trafficType.ovmnetworklabel == null || trafficType.ovmnetworklabel == 0)
        trafficType.ovmnetworklabel = dictionary[ 'label.network.label.display.for.blank.value'];
        if (trafficType.lxcnetworklabel == null || trafficType.lxcnetworklabel == 0)
        trafficType.lxcnetworklabel = dictionary[ 'label.network.label.display.for.blank.value'];
        if (trafficType.hypervnetworklabel == null || trafficType.hypervnetworklabel == 0)
        trafficType.hypervnetworklabel = dictionary[ 'label.network.label.display.for.blank.value'];
        
        return trafficType;
    };
    
    var updateTrafficLabels = function (trafficType, labels, complete) {
        var array1 =[];
        if (labels.xenservernetworklabel != dictionary[ 'label.network.label.display.for.blank.value'])
        array1.push("&xenservernetworklabel=" + labels.xenservernetworklabel);
        if (labels.kvmnetworklabel != dictionary[ 'label.network.label.display.for.blank.value'])
        array1.push("&kvmnetworklabel=" + labels.kvmnetworklabel);
        if (labels.vmwarenetworklabel != dictionary[ 'label.network.label.display.for.blank.value'])
        array1.push("&vmwarenetworklabel=" + labels.vmwarenetworklabel);
        if (labels.ovmnetworklabel != dictionary[ 'label.network.label.display.for.blank.value'])
        array1.push("&ovmnetworklabel=" + labels.ovmnetworklabel);
        if (labels.lxcnetworklabel != dictionary[ 'label.network.label.display.for.blank.value'])
        array1.push("&lxcnetworklabel=" + labels.lxcnetworklabel);
        if (labels.hypervnetworklabel != dictionary[ 'label.network.label.display.for.blank.value'])
        array1.push("&hypervnetworklabel=" + labels.hypervnetworklabel);
        
        $.ajax({
            url: createURL('updateTrafficType' + array1.join("")),
            data: {
                id: trafficType.id
            },
            success: function (json) {
                var jobID = json.updatetraffictyperesponse.jobid;
                
                cloudStack.ui.notifications.add({
                    desc: 'Update traffic labels',
                    poll: pollAsyncJobResult,
                    section: 'System',
                    _custom: {
                        jobId: jobID
                    }
                },
                complete ? complete: function () {
                },
                {
                },
                function (data) {
                    // Error
                    cloudStack.dialog.notice({
                        message: parseXMLHttpResponse(data)
                    });
                },
                {
                });
            }
        })
    };
    
    function virtualRouterProviderActionFilter(args) {
        var allowedActions =[];
        var jsonObj = args.context.item; //args.context.item == nspMap["virtualRouter"]
        if (jsonObj.state == "Enabled")
        allowedActions.push("disable"); else if (jsonObj.state == "Disabled")
        allowedActions.push("enable");
        return allowedActions;
    };
    
    function ovsProviderActionFilter(args) {
        var allowedActions = [];
        var jsonObj = args.context.item; //args.context.item == nspMap["virtualRouter"]
        if (jsonObj.state == "Enabled")
            allowedActions.push("disable");
        else if (jsonObj.state == "Disabled")
            allowedActions.push("enable");
        return allowedActions;
    };
    
    cloudStack.sections.system = {
        title: 'label.menu.infrastructure',
        id: 'system',
        
        // System dashboard
        dashboard: {
            dataProvider: function (args) {
                var dataFns = {
                    zoneCount: function (data) {
                        $.ajax({
                            url: createURL('listZones'),
                            data: {
                            	listAll: true,
                                page: 1,
                                pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
                            },
                            success: function (json) {
                                dataFns.podCount($.extend(data, {
                                    zoneCount: json.listzonesresponse.count ? json.listzonesresponse.count: 0,
                                    zones: json.listzonesresponse.zone
                                }));
                            }
                        });
                    },
                    
                    podCount: function (data) {
                        $.ajax({
                            url: createURL('listPods'),
                            data: {
                            	listAll: true,
                                page: 1,
                                pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
                            },
                            success: function (json) {
                                dataFns.clusterCount($.extend(data, {
                                    podCount: json.listpodsresponse.count ? json.listpodsresponse.count: 0
                                }));
                            }
                        });
                    },
                    
                    clusterCount: function (data) {
                        $.ajax({
                            url: createURL('listClusters'),
                            data: {
                            	listAll: true,
                                page: 1,
                                pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
                            },
                            success: function (json) {
                                dataFns.hostCount($.extend(data, {
                                    clusterCount: json.listclustersresponse.count ? json.listclustersresponse.count: 0
                                }));
                                
                                //comment the 4 lines above and uncomment the following 4 lines if listHosts API still responds slowly.
                                
                                /*
                                dataFns.primaryStorageCount($.extend(data, {
                                clusterCount: json.listclustersresponse.count ?
                                json.listclustersresponse.count : 0
                                }));
                                 */
                            }
                        });
                    },
                    
                    hostCount: function (data) {
                        var data2 = {
                            type: 'routing',
                            listAll: true,
                            page: 1,
                            pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
                        };
                        $.ajax({
                            url: createURL('listHosts'),
                            data: data2,
                            success: function (json) {
                                dataFns.primaryStorageCount($.extend(data, {
                                    hostCount: json.listhostsresponse.count ? json.listhostsresponse.count: 0
                                }));
                            }
                        });
                    },
                    
                    primaryStorageCount: function (data) {
                        var data2 = {
                        	listAll: true,
                            page: 1,
                            pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
                        };
                        $.ajax({
                            url: createURL('listStoragePools'),
                            data: data2,
                            success: function (json) {
                                dataFns.secondaryStorageCount($.extend(data, {
                                    primaryStorageCount: json.liststoragepoolsresponse.count ? json.liststoragepoolsresponse.count: 0
                                }));
                            }
                        });
                    },
                    
                    secondaryStorageCount: function (data) {
                        var data2 = {
                            type: 'SecondaryStorage',
                            listAll: true,
                            page: 1,
                            pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
                        };
                        $.ajax({
                            url: createURL('listImageStores'),
                            data: data2,
                            success: function (json) {
                                dataFns.systemVmCount($.extend(data, {
                                    secondaryStorageCount: json.listimagestoresresponse.imagestore ? json.listimagestoresresponse.count: 0
                                }));
                            }
                        });
                    },
                    
                    systemVmCount: function (data) {
                        $.ajax({
                            url: createURL('listSystemVms'),
                            data: {
                            	listAll: true,
                                page: 1,
                                pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
                            },
                            success: function (json) {
                                dataFns.virtualRouterCount($.extend(data, {
                                    systemVmCount: json.listsystemvmsresponse.count ? json.listsystemvmsresponse.count: 0
                                }));
                            }
                        });
                    },
                    
                    virtualRouterCount: function (data) {
                        var data2 = {
                        	listAll: true,
                            page: 1,
                            pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
                        };
                        $.ajax({
                            url: createURL('listRouters'),
                            data: data2,
                            success: function (json) {
                                var total1 = json.listroutersresponse.count ? json.listroutersresponse.count: 0;
                                var total2 = 0; //reset
                                
                                /*
                                 * In project view, the first listRotuers API(without projectid=-1) will return the same objects as the second listRouters API(with projectid=-1),
                                 * because in project view, all API calls are appended with projectid=[projectID].  
                                 * Therefore, we only call the second listRouters API(with projectid=-1) in non-project view.
                                 */   
                                if (cloudStack.context && cloudStack.context.projects == null) { //non-project view
                                var data3 = {
                                    listAll: true,
	                                    projectid: -1,
                                    page: 1,
                                    pagesize: 1 //specifying pagesize as 1 because we don't need any embedded objects to be returned here. The only thing we need from API response is "count" property.
                                };
                                $.ajax({
                                    url: createURL('listRouters'),
                                    data: data3,
	                                    async: false,
                                    success: function (json) {
	                                        total2 = json.listroutersresponse.count ? json.listroutersresponse.count : 0;	                                        
	                                    }
	                                });
                                }
                                                                
                                        dataFns.capacity($.extend(data, {
                                            virtualRouterCount: (total1 + total2)
                                        }));
                                    }
                                });
                    },
                    
                    capacity: function (data) {
                        if (data.zoneCount) {
                            $.ajax({
                                url: createURL('listCapacity'),
                                success: function (json) {
                                    var capacities = json.listcapacityresponse.capacity;
                                    
                                    var capacityTotal = function (id, converter) {
                                        var capacity = $.grep(capacities, function (capacity) {
                                            return capacity.type == id;
                                        })[0];
                                        
                                        var total = capacity ? capacity.capacitytotal: 0;
                                        
                                        if (converter) {
                                            return converter(total);
                                        }
                                        
                                        return total;
                                    };
                                    
                                    dataFns.socketInfo($.extend(data, {
                                        cpuCapacityTotal: capacityTotal(1, cloudStack.converters.convertHz),
                                        memCapacityTotal: capacityTotal(0, cloudStack.converters.convertBytes),
                                        storageCapacityTotal: capacityTotal(2, cloudStack.converters.convertBytes)
                                    }));
                                }
                            });
                        } else {
                            dataFns.socketInfo($.extend(data, {
                                cpuCapacityTotal: cloudStack.converters.convertHz(0),
                                memCapacityTotal: cloudStack.converters.convertBytes(0),
                                storageCapacityTotal: cloudStack.converters.convertBytes(0)
                            }));
                        }
                    },
                    
                    socketInfo: function (data) {
                        var socketCount = 0;
                        $.ajax({
                            url: createURL('listHypervisors'),
                            async: false,
                            success: function (json) {
                                args.response.success({
                                    data: $(json.listhypervisorsresponse.hypervisor).map(function (index, hypervisor) {
                                        var totalHostCount = 0;
                                        var currentPage = 1;
                                        var returnedHostCount = 0;
                                        var returnedHostCpusocketsSum = 0;
                                        
                                    	var callListHostsWithPage = function() {                                                		
                                            $.ajax({
                                                url: createURL('listHosts'),
                                                async: false,
                                                data: {
                                                    type: 'routing',
                                                    hypervisor: hypervisor.name,
                                                    page: currentPage,
                                                    pagesize: pageSize //global variable
                                                },
                                                success: function (json) {
                                                    if (json.listhostsresponse.count == undefined) {
                                                        return;
                                                    }
                                                    
                                                        totalHostCount = json.listhostsresponse.count;
                                                    returnedHostCount += json.listhostsresponse.host.length;
                                                    
                                                    var items = json.listhostsresponse.host;
                                                    for (var i = 0; i < items.length; i++) {
                                                        if (items[i].cpusockets != undefined && isNaN(items[i].cpusockets) == false) {
                                                            returnedHostCpusocketsSum += items[i].cpusockets;
                                                        }
                                                    }
                                                    
                                                    if (returnedHostCount < totalHostCount) {
                                                        currentPage++;
                                        				callListHostsWithPage();
                                                    }
                                                }
                                            });
                                        }
                                        
                                    	callListHostsWithPage();
                                        
                                        socketCount += returnedHostCpusocketsSum;
                                    })
                                });
                            }
                        });
                        
                        complete($.extend(data, {
                            socketCount: socketCount
                        }));
                    }
                };
                
                var complete = function (data) {
                    args.response.success({
                        data: data
                    });
                };
                
                dataFns.zoneCount({
                });
            }
        },
        
        zoneDashboard: function (args) {
            $.ajax({
                url: createURL('listCapacity'),
                data: {
                    zoneid: args.context.zones[0].id
                },
                success: function (json) {
                    var capacities = json.listcapacityresponse.capacity;
                    var data = {
                    };
                    
                    $(capacities).each(function () {
                        var capacity = this;
                        
                        data[capacity.type] = {
                            used: cloudStack.converters.convertByType(capacity.type, capacity.capacityused),
                            total: cloudStack.converters.convertByType(capacity.type, capacity.capacitytotal),
                            percent: parseInt(capacity.percentused)
                        };
                    });
                    
                    args.response.success({
                        data: data
                    });
                }
            });
        },
        
        // Network-as-a-service configuration
        naas: {
            providerListView: {
                id: 'networkProviders',
                fields: {
                    name: {
                        label: 'label.name'
                    },
                    state: {
                        label: 'label.state',
                        converter: function (str) {
                            // For localization
                            return str;
                        },
                        indicator: {
                            'Enabled': 'on',
                            'Disabled': 'off'
                        }
                    }
                },
                dataProvider: function (args) {
                    refreshNspData();
                    args.response.success({
                        data: nspHardcodingArray
                    })
                },
                
                detailView: function (args) {
                    return cloudStack.sections.system.naas.networkProviders.types[
                    args.context.networkProviders[0].id];
                }
            },
            mainNetworks: {
                'public': {
                    detailView: {
                        actions: {
                            edit: {
                                label: 'label.edit',
                                action: function (args) {
                                    var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Public');
                                    
                                    updateTrafficLabels(trafficType, args.data, function () {
                                        args.response.success();
                                    });
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    traffictype: {
                                        label: 'label.traffic.type'
                                    },
                                    broadcastdomaintype: {
                                        label: 'label.broadcast.domain.type'
                                    }
                                },
                                {
                                    xenservernetworklabel: {
                                        label: 'label.xenserver.traffic.label',
                                        isEditable: true
                                    },
                                    kvmnetworklabel: {
                                        label: 'label.kvm.traffic.label',
                                        isEditable: true
                                    },
                                    vmwarenetworklabel: {
                                        label: 'label.vmware.traffic.label',
                                        isEditable: true
                                    },
                                    ovmnetworklabel: {
                                        label: 'label.ovm.traffic.label',
                                        isEditable: true
                                    },
                                    lxcnetworklabel: {
                                        label: 'label.lxc.traffic.label',
                                        isEditable: true
                                    },
                                    hypervnetworklabel: {
                                        label: 'label.hyperv.traffic.label',
                                        isEditable: true
                                    }
                                }],
                                
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listNetworks&listAll=true&trafficType=Public&isSystem=true&zoneId=" + selectedZoneObj.id),
                                        dataType: "json",
                                        async: false,
                                        success: function (json) {
                                            var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Public');
                                            var items = json.listnetworksresponse.network;
                                            
                                            selectedPublicNetworkObj = items[0];
                                            
                                            // Include traffic labels
                                            selectedPublicNetworkObj.xenservernetworklabel = trafficType.xenservernetworklabel;
                                            selectedPublicNetworkObj.kvmnetworklabel = trafficType.kvmnetworklabel;
                                            selectedPublicNetworkObj.vmwarenetworklabel = trafficType.vmwarenetworklabel;
                                            selectedPublicNetworkObj.ovmnetworklabel = trafficType.ovmnetworklabel;
                                            selectedPublicNetworkObj.lxcnetworklabel = trafficType.lxcnetworklabel;
                                            selectedPublicNetworkObj.hypervnetworklabel = trafficType.hypervnetworklabel;
                                            
                                            args.response.success({
                                                data: selectedPublicNetworkObj
                                            });
                                        }
                                    });
                                }
                            },
                            
                            ipAddresses: {
                                title: 'label.ip.ranges',
                                custom: function (args) {
                                    return $('<div></div>').multiEdit({
                                        context: args.context,
                                        noSelect: true,
                                        fields: {
                                            'gateway': {
                                                edit: true,
                                                label: 'label.gateway'
                                            },
                                            'netmask': {
                                                edit: true,
                                                label: 'label.netmask'
                                            },
                                            'vlan': {
                                                edit: true,
                                                label: 'label.vlan',
                                                isOptional: true
                                            },
                                            'startip': {
                                                edit: true,
                                                label: 'label.start.IP'
                                            },
                                            'endip': {
                                                edit: true,
                                                label: 'label.end.IP'
                                            },
                                            'account': {
                                                label: 'label.account',
                                                custom: {
                                                    buttonLabel: 'label.add.account',
                                                    action: cloudStack.publicIpRangeAccount.dialog()
                                                }
                                            },
                                            'add-rule': {
                                                label: 'label.add',
                                                addButton: true
                                            }
                                        },
                                        add: {
                                            label: 'label.add',
                                            action: function (args) {
                                                var array1 =[];
                                                array1.push("&zoneId=" + args.context.zones[0].id);
                                                
                                                if (args.data.vlan != null && args.data.vlan.length > 0)
                                                array1.push("&vlan=" + todb(args.data.vlan)); else
                                                array1.push("&vlan=untagged");
                                                
                                                array1.push("&gateway=" + args.data.gateway);
                                                array1.push("&netmask=" + args.data.netmask);
                                                array1.push("&startip=" + args.data.startip);
                                                if (args.data.endip != null && args.data.endip.length > 0)
                                                array1.push("&endip=" + args.data.endip);
                                                
                                                if (args.data.account) {
                                                    array1.push("&account=" + args.data.account.account);
                                                    array1.push("&domainid=" + args.data.account.domainid);
                                                }
                                                
                                                array1.push("&forVirtualNetwork=true");
                                                //indicates this new IP range is for public network, not guest network
                                                
                                                $.ajax({
                                                    url: createURL("createVlanIpRange" + array1.join("")),
                                                    dataType: "json",
                                                    success: function (json) {
                                                        var item = json.createvlaniprangeresponse.vlan;
                                                        args.response.success({
                                                            data: item,
                                                            notification: {
                                                                label: 'label.add.ip.range',
                                                                poll: function (args) {
                                                                    args.complete();
                                                                }
                                                            }
                                                        });
                                                    },
                                                    error: function (XMLHttpResponse) {
                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                        args.response.error(errorMsg);
                                                    }
                                                });
                                            }
                                        },
                                        actionPreFilter: function (args) {
                                            var actionsToShow =[ 'destroy'];
                                            if (args.context.multiRule[0].domain == 'ROOT' && args.context.multiRule[0].account.account == 'system')
                                            actionsToShow.push('addAccount'); else
                                            actionsToShow.push('releaseFromAccount');
                                            return actionsToShow;
                                        },
                                        actions: {
                                            destroy: {
                                                label: 'label.remove.ip.range',
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL('deleteVlanIpRange&id=' + args.context.multiRule[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            args.response.success({
                                                                notification: {
                                                                    label: 'label.remove.ip.range',
                                                                    poll: function (args) {
                                                                        args.complete();
                                                                    }
                                                                }
                                                            });
                                                        },
                                                        error: function (json) {
                                                            args.response.error(parseXMLHttpResponse(json));
                                                        }
                                                    });
                                                }
                                            },
                                            
                                            releaseFromAccount: {
                                                label: 'label.release.account',
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL('releasePublicIpRange'),
                                                        data: {
                                                            id: args.context.multiRule[0].id
                                                        },
                                                        success: function (json) {
                                                            args.response.success({
                                                                notification: {
                                                                    label: 'label.release.account.lowercase',
                                                                    poll: function (args) {
                                                                        args.complete();
                                                                    }
                                                                }
                                                            });
                                                        },
                                                        error: function (json) {
                                                            args.response.error(parseXMLHttpResponse(json));
                                                        }
                                                    });
                                                }
                                            },
                                            
                                            addAccount: {
                                                label: 'label.add.account',
                                                createForm: {
                                                    title: 'label.add.account',
                                                    fields: {
                                                        account: {
                                                            label: 'label.account'
                                                        },
                                                        domainid: {
                                                            label: 'label.domain',
                                                            select: function (args) {
                                                                $.ajax({
                                                                    url: createURL('listDomains'),
                                                                    data: {
                                                                        listAll: true
                                                                    },
                                                                    success: function (json) {
                                                                        args.response.success({
                                                                            data: $.map(json.listdomainsresponse.domain, function (domain) {
                                                                                return {
                                                                                    id: domain.id,
                                                                                    description: domain.path
                                                                                };
                                                                            })
                                                                        });
                                                                    }
                                                                });
                                                            }
                                                        }
                                                    }
                                                },
                                                action: function (args) {
                                                    var data = {
                                                        id: args.context.multiRule[0].id,
                                                        zoneid: args.context.multiRule[0].zoneid,
                                                        domainid: args.data.domainid,
                                                        account: args.data.account
                                                    };
                                                    $.ajax({
                                                        url: createURL('dedicatePublicIpRange'),
                                                        data: data,
                                                        success: function (json) {
                                                            args.response.success({
                                                                notification: {
                                                                    label: 'label.add.account',
                                                                    poll: function (args) {
                                                                        args.complete();
                                                                    }
                                                                }
                                                            });
                                                        },
                                                        error: function (json) {
                                                            args.response.error(parseXMLHttpResponse(json));
                                                        }
                                                    });
                                                }
                                            }
                                        },
                                        dataProvider: function (args) {
                                            $.ajax({
                                                url: createURL("listVlanIpRanges&zoneid=" + args.context.zones[0].id + "&networkId=" + selectedPublicNetworkObj.id),
                                                dataType: "json",
                                                success: function (json) {
                                                    var items = json.listvlaniprangesresponse.vlaniprange;
                                                    
                                                    args.response.success({
                                                        data: $.map(items, function (item) {
                                                            return $.extend(item, {
                                                                account: {
                                                                    _buttonLabel: item.account,
                                                                    account: item.account,
                                                                    domainid: item.domainid
                                                                }
                                                            });
                                                        })
                                                    });
                                                }
                                            });
                                        }
                                    });
                                }
                            }
                        }
                    }
                },
                
                'storage': {
                    detailView: {
                        actions: {
                            edit: {
                                label: 'label.edit',
                                action: function (args) {
                                    var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Storage');
                                    
                                    updateTrafficLabels(trafficType, args.data, function () {
                                        args.response.success();
                                    });
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    traffictype: {
                                        label: 'label.traffic.type'
                                    },
                                    broadcastdomaintype: {
                                        label: 'label.broadcast.domain.type'
                                    }
                                },
                                {
                                    xenservernetworklabel: {
                                        label: 'label.xenserver.traffic.label',
                                        isEditable: true
                                    },
                                    kvmnetworklabel: {
                                        label: 'label.kvm.traffic.label',
                                        isEditable: true
                                    },
                                    vmwarenetworklabel: {
                                        label: 'label.vmware.traffic.label',
                                        isEditable: true
                                    },
                                    ovmnetworklabel: {
                                        label: 'label.ovm.traffic.label',
                                        isEditable: true
                                    },
                                    lxcnetworklabel: {
                                        label: 'label.lxc.traffic.label',
                                        isEditable: true
                                    },
                                    hypervnetworklabel: {
                                        label: 'label.hyperv.traffic.label',
                                        isEditable: true
                                    }
                                }],
                                
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listNetworks&listAll=true&trafficType=Storage&isSystem=true&zoneId=" + selectedZoneObj.id),
                                        dataType: "json",
                                        async: false,
                                        success: function (json) {
                                            var items = json.listnetworksresponse.network;
                                            var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Storage');
                                            selectedPublicNetworkObj = items[0];
                                            
                                            selectedPublicNetworkObj.xenservernetworklabel = trafficType.xenservernetworklabel;
                                            selectedPublicNetworkObj.kvmnetworklabel = trafficType.kvmnetworklabel;
                                            selectedPublicNetworkObj.vmwarenetworklabel = trafficType.vmwarenetworklabel;
                                            selectedPublicNetworkObj.ovmnetworklabel = trafficType.ovmnetworklabel;
                                            selectedPublicNetworkObj.lxcnetworklabel = trafficType.lxcnetworklabel;
                                            selectedPublicNetworkObj.hypervnetworklabel = trafficType.hypervnetworklabel;
                                            
                                            args.response.success({
                                                data: selectedPublicNetworkObj
                                            });
                                        }
                                    });
                                }
                            },
                            
                            ipAddresses: {
                                title: 'label.ip.ranges',
                                custom: function (args) {
                                    return $('<div></div>').multiEdit({
                                        context: args.context,
                                        noSelect: true,
                                        fields: {
                                            'podid': {
                                                label: 'label.pod',
                                                select: function (args) {
                                                    $.ajax({
                                                        url: createURL("listPods&zoneid=" + selectedZoneObj.id),
                                                        dataType: "json",
                                                        success: function (json) {
                                                            var items =[];
                                                            var pods = json.listpodsresponse.pod;
                                                            $(pods).each(function () {
                                                                items.push({
                                                                    name: this.id,
                                                                    description: this.name
                                                                });
                                                                //should be "{id: this.id, description: this.name}" (to be consistent with dropdown in createFrom and edit mode) (Brian will fix widget later)
                                                            });
                                                            args.response.success({
                                                                data: items
                                                            });
                                                        }
                                                    });
                                                }
                                            },
                                            'gateway': {
                                                edit: true,
                                                label: 'label.gateway'
                                            },
                                            'netmask': {
                                                edit: true,
                                                label: 'label.netmask'
                                            },
                                            'vlan': {
                                                edit: true,
                                                label: 'label.vlan',
                                                isOptional: true
                                            },
                                            'startip': {
                                                edit: true,
                                                label: 'label.start.IP'
                                            },
                                            'endip': {
                                                edit: true,
                                                label: 'label.end.IP'
                                            },
                                            'add-rule': {
                                                label: 'label.add',
                                                addButton: true
                                            }
                                        },
                                        add: {
                                            label: 'label.add',
                                            action: function (args) {
                                                var array1 =[];
                                                array1.push("&zoneId=" + args.context.zones[0].id);
                                                array1.push("&podid=" + args.data.podid);
                                                
                                                array1.push("&gateway=" + args.data.gateway);
                                                
                                                if (args.data.vlan != null && args.data.vlan.length > 0)
                                                array1.push("&vlan=" + todb(args.data.vlan));
                                                
                                                array1.push("&netmask=" + args.data.netmask);
                                                array1.push("&startip=" + args.data.startip);
                                                if (args.data.endip != null && args.data.endip.length > 0)
                                                array1.push("&endip=" + args.data.endip);
                                                
                                                $.ajax({
                                                    url: createURL("createStorageNetworkIpRange" + array1.join("")),
                                                    dataType: "json",
                                                    success: function (json) {
                                                        args.response.success({
                                                            _custom: {
                                                                jobId: json.createstoragenetworkiprangeresponse.jobid
                                                            },
                                                            notification: {
                                                                label: 'label.add.ip.range',
                                                                poll: pollAsyncJobResult
                                                            }
                                                        });
                                                    },
                                                    error: function (XMLHttpResponse) {
                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                        args.response.error(errorMsg);
                                                    }
                                                });
                                            }
                                        },
                                        actions: {
                                            destroy: {
                                                label: 'label.delete',
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL('deleteStorageNetworkIpRange&id=' + args.context.multiRule[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            args.response.success({
                                                                notification: {
                                                                    label: 'label.remove.ip.range',
                                                                    poll: function (args) {
                                                                        args.complete();
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                }
                                            }
                                        },
                                        dataProvider: function (args) {
                                            $.ajax({
                                                url: createURL("listStorageNetworkIpRange&zoneid=" + args.context.zones[0].id + "&networkId=" + selectedPublicNetworkObj.id),
                                                dataType: "json",
                                                success: function (json) {
                                                    var items = json.liststoragenetworkiprangeresponse.storagenetworkiprange;
                                                    args.response.success({
                                                        data: items
                                                    });
                                                }
                                            });
                                        }
                                    });
                                }
                            }
                        }
                    }
                },
                
                'management': {
                    detailView: {
                        actions: {
                            edit: {
                                label: 'label.edit',
                                action: function (args) {
                                    var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Management');
                                    
                                    updateTrafficLabels(trafficType, args.data, function () {
                                        args.response.success();
                                    });
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    traffictype: {
                                        label: 'label.traffic.type'
                                    },
                                    broadcastdomaintype: {
                                        label: 'label.broadcast.domain.type'
                                    }
                                },
                                {
                                    xenservernetworklabel: {
                                        label: 'label.xenserver.traffic.label',
                                        isEditable: true
                                    },
                                    kvmnetworklabel: {
                                        label: 'label.kvm.traffic.label',
                                        isEditable: true
                                    },
                                    vmwarenetworklabel: {
                                        label: 'label.vmware.traffic.label',
                                        isEditable: true
                                    },
                                    ovmnetworklabel: {
                                        label: 'label.ovm.traffic.label',
                                        isEditable: true
                                    },
                                    lxcnetworklabel: {
                                        label: 'label.lxc.traffic.label',
                                        isEditable: true
                                    },
                                    hypervnetworklabel: {
                                        label: 'label.hyperv.traffic.label',
                                        isEditable: true
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listNetworks&listAll=true&issystem=true&trafficType=Management&zoneId=" + selectedZoneObj.id),
                                        dataType: "json",
                                        success: function (json) {
                                            selectedManagementNetworkObj = json.listnetworksresponse.network[0];
                                            
                                            var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Management');
                                            
                                            selectedManagementNetworkObj.xenservernetworklabel = trafficType.xenservernetworklabel;
                                            selectedManagementNetworkObj.kvmnetworklabel = trafficType.kvmnetworklabel;
                                            selectedManagementNetworkObj.vmwarenetworklabel = trafficType.vmwarenetworklabel;
                                            selectedManagementNetworkObj.ovmnetworklabel = trafficType.ovmnetworklabel;
                                            selectedManagementNetworkObj.lxcnetworklabel = trafficType.lxcnetworklabel;
                                            selectedManagementNetworkObj.hypervnetworklabel = trafficType.hypervnetworklabel;
                                            
                                            args.response.success({
                                                data: selectedManagementNetworkObj
                                            });
                                        }
                                    });
                                }
                            },
                            ipAddresses: {
                                //read-only listView (no actions) filled with pod info (not VlanIpRange info)
                                title: 'label.ip.ranges',
                                listView: {
                                    fields: {
                                        name: {
                                            label: 'label.pod'
                                        },
                                        //pod name
                                        gateway: {
                                            label: 'label.gateway'
                                        },
                                        //'Reserved system gateway' is too long and causes a visual format bug (2 lines overlay)
                                        netmask: {
                                            label: 'label.netmask'
                                        },
                                        //'Reserved system netmask' is too long and causes a visual format bug (2 lines overlay)
                                        startip: {
                                            label: 'label.start.IP'
                                        },
                                        //'Reserved system start IP' is too long and causes a visual format bug (2 lines overlay)
                                        endip: {
                                            label: 'label.end.IP'
                                        }
                                        //'Reserved system end IP' is too long and causes a visual format bug (2 lines overlay)
                                    },
                                    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;
                                                }
                                            }
                                        }
                                        $.ajax({
                                            url: createURL("listPods&zoneid=" + selectedZoneObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                            dataType: "json",
                                            async: true,
                                            success: function (json) {
                                                var items = json.listpodsresponse.pod;
                                                args.response.success({
                                                    data: items
                                                });
                                            }
                                        });
                                    }
                                }
                            }
                        }
                    }
                },
                
                'guest': {
                    //physical network + Guest traffic type
                    detailView: {
                        actions: {
                            edit: {
                                label: 'label.edit',
                                action: function (args) {
                                    var data = {
                                        id: selectedPhysicalNetworkObj.id
                                    };
                                    
                                    $.extend(data, {
                                        vlan: args.data.vlan
                                    });
                                    
                                    $.extend(data, {
                                        tags: args.data.tags
                                    });
                                    
                                    $.ajax({
                                        url: createURL('updatePhysicalNetwork'),
                                        data: data,
                                        success: function (json) {
                                            var jobId = json.updatephysicalnetworkresponse.jobid;
                                            
                                            var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Guest');
                                            
                                            updateTrafficLabels(trafficType, args.data, function () {
                                                args.response.success({
                                                    _custom: {
                                                        jobId: jobId
                                                    }
                                                });
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        },
                        
                        tabFilter: function (args) {
                            var hiddenTabs =[];
                            if (selectedZoneObj.networktype == 'Basic') {
                                hiddenTabs.push("network");
                                hiddenTabs.push("dedicatedGuestVlanRanges");
                            } else {
                                //selectedZoneObj.networktype == 'Advanced'
                                hiddenTabs.push("ipAddresses");
                            }
                            return hiddenTabs;
                        },
                        
                        tabs: {
                            details: {
                                title: 'label.details',
                                preFilter: function (args) {
                                    var hiddenFields =[];
                                    if (selectedZoneObj.networktype == "Basic") {
                                        hiddenFields.push("vlan");
                                        // hiddenFields.push("endVlan");
                                    }
                                    return hiddenFields;
                                },
                                fields:[ {
                                    //updatePhysicalNetwork API
                                    state: {
                                        label: 'label.state'
                                    },
                                    vlan: {
                                        label: 'label.vlan.vni.ranges',
                                        isEditable: true
                                    },
                                    tags: {
                                        label: 'Tags',
                                        isEditable: true
                                    },
                                    broadcastdomainrange: {
                                        label: 'label.broadcast.domain.range'
                                    }
                                },
                                {
                                    //updateTrafficType API
                                    xenservernetworklabel: {
                                        label: 'label.xenserver.traffic.label',
                                        isEditable: true
                                    },
                                    kvmnetworklabel: {
                                        label: 'label.kvm.traffic.label',
                                        isEditable: true
                                    },
                                    vmwarenetworklabel: {
                                        label: 'label.vmware.traffic.label',
                                        isEditable: true
                                    },
                                    ovmnetworklabel: {
                                        label: 'label.ovm.traffic.label',
                                        isEditable: true
                                    },
                                    lxcnetworklabel: {
                                        label: 'label.lxc.traffic.label',
                                        isEditable: true
                                    },
                                    hypervnetworklabel: {
                                        label: 'label.hyperv.traffic.label',
                                        isEditable: true
                                    }
                                }],
                                dataProvider: function (args) {
                                    //physical network + Guest traffic type
                                    //refresh physical network
                                    $.ajax({
                                        url: createURL('listPhysicalNetworks'),
                                        data: {
                                            id: args.context.physicalNetworks[0].id
                                        },
                                        async: true,
                                        success: function (json) {
                                            selectedPhysicalNetworkObj = json.listphysicalnetworksresponse.physicalnetwork[0];
                                            
                                            //	var startVlan, endVlan;
                                            var vlan = selectedPhysicalNetworkObj.vlan;
                                            /*	if(vlan != null && vlan.length > 0) {
                                            if(vlan.indexOf("-") != -1) {
                                            var vlanArray = vlan.split("-");
                                            startVlan = vlanArray[0];
                                            endVlan = vlanArray[1];
                                            }
                                            else {
                                            startVlan = vlan;
                                            }
                                            selectedPhysicalNetworkObj["startVlan"] = startVlan;
                                            selectedPhysicalNetworkObj["endVlan"] = endVlan;
                                            }*/
                                            
                                            //traffic type
                                            var xenservertrafficlabel, kvmtrafficlabel, vmwaretrafficlabel;
                                            var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Guest');
                                            //refresh Guest traffic type
                                            selectedPhysicalNetworkObj[ "xenservernetworklabel"] = trafficType.xenservernetworklabel;
                                            selectedPhysicalNetworkObj[ "kvmnetworklabel"] = trafficType.kvmnetworklabel;
                                            selectedPhysicalNetworkObj[ "vmwarenetworklabel"] = trafficType.vmwarenetworklabel;
                                            selectedPhysicalNetworkObj[ "ovmnetworklabel"] = trafficType.ovmnetworklabel;
                                            selectedPhysicalNetworkObj[ "lxcnetworklabel"] = trafficType.lxcnetworklabel;
                                            selectedPhysicalNetworkObj[ "hypervnetworklabel"] = trafficType.hypervnetworklabel;
                                            
                                            args.response.success({
                                                actionFilter: function () {
                                                    var allowedActions =[ 'edit', 'addVlanRange', 'removeVlanRange'];
                                                    return allowedActions;
                                                },
                                                data: selectedPhysicalNetworkObj
                                            });
                                        }
                                    });
                                }
                            },
                            
                            ipAddresses: {
                                title: 'label.ip.ranges',
                                custom: function (args) {
                                    return $('<div></div>').multiEdit({
                                        context: args.context,
                                        noSelect: true,
                                        fields: {
                                            'podid': {
                                                label: 'label.pod',
                                                select: function (args) {
                                                    $.ajax({
                                                        url: createURL("listPods&zoneid=" + selectedZoneObj.id),
                                                        dataType: "json",
                                                        success: function (json) {
                                                            var items =[];
                                                            var pods = json.listpodsresponse.pod;
                                                            $(pods).each(function () {
                                                                items.push({
                                                                    name: this.id,
                                                                    description: this.name
                                                                });
                                                                //should be "{id: this.id, description: this.name}" (to be consistent with dropdown in createFrom and edit mode) (Brian will fix widget later)
                                                            });
                                                            args.response.success({
                                                                data: items
                                                            });
                                                        }
                                                    });
                                                }
                                            },
                                            'gateway': {
                                                edit: true,
                                                label: 'label.gateway'
                                            },
                                            'netmask': {
                                                edit: true,
                                                label: 'label.netmask'
                                            },
                                            'startip': {
                                                edit: true,
                                                label: 'label.start.IP'
                                            },
                                            'endip': {
                                                edit: true,
                                                label: 'label.end.IP'
                                            },
                                            'add-rule': {
                                                label: 'label.add',
                                                addButton: true
                                            }
                                        },
                                        add: {
                                            label: 'label.add',
                                            action: function (args) {
                                                var array1 =[];
                                                array1.push("&podid=" + args.data.podid);
                                                array1.push("&networkid=" + selectedGuestNetworkObj.id);
                                                array1.push("&gateway=" + args.data.gateway);
                                                array1.push("&netmask=" + args.data.netmask);
                                                array1.push("&startip=" + args.data.startip);
                                                if (args.data.endip != null && args.data.endip.length > 0)
                                                array1.push("&endip=" + args.data.endip);
                                                array1.push("&forVirtualNetwork=false");
                                                //indicates this new IP range is for guest network, not public network
                                                
                                                $.ajax({
                                                    url: createURL("createVlanIpRange" + array1.join("")),
                                                    dataType: "json",
                                                    success: function (json) {
                                                        var item = json.createvlaniprangeresponse.vlan;
                                                        args.response.success({
                                                            data: item,
                                                            notification: {
                                                                label: 'label.add.ip.range',
                                                                poll: function (args) {
                                                                    args.complete();
                                                                }
                                                            }
                                                        });
                                                    },
                                                    error: function (XMLHttpResponse) {
                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                        args.response.error(errorMsg);
                                                    }
                                                });
                                            }
                                        },
                                        actions: {
                                            destroy: {
                                                label: 'label.remove.ip.range',
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL('deleteVlanIpRange&id=' + args.context.multiRule[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            args.response.success({
                                                                notification: {
                                                                    label: 'label.remove.ip.range',
                                                                    poll: function (args) {
                                                                        args.complete();
                                                                    }
                                                                }
                                                            });
                                                        },
                                                        error: function (json) {
                                                            args.response.error(parseXMLHttpResponse(json));
                                                        }
                                                    });
                                                }
                                            }
                                        },
                                        dataProvider: function (args) {
                                            //only basic zone has IP Range tab
                                            selectedGuestNetworkObj = null;
                                            $.ajax({
                                                url: createURL("listNetworks&listAll=true&trafficType=Guest&zoneid=" + selectedZoneObj.id),
                                                dataType: "json",
                                                async: false,
                                                success: function (json) {
                                                    var items = json.listnetworksresponse.network;
                                                    if (items != null && items.length > 0)
                                                    selectedGuestNetworkObj = json.listnetworksresponse.network[0];
                                                }
                                            });
                                            if (selectedGuestNetworkObj == null)
                                            return;
                                            
                                            $.ajax({
                                                url: createURL("listVlanIpRanges&zoneid=" + selectedZoneObj.id + "&networkId=" + selectedGuestNetworkObj.id),
                                                dataType: "json",
                                                success: function (json) {
                                                    var items = json.listvlaniprangesresponse.vlaniprange;
                                                    args.response.success({
                                                        data: items
                                                    });
                                                }
                                            });
                                        }
                                    });
                                }
                            },
                            
                            network: {
                                title: 'label.network',
                                listView: {
                                    section: 'networks',
                                    id: 'networks',
                                    fields: {
                                        name: {
                                            label: 'label.name'
                                        },
                                        type: {
                                            label: 'label.type'
                                        },
                                        vlan: {
                                            label: 'label.vnet.id'
                                        },
                                        broadcasturi: {
                                            label: 'label.broadcat.uri'
                                        },
                                        cidr: {
                                            label: 'label.ipv4.cidr'
                                        },
                                        ip6cidr: {
                                            label: 'label.ipv6.cidr'
                                        }
                                        //scope: { label: 'label.scope' }
                                    },
                                    actions: {
                                        add: addGuestNetworkDialog.def
                                    },
                                    
                                    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;
                                                }
                                            }
                                        }
                                        
                                        //need to make 2 listNetworks API call to get all guest networks from one physical network in Advanced zone
                                        var items =[];
                                        //"listNetworks&projectid=-1": list guest networks under all projects (no matter who the owner is)
                                        $.ajax({
                                            url: createURL("listNetworks&projectid=-1&trafficType=Guest&zoneId=" + selectedZoneObj.id + "&physicalnetworkid=" + selectedPhysicalNetworkObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                            dataType: "json",
                                            async: false,
                                            success: function (json) {
                                                if (json.listnetworksresponse.network != null && json.listnetworksresponse.network.length > 0)
                                                items = json.listnetworksresponse.network;
                                            }
                                        });
                                        
                                        var networkCollectionMap = {
                                        };
                                        $(items).each(function () {
                                            networkCollectionMap[ this.id] = this.name;
                                        });
                                        
                                        //"listNetworks&listAll=true: list guest networks that are not under any project (no matter who the owner is)
                                        $.ajax({
                                            url: createURL("listNetworks&listAll=true&trafficType=Guest&zoneId=" + selectedZoneObj.id + "&physicalnetworkid=" + selectedPhysicalNetworkObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                            dataType: "json",
                                            async: false,
                                            success: function (json) {
                                                $(json.listnetworksresponse.network).each(function () {
                                                    if ((this.id in networkCollectionMap) == false)
                                                    items.push(this);
                                                });
                                            }
                                        });
                                        
                                        $(items).each(function () {
                                            addExtraPropertiesToGuestNetworkObject(this);
                                        });
                                        
                                        args.response.success({
                                            data: items
                                        });
                                    },
                                    
                                    detailView: {
                                        name: 'label.guest.network.details',
                                        noCompact: true,
                                        viewAll: {
                                            path: '_zone.guestIpRanges',
                                            label: 'label.ip.ranges',
                                            preFilter: function (args) {
                                                if (selectedGuestNetworkObj.type == "Isolated") {
                                                    var services = selectedGuestNetworkObj.service;
                                                    if (services != null) {
                                                        for (var i = 0; i < services.length; i++) {
                                                            var service = services[i];
                                                            if (service.name == "SourceNat")
                                                            return false;
                                                        }
                                                    }
                                                }
                                                return true;
                                            }
                                        },
                                        actions: {
                                            edit: {
                                                label: 'label.edit',
                                                action: function (args) {
                                                    var array1 =[];
                                                    array1.push("&name=" + todb(args.data.name));
                                                    array1.push("&displaytext=" + todb(args.data.displaytext));
                                                    
                                                    //args.data.networkdomain is null when networkdomain field is hidden
                                                    if (args.data.networkdomain != null && args.data.networkdomain != selectedGuestNetworkObj.networkdomain)
                                                    array1.push("&networkdomain=" + todb(args.data.networkdomain));
                                                    
                                                    //args.data.networkofferingid is null when networkofferingid field is hidden
                                                    if (args.data.networkofferingid != null && args.data.networkofferingid != args.context.networks[0].networkofferingid) {
                                                        array1.push("&networkofferingid=" + todb(args.data.networkofferingid));
                                                        
                                                        if (args.context.networks[0].type == "Isolated") {
                                                            //Isolated network
                                                            cloudStack.dialog.confirm({
                                                                message: 'message.confirm.current.guest.CIDR.unchanged',
                                                                action: function () {
                                                                    //"Yes"	button is clicked
                                                                    array1.push("&changecidr=false");
                                                                    $.ajax({
                                                                        url: createURL("updateNetwork&id=" + args.context.networks[0].id + array1.join("")),
                                                                        dataType: "json",
                                                                        success: function (json) {
                                                                            var jid = json.updatenetworkresponse.jobid;
                                                                            args.response.success({
                                                                                _custom: {
                                                                                    jobId: jid,
                                                                                    getUpdatedItem: function (json) {
                                                                                        var item = json.queryasyncjobresultresponse.jobresult.network;
                                                                                        return {
                                                                                            data: item
                                                                                        };
                                                                                    }
                                                                                }
                                                                            });
                                                                        }
                                                                    });
                                                                },
                                                                cancelAction: function () {
                                                                    //"Cancel" button is clicked
                                                                    array1.push("&changecidr=true");
                                                                    $.ajax({
                                                                        url: createURL("updateNetwork&id=" + args.context.networks[0].id + array1.join("")),
                                                                        dataType: "json",
                                                                        success: function (json) {
                                                                            var jid = json.updatenetworkresponse.jobid;
                                                                            args.response.success({
                                                                                _custom: {
                                                                                    jobId: jid,
                                                                                    getUpdatedItem: function (json) {
                                                                                        var item = json.queryasyncjobresultresponse.jobresult.network;
                                                                                        return {
                                                                                            data: item
                                                                                        };
                                                                                    }
                                                                                }
                                                                            });
                                                                        }
                                                                    });
                                                                }
                                                            });
                                                            return;
                                                        }
                                                    }
                                                    
                                                    $.ajax({
                                                        url: createURL("updateNetwork&id=" + args.context.networks[0].id + array1.join("")),
                                                        dataType: "json",
                                                        success: function (json) {
                                                            var jid = json.updatenetworkresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        var item = json.queryasyncjobresultresponse.jobresult.network;
                                                                        return {
                                                                            data: item
                                                                        };
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            'restart': {
                                                label: 'label.restart.network',
                                                createForm: {
                                                    title: 'label.restart.network',
                                                    desc: 'message.restart.network',
                                                    preFilter: function (args) {
                                                        if (selectedZoneObj.networktype == "Basic") {
                                                            args.$form.find('.form-item[rel=cleanup]').find('input').removeAttr('checked');
                                                            //unchecked
                                                            args.$form.find('.form-item[rel=cleanup]').hide();
                                                            //hidden
                                                        } else {
                                                            args.$form.find('.form-item[rel=cleanup]').find('input').attr('checked', 'checked');
                                                            //checked
                                                            args.$form.find('.form-item[rel=cleanup]').css('display', 'inline-block');
                                                            //shown
                                                        }
                                                    },
                                                    fields: {
                                                        cleanup: {
                                                            label: 'label.clean.up',
                                                            isBoolean: true
                                                        }
                                                    }
                                                },
                                                action: function (args) {
                                                    var array1 =[];
                                                    array1.push("&cleanup=" + (args.data.cleanup == "on"));
                                                    $.ajax({
                                                        url: createURL("restartNetwork&cleanup=true&id=" + args.context.networks[0].id + array1.join("")),
                                                        dataType: "json",
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.restartnetworkresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        return json.queryasyncjobresultresponse.jobresult.network;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                messages: {
                                                    notification: function (args) {
                                                        return 'label.restart.network';
                                                    }
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            'remove': {
                                                label: 'label.action.delete.network',
                                                messages: {
                                                    confirm: function (args) {
                                                        return 'message.action.delete.network';
                                                    },
                                                    notification: function (args) {
                                                        return 'label.action.delete.network';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL("deleteNetwork&id=" + args.context.networks[0].id),
                                                        dataType: "json",
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.deletenetworkresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        return {
                                                                        };
                                                                        //nothing in this network needs to be updated, in fact, this whole template has being deleted
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            }
                                        },
                                        tabs: {
                                            details: {
                                                title: 'label.details',
                                                preFilter: function (args) {
                                                    var hiddenFields =[];
                                                    if (selectedZoneObj.networktype == "Basic") {
                                                        hiddenFields.push("account");
                                                        hiddenFields.push("gateway");
                                                        //hiddenFields.push("netmask");
                                                    }
                                                    
                                                    if (selectedGuestNetworkObj.type == "Isolated") {
                                                        hiddenFields.push("networkofferingdisplaytext");
                                                        hiddenFields.push("networkdomaintext");
                                                        hiddenFields.push("gateway");
                                                        //hiddenFields.push("netmask");
                                                    } else {
                                                        //selectedGuestNetworkObj.type == "Shared"
                                                        hiddenFields.push("networkofferingid");
                                                        hiddenFields.push("networkdomain");
                                                    }
                                                    return hiddenFields;
                                                },
                                                fields:[ {
                                                    name: {
                                                        label: 'label.name',
                                                        isEditable: true
                                                    }
                                                },
                                                {
                                                    id: {
                                                        label: 'label.id'
                                                    },
                                                    displaytext: {
                                                        label: 'label.description',
                                                        isEditable: true
                                                    },
                                                    type: {
                                                        label: 'label.type'
                                                    },
                                                    state: {
                                                        label: 'label.state'
                                                    },
                                                    restartrequired: {
                                                        label: 'label.restart.required',
                                                        converter: function (booleanValue) {
                                                            if (booleanValue == true)
                                                            return "<font color='red'>Yes</font>"; else if (booleanValue == false)
                                                            return "No";
                                                        }
                                                    },
                                                    vlan: {
                                                        label: 'label.vlan.id'
                                                    },
                                                    broadcasturi: {
                                                        label: 'label.broadcat.uri'
                                                    },
                                                    scope: {
                                                        label: 'label.scope'
                                                    },
                                                    networkofferingdisplaytext: {
                                                        label: 'label.network.offering'
                                                    },
                                                    networkofferingid: {
                                                        label: 'label.network.offering',
                                                        isEditable: true,
                                                        select: function (args) {
                                                            var items =[];
                                                            $.ajax({
                                                                url: createURL("listNetworkOfferings&state=Enabled&networkid=" + selectedGuestNetworkObj.id + "&zoneid=" + selectedGuestNetworkObj.zoneid),
                                                                dataType: "json",
                                                                async: false,
                                                                success: function (json) {
                                                                    var networkOfferingObjs = json.listnetworkofferingsresponse.networkoffering;
                                                                    $(networkOfferingObjs).each(function () {
                                                                        items.push({
                                                                            id: this.id,
                                                                            description: this.displaytext
                                                                        });
                                                                    });
                                                                }
                                                            });
                                                            
                                                            //include currently selected network offeirng to dropdown
                                                            items.push({
                                                                id: selectedGuestNetworkObj.networkofferingid,
                                                                description: selectedGuestNetworkObj.networkofferingdisplaytext
                                                            });
                                                            
                                                            args.response.success({
                                                                data: items
                                                            });
                                                        }
                                                    },
                                                    
                                                    networkofferingidText: {
                                                        label: 'label.network.offering.id'
                                                    },
                                                    
                                                    gateway: {
                                                        label: 'label.ipv4.gateway'
                                                    },
                                                    //netmask: { label: 'label.netmask' },
                                                    cidr: {
                                                        label: 'label.ipv4.cidr'
                                                    },
                                                    
                                                    ip6gateway: {
                                                        label: 'label.ipv6.gateway'
                                                    },
                                                    ip6cidr: {
                                                        label: 'label.ipv6.CIDR'
                                                    },
                                                    
                                                    networkdomaintext: {
                                                        label: 'label.network.domain'
                                                    },
                                                    networkdomain: {
                                                        label: 'label.network.domain',
                                                        isEditable: true
                                                    },
                                                    
                                                    domain: {
                                                        label: 'label.domain'
                                                    },
                                                    subdomainaccess: {
                                                        label: 'label.subdomain.access',
                                                        converter: function (data) {
                                                            return data ? 'Yes': 'No';
                                                        }
                                                    },
                                                    account: {
                                                        label: 'label.account'
                                                    },
                                                    project: {
                                                        label: 'label.project'
                                                    }
                                                }],
                                                dataProvider: function (args) {
                                                    var data = {
                                                        id: args.context.networks[0].id
                                                    };
                                                    if (args.context.networks[0].projectid != null) {
                                                        $.extend(data, {
                                                            projectid: -1
                                                        });
                                                    } else {
                                                        $.extend(data, {
                                                            listAll: true //pass "&listAll=true" to "listNetworks&id=xxxxxxxx" for now before API gets fixed.
                                                        });
                                                    }
                                                    
                                                    $.ajax({
                                                        url: createURL("listNetworks"),
                                                        data: data,
                                                        async: false,
                                                        success: function (json) {
                                                            selectedGuestNetworkObj = json.listnetworksresponse.network[0];
                                                            addExtraPropertiesToGuestNetworkObject(selectedGuestNetworkObj);
                                                                                                                        
                                                            if (isModuleIncluded("dr")) {
                                                                cloudStack.dr.sharedFunctions.addExtraProperties(selectedGuestNetworkObj, "Network");  
                                                            }
                                                            
                                                            args.response.success({
                                                                actionFilter: cloudStack.actionFilter.guestNetwork,
                                                                data: selectedGuestNetworkObj
                                                            });
                                                        }
                                                    });
                                                }
                                            }
                                        }
                                    }
                                }
                            },
                            
                            dedicatedGuestVlanRanges: {
                                title: 'label.dedicated.vlan.vni.ranges',
                                listView: {
                                    section: 'dedicatedGuestVlanRanges',
                                    id: 'dedicatedGuestVlanRanges',
                                    fields: {
                                        guestvlanrange: {
                                            label: 'label.vlan.vni.ranges'
                                        },
                                        domain: {
                                            label: 'label.domain'
                                        },
                                        account: {
                                            label: 'label.account'
                                        }
                                    },
                                    dataProvider: function (args) {
                                        $.ajax({
                                            url: createURL('listDedicatedGuestVlanRanges'),
                                            data: {
                                                physicalnetworkid: args.context.physicalNetworks[0].id
                                            },
                                            success: function (json) {
                                                var items = json.listdedicatedguestvlanrangesresponse.dedicatedguestvlanrange;
                                                args.response.success({
                                                    data: items
                                                })
                                            }
                                        });
                                    },
                                    actions: {
                                        add: {
                                            label: 'label.dedicate.vlan.vni.range',
                                            messages: {
                                                notification: function (args) {
                                                    return 'label.dedicate.vlan.vni.range';
                                                }
                                            },
                                            createForm: {
                                                title: 'label.dedicate.vlan.vni.range',
                                                fields: {
                                                    vlanrange: {
                                                        label: 'label.vlan.vni.range',
                                                        /*  select: function(args) {
                                                        var items = [];
                                                        if(args.context.physicalNetworks[0].vlan != null && args.context.physicalNetworks[0].vlan.length > 0) {
                                                        var vlanranges = args.context.physicalNetworks[0].vlan.split(";");
                                                        for(var i = 0; i < vlanranges.length ; i++) {
                                                        items.push({id: vlanranges[i], description: vlanranges[i]});
                                                        }
                                                        }
                                                        args.response.success({data: items});
                                                        },*/
                                                        validation: {
                                                            required: true
                                                        }
                                                    },
                                                    account: {
                                                        label: 'label.account',
                                                        validation: {
                                                            required: true
                                                        }
                                                    },
                                                    domainid: {
                                                        label: 'label.domain',
                                                        validation: {
                                                            required: true
                                                        },
                                                        select: function (args) {
                                                            $.ajax({
                                                                url: createURL('listDomains'),
                                                                data: {
                                                                    listAll: true
                                                                },
                                                                success: function (json) {
                                                                    args.response.success({
                                                                        data: $.map(json.listdomainsresponse.domain, function (domain) {
                                                                            return {
                                                                                id: domain.id,
                                                                                description: domain.path
                                                                            };
                                                                        })
                                                                    });
                                                                }
                                                            });
                                                        }
                                                    }
                                                }
                                            },
                                            action: function (args) {
                                                var data = {
                                                    physicalnetworkid: args.context.physicalNetworks[0].id,
                                                    vlanrange: args.data.vlanrange,
                                                    domainid: args.data.domainid,
                                                    account: args.data.account
                                                };
                                                $.ajax({
                                                    url: createURL('dedicateGuestVlanRange'),
                                                    data: data,
                                                    success: function (json) {
                                                        var item = json.dedicateguestvlanrangeresponse.dedicatedguestvlanrange;
                                                        args.response.success({
                                                            data: item
                                                        });
                                                    }
                                                });
                                            },
                                            notification: {
                                                poll: function (args) {
                                                    args.complete();
                                                }
                                            }
                                        }
                                    },
                                    
                                    detailView: {
                                        name: 'label.vlan.range.details',
                                        actions: {
                                            remove: {
                                                label: 'label.release.dedicated.vlan.range',
                                                messages: {
                                                    confirm: function (args) {
                                                        return 'message.confirm.release.dedicate.vlan.range';
                                                    },
                                                    notification: function (args) {
                                                        return 'label.release.dedicated.vlan.range';
                                                    }
                                                },
                                                action: function (args) {
                                                    var data = {
                                                        id: args.context.dedicatedGuestVlanRanges[0].id
                                                    };
                                                    $.ajax({
                                                        url: createURL('releaseDedicatedGuestVlanRange'),
                                                        data: data,
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.releasededicatedguestvlanrangeresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            }
                                        },
                                        
                                        tabs: {
                                            details: {
                                                title: 'label.details',
                                                fields:[ {
                                                    guestvlanrange: {
                                                        label: 'label.vlan.ranges'
                                                    }
                                                },
                                                {
                                                    domain: {
                                                        label: 'label.domain'
                                                    },
                                                    account: {
                                                        label: 'label.account'
                                                    },
                                                    id: {
                                                        label: 'label.id'
                                                    }
                                                }],
                                                dataProvider: function (args) {
                                                    $.ajax({
                                                        url: createURL('listDedicatedGuestVlanRanges'),
                                                        data: {
                                                            id: args.context.dedicatedGuestVlanRanges[0].id
                                                        },
                                                        success: function (json) {
                                                            var item = json.listdedicatedguestvlanrangesresponse.dedicatedguestvlanrange[0];
                                                            args.response.success({
                                                                data: item
                                                            });
                                                        }
                                                    });
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            },
            
            networks: {
                listView: {
                    id: 'physicalNetworks',
                    hideToolbar: true,
                    fields: {
                        name: {
                            label: 'label.name'
                        },
                        state: {
                            converter: function (str) {
                                // For localization
                                return str;
                            },
                            label: 'label.state',
                            indicator: {
                                'Enabled': 'on',
                                'Disabled': 'off'
                            }
                        },
                        isolationmethods: {
                            label: 'label.isolation.method'
                        }
                    },
                    
                    actions: {
                        remove: {
                            label: 'label.action.delete.physical.network',
                            messages: {
                                confirm: function (args) {
                                    return 'message.action.delete.physical.network';
                                },
                                notification: function (args) {
                                    return 'label.action.delete.physical.network';
                                }
                            },
                            action: function (args) {
                                $.ajax({
                                    url: createURL("deletePhysicalNetwork&id=" + args.context.physicalNetworks[0].id),
                                    dataType: "json",
                                    async: true,
                                    success: function (json) {
                                        var jid = json.deletephysicalnetworkresponse.jobid;
                                        args.response.success({
                                            _custom: {
                                                jobId: jid
                                            }
                                        });
                                    }
                                });
                            },
                            notification: {
                                poll: pollAsyncJobResult
                            }
                        }
                    }
                },
                dataProvider: function (args) {
                    $.ajax({
                        url: createURL('listPhysicalNetworks'),
                        data: {
                            zoneid: args.context.zones[0].id
                        },
                        success: function (json) {
                            physicalNetworkObjs = json.listphysicalnetworksresponse.physicalnetwork;
                            args.response.success({
                                actionFilter: cloudStack.actionFilter.physicalNetwork,
                                data: json.listphysicalnetworksresponse.physicalnetwork
                            });
                        }
                    });
                }
            },
            
            trafficTypes: {
                dataProvider: function (args) {
                    selectedPhysicalNetworkObj = args.context.physicalNetworks[0];
                    
                    $.ajax({
                        url: createURL('listTrafficTypes'),
                        data: {
                            physicalnetworkid: selectedPhysicalNetworkObj.id
                        },
                        success: function (json) {
                            args.response.success({
                                data: $.map(json.listtraffictypesresponse.traffictype, function (trafficType) {
                                    return {
                                        id: trafficType.id,
                                        name: trafficType.traffictype
                                    };
                                })
                            });
                        }
                    });
                }
            },
            
            networkProviders: {
                statusLabels: {
                    enabled: 'Enabled', //having device, network service provider is enabled
                    'not-configured': 'Not setup', //no device
                    disabled: 'Disabled' //having device, network service provider is disabled
                },
                
                // Actions performed on entire net. provider type
                actions: {
                    enable: function (args) {
                        args.response.success();
                    },
                    
                    disable: function (args) {
                        args.response.success();
                    }
                },
                
                types: {
                    virtualRouter: {
                        id: 'virtualRouterProviders',
                        label: 'label.virtual.router',
                        isMaximized: true,
                        type: 'detailView',
                        fields: {
                            name: {
                                label: 'label.name'
                            },
                            ipaddress: {
                                label: 'label.ip.address'
                            },
                            state: {
                                label: 'label.status',
                                indicator: {
                                    'Enabled': 'on'
                                }
                            }
                        },
                        tabs: {
                            network: {
                                title: 'label.network',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    id: {
                                        label: 'label.id'
                                    },
                                    state: {
                                        label: 'label.state'
                                    },
                                    physicalnetworkid: {
                                        label: 'label.physical.network.ID'
                                    },
                                    destinationphysicalnetworkid: {
                                        label: 'label.destination.physical.network.id'
                                    },
                                    supportedServices: {
                                        label: 'label.supported.services'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("VirtualRouter");
                                    args.response.success({
                                        actionFilter: virtualRouterProviderActionFilter,
                                        data: $.extend(nspMap[ "virtualRouter"], {
                                            supportedServices: nspMap[ "virtualRouter"].servicelist.join(', ')
                                        })
                                    });
                                }
                            },
                            
                            instances: {
                                title: 'label.instances',
                                listView: {
                                    label: 'label.virtual.appliances',
                                    id: 'routers',
                                    fields: {
                                        name: {
                                            label: 'label.name'
                                        },
                                        zonename: {
                                            label: 'label.zone'
                                        },
                                        routerType: {
                                            label: 'label.type'
                                        },
                                        state: {
                                            converter: function (str) {
                                                // For localization
                                                return str;
                                            },
                                            label: 'label.status',
                                            indicator: {
                                                'Running': 'on',
                                                'Stopped': 'off',
                                                'Error': 'off'
                                            }
                                        }
                                    },
                                    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;
                                                }
                                            }
                                        }
                                        
                                        var data2 = {
                                            forvpc: false
                                        };
                                        var routers =[];
                                        $.ajax({
                                            url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                            data: data2,
                                            success: function (json) {
                                                var items = json.listroutersresponse.router ?
                                                json.listroutersresponse.router:[];
                                                
                                                $(items).map(function (index, item) {
                                                    routers.push(item);
                                                });
                                                
                                                /*
                                                 * In project view, the first listRotuers API(without projectid=-1) will return the same objects as the second listRouters API(with projectid=-1),
                                                 * because in project view, all API calls are appended with projectid=[projectID].  
                                                 * Therefore, we only call the second listRouters API(with projectid=-1) in non-project view.
                                                 */   
                                                if (cloudStack.context && cloudStack.context.projects == null) { //non-project view
                                                $.ajax({
                                                    url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
                                                    data: data2,
	                                                    async: false,
                                                    success: function (json) {
                                                        var items = json.listroutersresponse.router ?
                                                        json.listroutersresponse.router:[];
                                                        
                                                        $(items).map(function (index, item) {
                                                            routers.push(item);
                                                        });
	                                                    }
	                                                });
                                                }
                                                
                                                        args.response.success({
                                                            actionFilter: routerActionfilter,
                                                            data: $(routers).map(mapRouterType)
                                                        });
                                                    }
                                                });
                                    },
                                    detailView: {
                                        name: 'label.virtual.appliance.details',
                                        actions: {
                                            start: {
                                                label: 'label.action.start.router',
                                                messages: {
                                                    confirm: function (args) {
                                                        return 'message.action.start.router';
                                                    },
                                                    notification: function (args) {
                                                        return 'label.action.start.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL('startRouter&id=' + args.context.routers[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.startrouterresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        return json.queryasyncjobresultresponse.jobresult.router;
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return routerActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            stop: {
                                                label: 'label.action.stop.router',
                                                createForm: {
                                                    title: 'label.action.stop.router',
                                                    desc: 'message.action.stop.router',
                                                    fields: {
                                                        forced: {
                                                            label: 'force.stop',
                                                            isBoolean: true,
                                                            isChecked: false
                                                        }
                                                    }
                                                },
                                                messages: {
                                                    notification: function (args) {
                                                        return 'label.action.stop.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    var array1 =[];
                                                    array1.push("&forced=" + (args.data.forced == "on"));
                                                    $.ajax({
                                                        url: createURL('stopRouter&id=' + args.context.routers[0].id + array1.join("")),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.stoprouterresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        return json.queryasyncjobresultresponse.jobresult.router;
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return routerActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            'remove': {
                                                label: 'label.destroy.router',
                                                messages: {
                                                    confirm: function (args) {
                                                        return 'message.confirm.destroy.router';
                                                    },
                                                    notification: function (args) {
                                                        return 'label.destroy.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL("destroyRouter&id=" + args.context.routers[0].id),
                                                        dataType: "json",
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.destroyrouterresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            migrate: {
                                                label: 'label.action.migrate.router',
                                                createForm: {
                                                    title: 'label.action.migrate.router',
                                                    desc: '',
                                                    fields: {
                                                        hostId: {
                                                            label: 'label.host',
                                                            validation: {
                                                                required: true
                                                            },
                                                            select: function (args) {
                                                                $.ajax({
                                                                    url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.routers[0].id),
                                                                    dataType: "json",
                                                                    async: true,
                                                                    success: function (json) {
                                                                        var hostObjs = json.findhostsformigrationresponse.host;
                                                                        var items =[];
                                                                        $(hostObjs).each(function () {
                                                                            items.push({
                                                                                id: this.id,
                                                                                description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
                                                                            });
                                                                        });
                                                                        args.response.success({
                                                                            data: items
                                                                        });
                                                                    }
                                                                });
                                                            },
                                                            error: function (XMLHttpResponse) {
                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                                args.response.error(errorMsg);
                                                            }
                                                        }
                                                    }
                                                },
                                                messages: {
                                                    notification: function (args) {
                                                        return 'label.action.migrate.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.routers[0].id),
                                                        dataType: "json",
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.migratesystemvmresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
                                                                        $.ajax({
                                                                            url: createURL("listRouters&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
                                                                            dataType: "json",
                                                                            async: false,
                                                                            success: function (json) {
                                                                                var items = json.listroutersresponse.router;
                                                                                if (items != null && items.length > 0) {
                                                                                    return items[0];
                                                                                }
                                                                            }
                                                                        });
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return routerActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            viewConsole: {
                                                label: 'label.view.console',
                                                action: {
                                                    externalLink: {
                                                        url: function (args) {
                                                            return clientConsoleUrl + '?cmd=access&vm=' + args.context.routers[0].id;
                                                        },
                                                        title: function (args) {
                                                            return args.context.routers[0].id.substr(0, 8);
                                                            //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
                                                        },
                                                        width: 820,
                                                        height: 640
                                                    }
                                                }
                                            }
                                        },
                                        tabs: {
                                            details: {
                                                title: 'label.details',
                                                preFilter: function (args) {
                                                    var hiddenFields =[];
                                                    if (! args.context.routers[0].project) {
                                                        hiddenFields.push('project');
                                                        hiddenFields.push('projectid');
                                                    }
                                                    if (selectedZoneObj.networktype == 'Basic') {
                                                        hiddenFields.push('publicip');
                                                        //In Basic zone, guest IP is public IP. So, publicip is not returned by listRouters API. Only guestipaddress is returned by listRouters API.
                                                    }
                                                    return hiddenFields;
                                                },
                                                fields:[ {
                                                    name: {
                                                        label: 'label.name'
                                                    },
                                                    project: {
                                                        label: 'label.project'
                                                    }
                                                },
                                                {
                                                    id: {
                                                        label: 'label.id'
                                                    },
                                                    projectid: {
                                                        label: 'label.project.id'
                                                    },
                                                    state: {
                                                        label: 'label.state'
                                                    },
                                                    guestnetworkid: {
                                                        label: 'label.network.id'
                                                    },
                                                    publicip: {
                                                        label: 'label.public.ip'
                                                    },
                                                    guestipaddress: {
                                                        label: 'label.guest.ip'
                                                    },
                                                    linklocalip: {
                                                        label: 'label.linklocal.ip'
                                                    },
                                                    hostname: {
                                                        label: 'label.host'
                                                    },
                                                    serviceofferingname: {
                                                        label: 'label.compute.offering'
                                                    },
                                                    networkdomain: {
                                                        label: 'label.network.domain'
                                                    },
                                                    domain: {
                                                        label: 'label.domain'
                                                    },
                                                    account: {
                                                        label: 'label.account'
                                                    },
                                                    created: {
                                                        label: 'label.created',
                                                        converter: cloudStack.converters.toLocalDate
                                                    },
                                                    isredundantrouter: {
                                                        label: 'label.redundant.router',
                                                        converter: cloudStack.converters.toBooleanText
                                                    },
                                                    redundantRouterState: {
                                                        label: 'label.redundant.state'
                                                    }
                                                }],
                                                dataProvider: function (args) {
                                                    $.ajax({
                                                        url: createURL("listRouters&id=" + args.context.routers[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jsonObj = json.listroutersresponse.router[0];
                                                            addExtraPropertiesToRouterInstanceObject(jsonObj);
                                                            args.response.success({
                                                                actionFilter: routerActionfilter,
                                                                data: jsonObj
                                                            });
                                                        }
                                                    });
                                                }
                                            },
                                            nics: {
                                                title: 'label.nics',
                                                multiple: true,
                                                fields:[ {
                                                    name: {
                                                        label: 'label.name',
                                                        header: true
                                                    },
                                                    type: {
                                                        label: 'label.type'
                                                    },
                                                    traffictype: {
                                                        label: 'label.traffic.type'
                                                    },
                                                    networkname: {
                                                        label: 'label.network.name'
                                                    },
                                                    netmask: {
                                                        label: 'label.netmask'
                                                    },
                                                    ipaddress: {
                                                        label: 'label.ip.address'
                                                    },
                                                    id: {
                                                        label: 'label.id'
                                                    },
                                                    networkid: {
                                                        label: 'label.network.id'
                                                    },
                                                    isolationuri: {
                                                        label: 'label.isolation.uri'
                                                    },
                                                    broadcasturi: {
                                                        label: 'label.broadcast.uri'
                                                    }
                                                }],
                                                dataProvider: function (args) {
                                                    $.ajax({
                                                        url: createURL("listRouters&id=" + args.context.routers[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jsonObj = json.listroutersresponse.router[0].nic;
                                                            
                                                            args.response.success({
                                                                actionFilter: routerActionfilter,
                                                                data: $.map(jsonObj, function (nic, index) {
                                                                    var name = 'NIC ' + (index + 1);
                                                                    if (nic.isdefault) {
                                                                        name += ' (' + _l('label.default') + ')';
                                                                    }
                                                                    return $.extend(nic, {
                                                                        name: name
                                                                    });
                                                                })
                                                            });
                                                        }
                                                    });
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        },
                        actions: {
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "virtualRouter"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "virtualRouter"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    
                    InternalLbVm: {
                        id: 'InternalLbVm',
                        label: 'label.internallbvm',
                        isMaximized: true,
                        type: 'detailView',
                        fields: {
                            name: {
                                label: 'label.name'
                            },
                            ipaddress: {
                                label: 'label.ip.address'
                            },
                            state: {
                                label: 'label.status',
                                indicator: {
                                    'Enabled': 'on'
                                }
                            }
                        },
                        tabs: {
                            network: {
                                title: 'label.network',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    id: {
                                        label: 'label.id'
                                    },
                                    state: {
                                        label: 'label.state'
                                    },
                                    physicalnetworkid: {
                                        label: 'label.physical.network.ID'
                                    },
                                    destinationphysicalnetworkid: {
                                        label: 'label.destination.physical.network.id'
                                    },
                                    supportedServices: {
                                        label: 'label.supported.services'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("InternalLbVm");
                                    args.response.success({
                                        actionFilter: virtualRouterProviderActionFilter,
                                        data: $.extend(nspMap[ "InternalLbVm"], {
                                            supportedServices: nspMap[ "InternalLbVm"].servicelist.join(', ')
                                        })
                                    });
                                }
                            },
                            
                            instances: {
                                title: 'label.instances',
                                listView: {
                                    label: 'label.virtual.appliances',
                                    id: 'internallbinstances',
                                    fields: {
                                        name: {
                                            label: 'label.name'
                                        },
                                        zonename: {
                                            label: 'label.zone'
                                        },
                                        routerType: {
                                            label: 'label.type'
                                        },
                                        state: {
                                            converter: function (str) {
                                                // For localization
                                                return str;
                                            },
                                            label: 'label.status',
                                            indicator: {
                                                'Running': 'on',
                                                'Stopped': 'off',
                                                'Error': 'off'
                                            }
                                        }
                                    },
                                    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;
                                                }
                                            }
                                        }
                                        
                                        var routers =[];
                                        $.ajax({
                                            url: createURL("listInternalLoadBalancerVMs&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                            success: function (json) {
                                                var items = json.listinternallbvmssresponse.internalloadbalancervm ?
                                                json.listinternallbvmssresponse.internalloadbalancervm:[];
                                                
                                                $(items).map(function (index, item) {
                                                    routers.push(item);
                                                });
                                                
                                                // Get project routers
                                                $.ajax({
                                                    url: createURL("listInternalLoadBalancerVMs&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
                                                    success: function (json) {
                                                        var items = json.listinternallbvmssresponse.internalloadbalancervm ?
                                                        json.listinternallbvmssresponse.internalloadbalancervm:[];
                                                        
                                                        $(items).map(function (index, item) {
                                                            routers.push(item);
                                                        });
                                                        args.response.success({
                                                            actionFilter: internallbinstanceActionfilter,
                                                            data: $(routers).map(mapRouterType)
                                                        });
                                                    }
                                                });
                                            }
                                        });
                                    },
                                    detailView: {
                                        name: 'label.virtual.appliance.details',
                                        actions: {
                                            start: {
                                                label: 'label.start.lb.vm',
                                                messages: {
                                                    confirm: function (args) {
                                                        return 'message.confirm.start.lb.vm';
                                                    },
                                                    notification: function (args) {
                                                        return 'label.start.lb.vm';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL('startInternalLoadBalancerVM&id=' + args.context.internallbinstances[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.startinternallbvmresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        return json.queryasyncjobresultresponse.jobresult.internalloadbalancervm;
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return internallbinstanceActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            stop: {
                                                label: 'label.stop.lb.vm',
                                                createForm: {
                                                    title: 'message.confirm.stop.lb.vm',
                                                    desc: 'label.stop.lb.vm',
                                                    fields: {
                                                        forced: {
                                                            label: 'force.stop',
                                                            isBoolean: true,
                                                            isChecked: false
                                                        }
                                                    }
                                                },
                                                messages: {
                                                    notification: function (args) {
                                                        return 'label.stop.lb.vm';
                                                    }
                                                },
                                                action: function (args) {
                                                    var array1 =[];
                                                    array1.push("&forced=" + (args.data.forced == "on"));
                                                    $.ajax({
                                                        url: createURL('stopInternalLoadBalancerVM&id=' + args.context.internallbinstances[0].id + array1.join("")),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.stopinternallbvmresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        return json.queryasyncjobresultresponse.jobresult.internalloadbalancervm;
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return internallbinstanceActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            migrate: {
                                                label: 'label.migrate.lb.vm',
                                                createForm: {
                                                    title: 'label.migrate.lb.vm',
                                                    fields: {
                                                        hostId: {
                                                            label: 'label.host',
                                                            validation: {
                                                                required: true
                                                            },
                                                            select: function (args) {
                                                                $.ajax({
                                                                    url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.internallbinstances[0].id),
                                                                    dataType: "json",
                                                                    async: true,
                                                                    success: function (json) {
                                                                        var hostObjs = json.findhostsformigrationresponse.host;
                                                                        var items =[];
                                                                        $(hostObjs).each(function () {
                                                                            items.push({
                                                                                id: this.id,
                                                                                description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
                                                                            });
                                                                        });
                                                                        args.response.success({
                                                                            data: items
                                                                        });
                                                                    }
                                                                });
                                                            },
                                                            error: function (XMLHttpResponse) {
                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                                args.response.error(errorMsg);
                                                            }
                                                        }
                                                    }
                                                },
                                                messages: {
                                                    notification: function (args) {
                                                        return 'label.migrate.lb.vm';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.internallbinstances[0].id),
                                                        dataType: "json",
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.migratesystemvmresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
                                                                        $.ajax({
                                                                            url: createURL("listInternalLoadBalancerVMs&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
                                                                            dataType: "json",
                                                                            async: false,
                                                                            success: function (json) {
                                                                                var items = json.listinternallbvmssresponse.internalloadbalancervm;
                                                                                if (items != null && items.length > 0) {
                                                                                    return items[0];
                                                                                }
                                                                            }
                                                                        });
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return internallbinstanceActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            viewConsole: {
                                                label: 'label.view.console',
                                                action: {
                                                    externalLink: {
                                                        url: function (args) {
                                                            return clientConsoleUrl + '?cmd=access&vm=' + args.context.internallbinstances[0].id;
                                                        },
                                                        title: function (args) {
                                                            return args.context.internallbinstances[0].id.substr(0, 8);
                                                            //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
                                                        },
                                                        width: 820,
                                                        height: 640
                                                    }
                                                }
                                            }
                                        },
                                        tabs: {
                                            details: {
                                                title: 'label.details',
                                                preFilter: function (args) {
                                                    var hiddenFields =[];
                                                    if (! args.context.internallbinstances[0].project) {
                                                        hiddenFields.push('project');
                                                        hiddenFields.push('projectid');
                                                    }
                                                    if (selectedZoneObj.networktype == 'Basic') {
                                                        hiddenFields.push('publicip');
                                                        //In Basic zone, guest IP is public IP. So, publicip is not returned by listRouters API. Only guestipaddress is returned by listRouters API.
                                                    }
                                                    return hiddenFields;
                                                },
                                                fields:[ {
                                                    name: {
                                                        label: 'label.name'
                                                    },
                                                    project: {
                                                        label: 'label.project'
                                                    }
                                                },
                                                {
                                                    id: {
                                                        label: 'label.id'
                                                    },
                                                    projectid: {
                                                        label: 'label.project.id'
                                                    },
                                                    state: {
                                                        label: 'label.state'
                                                    },
                                                    guestnetworkid: {
                                                        label: 'label.network.id'
                                                    },
                                                    publicip: {
                                                        label: 'label.public.ip'
                                                    },
                                                    guestipaddress: {
                                                        label: 'label.guest.ip'
                                                    },
                                                    linklocalip: {
                                                        label: 'label.linklocal.ip'
                                                    },
                                                    hostname: {
                                                        label: 'label.host'
                                                    },
                                                    serviceofferingname: {
                                                        label: 'label.compute.offering'
                                                    },
                                                    networkdomain: {
                                                        label: 'label.network.domain'
                                                    },
                                                    domain: {
                                                        label: 'label.domain'
                                                    },
                                                    account: {
                                                        label: 'label.account'
                                                    },
                                                    created: {
                                                        label: 'label.created',
                                                        converter: cloudStack.converters.toLocalDate
                                                    },
                                                    isredundantrouter: {
                                                        label: 'label.redundant.router',
                                                        converter: cloudStack.converters.toBooleanText
                                                    },
                                                    redundantRouterState: {
                                                        label: 'label.redundant.state'
                                                    }
                                                }],
                                                dataProvider: function (args) {
                                                    $.ajax({
                                                        url: createURL("listInternalLoadBalancerVMs&id=" + args.context.internallbinstances[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jsonObj = json.listinternallbvmssresponse.internalloadbalancervm[0];
                                                            addExtraPropertiesToRouterInstanceObject(jsonObj);
                                                            args.response.success({
                                                                actionFilter: internallbinstanceActionfilter,
                                                                data: jsonObj
                                                            });
                                                        }
                                                    });
                                                }
                                            },
                                            nics: {
                                                title: 'label.nics',
                                                multiple: true,
                                                fields:[ {
                                                    name: {
                                                        label: 'label.name',
                                                        header: true
                                                    },
                                                    type: {
                                                        label: 'label.type'
                                                    },
                                                    traffictype: {
                                                        label: 'label.traffic.type'
                                                    },
                                                    networkname: {
                                                        label: 'label.network.name'
                                                    },
                                                    netmask: {
                                                        label: 'label.netmask'
                                                    },
                                                    ipaddress: {
                                                        label: 'label.ip.address'
                                                    },
                                                    id: {
                                                        label: 'label.id'
                                                    },
                                                    networkid: {
                                                        label: 'label.network.id'
                                                    },
                                                    isolationuri: {
                                                        label: 'label.isolation.uri'
                                                    },
                                                    broadcasturi: {
                                                        label: 'label.broadcast.uri'
                                                    }
                                                }],
                                                dataProvider: function (args) {
                                                    $.ajax({
                                                        url: createURL("listInternalLoadBalancerVMs&id=" + args.context.internallbinstances[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jsonObj = json.listinternallbvmssresponse.internalloadbalancervm[0].nic;
                                                            
                                                            args.response.success({
                                                                actionFilter: internallbinstanceActionfilter,
                                                                data: $.map(jsonObj, function (nic, index) {
                                                                    var name = 'NIC ' + (index + 1);
                                                                    if (nic.isdefault) {
                                                                        name += ' (' + _l('label.default') + ')';
                                                                    }
                                                                    return $.extend(nic, {
                                                                        name: name
                                                                    });
                                                                })
                                                            });
                                                        }
                                                    });
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        },
                        actions: {
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "InternalLbVm"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "InternalLbVm"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    
                    vpcVirtualRouter: {
                        id: 'vpcVirtualRouterProviders',
                        label: 'label.vpc.virtual.router',
                        isMaximized: true,
                        type: 'detailView',
                        fields: {
                            name: {
                                label: 'label.name'
                            },
                            ipaddress: {
                                label: 'label.ip.address'
                            },
                            state: {
                                label: 'label.status',
                                indicator: {
                                    'Enabled': 'on'
                                }
                            }
                        },
                        tabs: {
                            network: {
                                title: 'label.network',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    id: {
                                        label: 'label.id'
                                    },
                                    state: {
                                        label: 'label.state'
                                    },
                                    physicalnetworkid: {
                                        label: 'label.physical.network.ID'
                                    },
                                    destinationphysicalnetworkid: {
                                        label: 'label.destination.physical.network.id'
                                    },
                                    supportedServices: {
                                        label: 'label.supported.services'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("VpcVirtualRouter");
                                    args.response.success({
                                        actionFilter: virtualRouterProviderActionFilter,
                                        data: $.extend(nspMap[ "vpcVirtualRouter"], {
                                            supportedServices: nspMap[ "vpcVirtualRouter"].servicelist.join(', ')
                                        })
                                    });
                                }
                            },
                            
                            instances: {
                                title: 'label.instances',
                                listView: {
                                    label: 'label.virtual.appliances',
                                    id: 'routers',
                                    fields: {
                                        name: {
                                            label: 'label.name'
                                        },
                                        zonename: {
                                            label: 'label.zone'
                                        },
                                        routerType: {
                                            label: 'label.type'
                                        },
                                        state: {
                                            converter: function (str) {
                                                // For localization
                                                return str;
                                            },
                                            label: 'label.status',
                                            indicator: {
                                                'Running': 'on',
                                                'Stopped': 'off',
                                                'Error': 'off'
                                            }
                                        }
                                    },
                                    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;
                                                }
                                            }
                                        }
                                        
                                        var data2 = {
                                            forvpc: true
                                        };
                                        var routers =[];
                                        $.ajax({
                                            url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                            dataType: 'json',
                                            data: data2,
                                            async: true,
                                            success: function (json) {
                                                var items = json.listroutersresponse.router;
                                                $(items).map(function (index, item) {
                                                    routers.push(item);
                                                });
                                                
                                                /*
                                                 * In project view, the first listRotuers API(without projectid=-1) will return the same objects as the second listRouters API(with projectid=-1),
                                                 * because in project view, all API calls are appended with projectid=[projectID].  
                                                 * Therefore, we only call the second listRouters API(with projectid=-1) in non-project view.
                                                 */   
                                                if (cloudStack.context && cloudStack.context.projects == null) { //non-project view
                                                $.ajax({
                                                    url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
                                                    dataType: 'json',
                                                    data: data2,
	                                                    async: false,
                                                    success: function (json) {
                                                        var items = json.listroutersresponse.router;
                                                        $(items).map(function (index, item) {
                                                            routers.push(item);
                                                        });
	                                                    }
	                                                });
                                                }
                                                
                                                        args.response.success({
                                                            actionFilter: routerActionfilter,
                                                            data: $(routers).map(mapRouterType)
                                                        });
                                                    }
                                                });
                                    },
                                    detailView: {
                                        name: 'label.virtual.appliance.details',
                                        actions: {
                                            start: {
                                                label: 'label.action.start.router',
                                                messages: {
                                                    confirm: function (args) {
                                                        return 'message.action.start.router';
                                                    },
                                                    notification: function (args) {
                                                        return 'label.action.start.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL('startRouter&id=' + args.context.routers[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.startrouterresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        return json.queryasyncjobresultresponse.jobresult.router;
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return routerActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            stop: {
                                                label: 'label.action.stop.router',
                                                createForm: {
                                                    title: 'label.action.stop.router',
                                                    desc: 'message.action.stop.router',
                                                    fields: {
                                                        forced: {
                                                            label: 'force.stop',
                                                            isBoolean: true,
                                                            isChecked: false
                                                        }
                                                    }
                                                },
                                                messages: {
                                                    notification: function (args) {
                                                        return 'label.action.stop.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    var array1 =[];
                                                    array1.push("&forced=" + (args.data.forced == "on"));
                                                    $.ajax({
                                                        url: createURL('stopRouter&id=' + args.context.routers[0].id + array1.join("")),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.stoprouterresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        return json.queryasyncjobresultresponse.jobresult.router;
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return routerActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            restart: {
                                                label: 'label.action.reboot.router',
                                                messages: {
                                                    confirm: function (args) {
                                                        return 'message.action.reboot.router';
                                                    },
                                                    notification: function (args) {
                                                        return 'label.action.reboot.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL('rebootRouter&id=' + args.context.routers[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.rebootrouterresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        return json.queryasyncjobresultresponse.jobresult.router;
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return routerActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            'remove': {
                                                label: 'label.destroy.router',
                                                messages: {
                                                    confirm: function (args) {
                                                        return 'message.confirm.destroy.router';
                                                    },
                                                    notification: function (args) {
                                                        return 'label.destroy.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL("destroyRouter&id=" + args.context.routers[0].id),
                                                        dataType: "json",
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.destroyrouterresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            migrate: {
                                                label: 'label.action.migrate.router',
                                                createForm: {
                                                    title: 'label.action.migrate.router',
                                                    desc: '',
                                                    fields: {
                                                        hostId: {
                                                            label: 'label.host',
                                                            validation: {
                                                                required: true
                                                            },
                                                            select: function (args) {
                                                                $.ajax({
                                                                    url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.routers[0].id),
                                                                    dataType: "json",
                                                                    async: true,
                                                                    success: function (json) {
                                                                        var hostObjs = json.findhostsformigrationresponse.host;
                                                                        var items =[];
                                                                        $(hostObjs).each(function () {
                                                                            items.push({
                                                                                id: this.id,
                                                                                description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
                                                                            });
                                                                        });
                                                                        args.response.success({
                                                                            data: items
                                                                        });
                                                                    }
                                                                });
                                                            },
                                                            error: function (XMLHttpResponse) {
                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                                args.response.error(errorMsg);
                                                            }
                                                        }
                                                    }
                                                },
                                                messages: {
                                                    notification: function (args) {
                                                        return 'label.action.migrate.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.routers[0].id),
                                                        dataType: "json",
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.migratesystemvmresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
                                                                        $.ajax({
                                                                            url: createURL("listRouters&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
                                                                            dataType: "json",
                                                                            async: false,
                                                                            success: function (json) {
                                                                                var items = json.listroutersresponse.router;
                                                                                if (items != null && items.length > 0) {
                                                                                    return items[0];
                                                                                }
                                                                            }
                                                                        });
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return routerActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            viewConsole: {
                                                label: 'label.view.console',
                                                action: {
                                                    externalLink: {
                                                        url: function (args) {
                                                            return clientConsoleUrl + '?cmd=access&vm=' + args.context.routers[0].id;
                                                        },
                                                        title: function (args) {
                                                            return args.context.routers[0].id.substr(0, 8);
                                                            //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
                                                        },
                                                        width: 820,
                                                        height: 640
                                                    }
                                                }
                                            }
                                        },
                                        tabs: {
                                            details: {
                                                title: 'label.details',
                                                preFilter: function (args) {
                                                    var hiddenFields =[];
                                                    if (! args.context.routers[0].project) {
                                                        hiddenFields.push('project');
                                                        hiddenFields.push('projectid');
                                                    }
                                                    if (selectedZoneObj.networktype == 'Basic') {
                                                        hiddenFields.push('publicip');
                                                        //In Basic zone, guest IP is public IP. So, publicip is not returned by listRouters API. Only guestipaddress is returned by listRouters API.
                                                    }
                                                    return hiddenFields;
                                                },
                                                fields:[ {
                                                    name: {
                                                        label: 'label.name'
                                                    },
                                                    project: {
                                                        label: 'label.project'
                                                    }
                                                },
                                                {
                                                    id: {
                                                        label: 'label.id'
                                                    },
                                                    projectid: {
                                                        label: 'label.project.id'
                                                    },
                                                    state: {
                                                        label: 'label.state'
                                                    },
                                                    publicip: {
                                                        label: 'label.public.ip'
                                                    },
                                                    guestipaddress: {
                                                        label: 'label.guest.ip'
                                                    },
                                                    linklocalip: {
                                                        label: 'label.linklocal.ip'
                                                    },
                                                    hostname: {
                                                        label: 'label.host'
                                                    },
                                                    serviceofferingname: {
                                                        label: 'label.compute.offering'
                                                    },
                                                    networkdomain: {
                                                        label: 'label.network.domain'
                                                    },
                                                    domain: {
                                                        label: 'label.domain'
                                                    },
                                                    account: {
                                                        label: 'label.account'
                                                    },
                                                    created: {
                                                        label: 'label.created',
                                                        converter: cloudStack.converters.toLocalDate
                                                    },
                                                    isredundantrouter: {
                                                        label: 'label.redundant.router',
                                                        converter: cloudStack.converters.toBooleanText
                                                    },
                                                    redundantRouterState: {
                                                        label: 'label.redundant.state'
                                                    },
                                                    vpcid: {
                                                        label: 'label.vpc.id'
                                                    }
                                                }],
                                                dataProvider: function (args) {
                                                    $.ajax({
                                                        url: createURL("listRouters&id=" + args.context.routers[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jsonObj = json.listroutersresponse.router[0];
                                                            addExtraPropertiesToRouterInstanceObject(jsonObj);
                                                            args.response.success({
                                                                actionFilter: routerActionfilter,
                                                                data: jsonObj
                                                            });
                                                        }
                                                    });
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        },
                        actions: {
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "vpcVirtualRouter"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "vpcVirtualRouter"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    
                    Ovs: {
                        id: "Ovs",
                        label: "label.ovs",
                        isMaximized: true,
                        type: 'detailView',
                        fields: {
                            name: {
                                label: 'label.name'
                            },                          
                            state: {
                                label: 'label.status',
                                indicator: {
                                    'Enabled': 'on'
                                }
                            }
                        },
                        tabs: {
                            network: {
                                title: 'label.network',
                                fields: [{
                                    name: {
                                        label: 'label.name'
                                    }
                                }, {                                    
                                    state: {
                                        label: 'label.state'
                                    },                                                                      
                                    supportedServices: {
                                        label: 'label.supported.services'
                                    },
                                    id: {
                                        label: 'label.id'
                                    },
                                    physicalnetworkid: {
                                        label: 'label.physical.network.ID'
                                    }
                                }],
                                dataProvider: function(args) {
                                    refreshNspData("Ovs");
                                    args.response.success({
                                        actionFilter: ovsProviderActionFilter,
                                        data: $.extend(nspMap["Ovs"], {
                                            supportedServices: nspMap["Ovs"] == undefined? "": nspMap["Ovs"].servicelist.join(', ')
                                        })
                                    });
                                }
                            },
                        },
                        actions: {
                            enable: {
                                label: 'label.enable.provider',
                                action: function(args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap["Ovs"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function(json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function(json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function(args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function() {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function(args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap["Ovs"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function(json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function(json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function(args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function() {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },                    
                   
                    // NetScaler provider detail view
                    netscaler: {
                        type: 'detailView',
                        id: 'netscalerProvider',
                        label: 'label.netScaler',
                        viewAll: {
                            label: 'label.devices',
                            path: '_zone.netscalerDevices'
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    state: {
                                        label: 'label.state'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("Netscaler");
                                    var providerObj;
                                    $(nspHardcodingArray).each(function () {
                                        if (this.id == "netscaler") {
                                            providerObj = this;
                                            return false; //break each loop
                                        }
                                    });
                                    args.response.success({
                                        data: providerObj,
                                        actionFilter: networkProviderActionFilter('netscaler')
                                    });
                                }
                            }
                        },
                        actions: {
                            add: {
                                label: 'label.add.netScaler.device',
                                createForm: {
                                    title: 'label.add.netScaler.device',
                                    preFilter: cloudStack.preFilter.addLoadBalancerDevice,
                                    fields: {
                                        ip: {
                                            label: 'label.ip.address',
                                            docID: 'helpNetScalerIPAddress'
                                        },
                                        username: {
                                            label: 'label.username',
                                            docID: 'helpNetScalerUsername'
                                        },
                                        password: {
                                            label: 'label.password',
                                            isPassword: true,
                                            docID: 'helpNetScalerPassword'
                                        },
                                        networkdevicetype: {
                                            label: 'label.type',
                                            docID: 'helpNetScalerType',
                                            select: function (args) {
                                                var items =[];
                                                items.push({
                                                    id: "NetscalerMPXLoadBalancer",
                                                    description: "NetScaler MPX LoadBalancer"
                                                });
                                                items.push({
                                                    id: "NetscalerVPXLoadBalancer",
                                                    description: "NetScaler VPX LoadBalancer"
                                                });
                                                items.push({
                                                    id: "NetscalerSDXLoadBalancer",
                                                    description: "NetScaler SDX LoadBalancer"
                                                });
                                                args.response.success({
                                                    data: items
                                                });
                                            }
                                        },
                                        publicinterface: {
                                            label: 'label.public.interface',
                                            docID: 'helpNetScalerPublicInterface'
                                        },
                                        privateinterface: {
                                            label: 'label.private.interface',
                                            docID: 'helpNetScalerPrivateInterface'
                                        },
                                        
                                        gslbprovider: {
                                            label: 'label.gslb.service',
                                            isBoolean: true,
                                            isChecked: false
                                        },
                                        gslbproviderpublicip: {
                                            label: 'label.gslb.service.public.ip'
                                        },
                                        gslbproviderprivateip: {
                                            label: 'label.gslb.service.private.ip'
                                        },
                                        
                                        numretries: {
                                            label: 'label.numretries',
                                            defaultValue: '2',
                                            docID: 'helpNetScalerRetries'
                                        },
                                        // inline: {
                                        //   label: 'Mode',
                                        //   select: function(args) {
                                        //     var items = [];
                                        //     items.push({id: "false", description: "side by side"});
                                        //     items.push({id: "true", description: "inline"});
                                        //     args.response.success({data: items});
                                        //   }
                                        // },
                                        dedicated: {
                                            label: 'label.dedicated',
                                            isBoolean: true,
                                            isChecked: false,
                                            docID: 'helpNetScalerDedicated'
                                        },
                                        capacity: {
                                            label: 'label.capacity',
                                            validation: {
                                                required: false,
                                                number: true
                                            },
                                            docID: 'helpNetScalerCapacity'
                                        }
                                    }
                                },
                                messages: {
                                    notification: function (args) {
                                        return 'label.add.netScaler.device';
                                    }
                                },
                                action: function (args) {
                                    if (nspMap[ "netscaler"] == null) {
                                        $.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);
                                            }
                                        });
                                    } else {
                                        addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addNetscalerLoadBalancer", "addnetscalerloadbalancerresponse", "netscalerloadbalancer");
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "netscaler"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "netscaler"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            destroy: {
                                label: 'label.shutdown.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "netscaler"].id),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                            
                                            $(window).trigger('cloudStack.fullRefresh');
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.shutdown.provider';
                                    },
                                    notification: function (args) {
                                        return 'label.shutdown.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    
                    //Baremetal DHCP provider detail view
                    BaremetalDhcpProvider: {
                        type: 'detailView',
                        id: 'BaremetalDhcpProvider',
                        label: 'label.baremetal.dhcp.provider',
                        viewAll: {
                            label: 'label.devices',
                            path: '_zone.BaremetalDhcpDevices'
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    state: {
                                        label: 'label.state'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("BaremetalDhcpProvider");
                                    var providerObj;
                                    $(nspHardcodingArray).each(function () {
                                        if (this.id == "BaremetalDhcpProvider") {
                                            providerObj = this;
                                            return false; //break each loop
                                        }
                                    });
                                    args.response.success({
                                        data: providerObj,
                                        actionFilter: networkProviderActionFilter('BaremetalDhcpProvider')
                                    });
                                }
                            }
                        },
                        actions: {
                            add: {
                                label: 'label.add.baremetal.dhcp.device',
                                createForm: {
                                    title: 'label.add.baremetal.dhcp.device',
                                    fields: {
                                        url: {
                                            label: 'label.url',
                                            validation: {
                                                required: true
                                            }
                                        },
                                        username: {
                                            label: 'label.username',
                                            validation: {
                                                required: true
                                            }
                                        },
                                        password: {
                                            label: 'label.password',
                                            isPassword: true,
                                            validation: {
                                                required: true
                                            }
                                        }
                                    }
                                },
                                action: function (args) {
                                    addBaremetalDhcpDeviceFn(args);
                                },
                                messages: {
                                    notification: function (args) {
                                        return 'label.add.baremetal.dhcp.device';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "BaremetalDhcpProvider"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "BaremetalDhcpProvider"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            destroy: {
                                label: 'label.shutdown.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "BaremetalDhcpProvider"].id),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                            
                                            $(window).trigger('cloudStack.fullRefresh');
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.shutdown.provider';
                                    },
                                    notification: function (args) {
                                        return 'label.shutdown.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    
                    //Baremetal PXE provider detail view
                    BaremetalPxeProvider: {
                        type: 'detailView',
                        id: 'BaremetalPxeProvider',
                        label: 'label.baremetal.pxe.provider',
                        viewAll: {
                            label: 'label.devices',
                            path: '_zone.BaremetalPxeDevices'
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    state: {
                                        label: 'label.state'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("BaremetalPxeProvider");
                                    var providerObj;
                                    $(nspHardcodingArray).each(function () {
                                        if (this.id == "BaremetalPxeProvider") {
                                            providerObj = this;
                                            return false; //break each loop
                                        }
                                    });
                                    args.response.success({
                                        data: providerObj,
                                        actionFilter: networkProviderActionFilter('BaremetalPxeProvider')
                                    });
                                }
                            }
                        },
                        actions: {
                            add: {
                                label: 'label.baremetal.pxe.device',
                                createForm: {
                                    title: 'label.baremetal.pxe.device',
                                    fields: {
                                        url: {
                                            label: 'label.url',
                                            validation: {
                                                required: true
                                            }
                                        },
                                        username: {
                                            label: 'label.username',
                                            validation: {
                                                required: true
                                            }
                                        },
                                        password: {
                                            label: 'label.password',
                                            isPassword: true,
                                            validation: {
                                                required: true
                                            }
                                        },
                                        tftpdir: {
                                            label: 'label.tftp.root.directory',
                                            validation: {
                                                required: true
                                            }
                                        }
                                    }
                                },
                                action: function (args) {
                                    addBaremetalPxeDeviceFn(args);
                                },
                                messages: {
                                    notification: function (args) {
                                        return 'label.baremetal.pxe.device';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "BaremetalPxeProvider"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "BaremetalPxeProvider"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            destroy: {
                                label: 'label.shutdown.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "BaremetalPxeProvider"].id),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                            
                                            $(window).trigger('cloudStack.fullRefresh');
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.shutdown.provider';
                                    },
                                    notification: function (args) {
                                        return 'label.shutdown.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    
                    //f5 provider detail view
                    f5: {
                        type: 'detailView',
                        id: 'f5Provider',
                        label: 'label.f5',
                        viewAll: {
                            label: 'label.devices',
                            path: '_zone.f5Devices'
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    state: {
                                        label: 'label.state'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("F5BigIp");
                                    var providerObj;
                                    $(nspHardcodingArray).each(function () {
                                        if (this.id == "f5") {
                                            providerObj = this;
                                            return false; //break each loop
                                        }
                                    });
                                    args.response.success({
                                        data: providerObj,
                                        actionFilter: networkProviderActionFilter('f5')
                                    });
                                }
                            }
                        },
                        actions: {
                            add: {
                                label: 'label.add.F5.device',
                                createForm: {
                                    title: 'label.add.F5.device',
                                    preFilter: cloudStack.preFilter.addLoadBalancerDevice,
                                    fields: {
                                        ip: {
                                            label: 'label.ip.address',
                                            docID: 'helpF5IPAddress'
                                        },
                                        username: {
                                            label: 'label.username',
                                            docID: 'helpF5Username'
                                        },
                                        password: {
                                            label: 'label.password',
                                            docID: 'helpF5Password',
                                            isPassword: true
                                        },
                                        networkdevicetype: {
                                            label: 'label.type',
                                            docID: 'helpF5Type',
                                            select: function (args) {
                                                var items =[];
                                                items.push({
                                                    id: "F5BigIpLoadBalancer",
                                                    description: "F5 Big Ip Load Balancer"
                                                });
                                                args.response.success({
                                                    data: items
                                                });
                                            }
                                        },
                                        publicinterface: {
                                            label: 'label.public.interface',
                                            docID: 'helpF5PublicInterface'
                                        },
                                        privateinterface: {
                                            label: 'label.private.interface',
                                            docID: 'helpF5PrivateInterface'
                                        },
                                        numretries: {
                                            label: 'label.numretries',
                                            docID: 'helpF5Retries',
                                            defaultValue: '2'
                                        },
                                        //Inline Mode has been moved from Add F5 Device to Create Network Offering (both backend and UI)
                                        /*
                                        inline: {
                                        label: 'Mode',
                                        docID: 'helpF5Mode',
                                        select: function(args) {
                                        var items = [];
                                        items.push({id: "false", description: "side by side"});
                                        items.push({id: "true", description: "inline"});
                                        args.response.success({data: items});
                                        }
                                        },
                                         */
                                        dedicated: {
                                            label: 'label.dedicated',
                                            docID: 'helpF5Dedicated',
                                            isBoolean: true,
                                            isChecked: false
                                        },
                                        capacity: {
                                            label: 'label.capacity',
                                            docID: 'helpF5Capacity',
                                            validation: {
                                                required: false,
                                                number: true
                                            }
                                        }
                                    }
                                },
                                action: function (args) {
                                    if (nspMap[ "f5"] == null) {
                                        $.ajax({
                                            url: createURL("addNetworkServiceProvider&name=F5BigIp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                            dataType: "json",
                                            async: true,
                                            success: function (json) {
                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
                                                var addF5ProviderIntervalID = 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(addF5ProviderIntervalID);
                                                                if (result.jobstatus == 1) {
                                                                    nspMap[ "f5"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                    addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addF5LoadBalancer", "addf5bigiploadbalancerresponse");
                                                                } else if (result.jobstatus == 2) {
                                                                    alert("addNetworkServiceProvider&name=F5BigIp failed. Error: " + _s(result.jobresult.errortext));
                                                                }
                                                            }
                                                        },
                                                        error: function (XMLHttpResponse) {
                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                            alert("addNetworkServiceProvider&name=F5BigIpfailed. Error: " + errorMsg);
                                                        }
                                                    });
                                                },
                                                g_queryAsyncJobResultInterval);
                                            }
                                        });
                                    } else {
                                        addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addF5LoadBalancer", "addf5bigiploadbalancerresponse");
                                    }
                                },
                                messages: {
                                    notification: function (args) {
                                        return 'label.add.F5.device';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "f5"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "f5"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            destroy: {
                                label: 'label.shutdown.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "f5"].id),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                            
                                            $(window).trigger('cloudStack.fullRefresh');
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.shutdown.provider';
                                    },
                                    notification: function (args) {
                                        return 'label.shutdown.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    
                    // SRX provider detailView
                    srx: {
                        type: 'detailView',
                        id: 'srxProvider',
                        label: 'label.srx',
                        viewAll: {
                            label: 'label.devices',
                            path: '_zone.srxDevices'
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    state: {
                                        label: 'label.state'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("JuniperSRX");
                                    var providerObj;
                                    $(nspHardcodingArray).each(function () {
                                        if (this.id == "srx") {
                                            providerObj = this;
                                            return false; //break each loop
                                        }
                                    });
                                    args.response.success({
                                        data: providerObj,
                                        actionFilter: networkProviderActionFilter('srx')
                                    });
                                }
                            }
                        },
                        actions: {
                            add: {
                                label: 'label.add.SRX.device',
                                createForm: {
                                    title: 'label.add.SRX.device',
                                    fields: {
                                        ip: {
                                            label: 'label.ip.address',
                                            docID: 'helpSRXIPAddress'
                                        },
                                        username: {
                                            label: 'label.username',
                                            docID: 'helpSRXUsername'
                                        },
                                        password: {
                                            label: 'label.password',
                                            isPassword: true,
                                            docID: 'helpSRXPassword'
                                        },
                                        networkdevicetype: {
                                            label: 'label.type',
                                            docID: 'helpSRXType',
                                            select: function (args) {
                                                var items =[];
                                                items.push({
                                                    id: "JuniperSRXFirewall",
                                                    description: "Juniper SRX Firewall"
                                                });
                                                args.response.success({
                                                    data: items
                                                });
                                            }
                                        },
                                        publicinterface: {
                                            label: 'label.public.interface',
                                            docID: 'helpSRXPublicInterface'
                                        },
                                        privateinterface: {
                                            label: 'label.private.interface',
                                            docID: 'helpSRXPrivateInterface'
                                        },
                                        usageinterface: {
                                            label: 'label.usage.interface',
                                            docID: 'helpSRXUsageInterface'
                                        },
                                        numretries: {
                                            label: 'label.numretries',
                                            defaultValue: '2',
                                            docID: 'helpSRXRetries'
                                        },
                                        timeout: {
                                            label: 'label.timeout',
                                            defaultValue: '300',
                                            docID: 'helpSRXTimeout'
                                        },
                                        // inline: {
                                        //   label: 'Mode',
                                        //   docID: 'helpSRXMode',
                                        //   select: function(args) {
                                        //     var items = [];
                                        //     items.push({id: "false", description: "side by side"});
                                        //     items.push({id: "true", description: "inline"});
                                        //     args.response.success({data: items});
                                        //   }
                                        // },
                                        publicnetwork: {
                                            label: 'label.public.network',
                                            defaultValue: 'untrusted',
                                            docID: 'helpSRXPublicNetwork',
                                            isDisabled: true
                                        },
                                        privatenetwork: {
                                            label: 'label.private.network',
                                            defaultValue: 'trusted',
                                            docID: 'helpSRXPrivateNetwork',
                                            isDisabled: true
                                        },
                                        capacity: {
                                            label: 'label.capacity',
                                            validation: {
                                                required: false,
                                                number: true
                                            },
                                            docID: 'helpSRXCapacity'
                                        },
                                        dedicated: {
                                            label: 'label.dedicated',
                                            isBoolean: true,
                                            isChecked: false,
                                            docID: 'helpSRXDedicated'
                                        }
                                    }
                                },
                                action: function (args) {
                                    if (nspMap[ "srx"] == null) {
                                        $.ajax({
                                            url: createURL("addNetworkServiceProvider&name=JuniperSRX&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                            dataType: "json",
                                            async: true,
                                            success: function (json) {
                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
                                                var addJuniperSRXProviderIntervalID = 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(addJuniperSRXProviderIntervalID);
                                                                if (result.jobstatus == 1) {
                                                                    nspMap[ "srx"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                    addExternalFirewall(args, selectedPhysicalNetworkObj, "addSrxFirewall", "addsrxfirewallresponse", "srxfirewall");
                                                                } else if (result.jobstatus == 2) {
                                                                    alert("addNetworkServiceProvider&name=JuniperSRX failed. Error: " + _s(result.jobresult.errortext));
                                                                }
                                                            }
                                                        },
                                                        error: function (XMLHttpResponse) {
                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                            alert("addNetworkServiceProvider&name=JuniperSRX failed. Error: " + errorMsg);
                                                        }
                                                    });
                                                },
                                                g_queryAsyncJobResultInterval);
                                            }
                                        });
                                    } else {
                                        addExternalFirewall(args, selectedPhysicalNetworkObj, "addSrxFirewall", "addsrxfirewallresponse", "srxfirewall");
                                    }
                                },
                                messages: {
                                    notification: function (args) {
                                        return 'label.add.SRX.device';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "srx"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "srx"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            destroy: {
                                label: 'label.shutdown.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "srx"].id),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                            
                                            $(window).trigger('cloudStack.fullRefresh');
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.shutdown.provider';
                                    },
                                    notification: function (args) {
                                        return 'label.shutdown.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    
                    // Palo Alto provider detailView
                    pa: {
                        type: 'detailView',
                        id: 'paProvider',
                        label: 'label.PA',
                        viewAll: {
                            label: 'label.devices',
                            path: '_zone.paDevices'
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    state: {
                                        label: 'label.state'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("PaloAlto");
                                    var providerObj;
                                    $(nspHardcodingArray).each(function () {
                                        if (this.id == "pa") {
                                            providerObj = this;
                                            return false; //break each loop
                                        }
                                    });
                                    args.response.success({
                                        data: providerObj,
                                        actionFilter: networkProviderActionFilter('pa')
                                    });
                                }
                            }
                        },
                        actions: {
                            add: {
                                label: 'label.add.PA.device',
                                createForm: {
                                    title: 'label.add.PA.device',
                                    fields: {
                                        ip: {
                                            label: 'label.ip.address',
                                            docID: 'helpPaloAltoIPAddress'
                                        },
                                        username: {
                                            label: 'label.username',
                                            docID: 'helpPaloAltoUsername'
                                        },
                                        password: {
                                            label: 'label.password',
                                            isPassword: true,
                                            docID: 'helpPaloAltoPassword'
                                        },
                                        networkdevicetype: {
                                            label: 'label.type',
                                            docID: 'helpPaloAltoType',
                                            select: function (args) {
                                                var items =[];
                                                items.push({
                                                    id: "PaloAltoFirewall",
                                                    description: "Palo Alto Firewall"
                                                });
                                                args.response.success({
                                                    data: items
                                                });
                                            }
                                        },
                                        publicinterface: {
                                            label: 'label.public.interface',
                                            docID: 'helpPaloAltoPublicInterface'
                                        },
                                        privateinterface: {
                                            label: 'label.private.interface',
                                            docID: 'helpPaloAltoPrivateInterface'
                                        },
                                        //usageinterface: {
                                        //  label: 'Usage interface',
                                        //  docID: 'helpPaloAltoUsageInterface'
                                        //},
                                        numretries: {
                                            label: 'label.numretries',
                                            defaultValue: '2',
                                            docID: 'helpPaloAltoRetries'
                                        },
                                        timeout: {
                                            label: 'label.timeout',
                                            defaultValue: '300',
                                            docID: 'helpPaloAltoTimeout'
                                        },
                                        // inline: {
                                        //   label: 'Mode',
                                        //   docID: 'helpPaloAltoMode',
                                        //   select: function(args) {
                                        //     var items = [];
                                        //     items.push({id: "false", description: "side by side"});
                                        //     items.push({id: "true", description: "inline"});
                                        //     args.response.success({data: items});
                                        //   }
                                        // },
                                        publicnetwork: {
                                            label: 'label.public.network',
                                            defaultValue: 'untrust',
                                            docID: 'helpPaloAltoPublicNetwork'
                                        },
                                        privatenetwork: {
                                            label: 'label.private.network',
                                            defaultValue: 'trust',
                                            docID: 'helpPaloAltoPrivateNetwork'
                                        },
                                        pavr: {
                                            label: 'label.virtual.router',
                                            docID: 'helpPaloAltoVirtualRouter'
                                        },
                                        patp: {
                                            label: 'label.PA.threat.profile',
                                            docID: 'helpPaloAltoThreatProfile'
                                        },
                                        palp: {
                                            label: 'label.PA.log.profile',
                                            docID: 'helpPaloAltoLogProfile'
                                        },
                                        capacity: {
                                            label: 'label.capacity',
                                            validation: {
                                                required: false,
                                                number: true
                                            },
                                            docID: 'helpPaloAltoCapacity'
                                        },
                                        dedicated: {
                                            label: 'label.dedicated',
                                            isBoolean: true,
                                            isChecked: false,
                                            docID: 'helpPaloAltoDedicated'
                                        }
                                    }
                                },
                                action: function (args) {
                                    if (nspMap[ "pa"] == null) {
                                        $.ajax({
                                            url: createURL("addNetworkServiceProvider&name=PaloAlto&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                            dataType: "json",
                                            async: true,
                                            success: function (json) {
                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
                                                var addPaloAltoProviderIntervalID = 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(addPaloAltoProviderIntervalID);
                                                                if (result.jobstatus == 1) {
                                                                    nspMap[ "pa"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                    addExternalFirewall(args, selectedPhysicalNetworkObj, "addPaloAltoFirewall", "addpaloaltofirewallresponse", "pafirewall");
                                                                } else if (result.jobstatus == 2) {
                                                                    alert("addNetworkServiceProvider&name=Palo Alto failed. Error: " + _s(result.jobresult.errortext));
                                                                }
                                                            }
                                                        },
                                                        error: function (XMLHttpResponse) {
                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                            alert("addNetworkServiceProvider&name=Palo Alto failed. Error: " + errorMsg);
                                                        }
                                                    });
                                                },
                                                3000);
                                            }
                                        });
                                    } else {
                                        addExternalFirewall(args, selectedPhysicalNetworkObj, "addPaloAltoFirewall", "addpaloaltofirewallresponse", "pafirewall");
                                    }
                                },
                                messages: {
                                    notification: function (args) {
                                        return 'label.add.PA.device';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "pa"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "pa"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            destroy: {
                                label: 'label.shutdown.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "pa"].id),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                            
                                            $(window).trigger('cloudStack.fullRefresh');
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.shutdown.provider';
                                    },
                                    notification: function (args) {
                                        return 'label.shutdown.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    
                    // Security groups detail view
                    securityGroups: {
                        id: 'securityGroup-providers',
                        label: 'label.menu.security.groups',
                        type: 'detailView',
                        viewAll: {
                            label: 'label.rules',
                            path: 'network.securityGroups'
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    state: {
                                        label: 'label.state'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("SecurityGroupProvider");
                                    var providerObj;
                                    $(nspHardcodingArray).each(function () {
                                        if (this.id == "securityGroups") {
                                            providerObj = this;
                                            return false; //break each loop
                                        }
                                    });
                                    args.response.success({
                                        actionFilter: function (args) {
                                            var allowedActions =[];
                                            var jsonObj = providerObj;
                                            if (jsonObj.state == "Enabled")
                                            allowedActions.push("disable"); else if (jsonObj.state == "Disabled")
                                            allowedActions.push("enable");
                                            return allowedActions;
                                        },
                                        data: providerObj
                                    });
                                }
                            }
                        },
                        actions: {
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "securityGroups"].id + "&state=Enabled"),
                                        async: true,
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "securityGroups"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        },
                        
                        fields: {
                            id: {
                                label: 'label.id'
                            },
                            name: {
                                label: 'label.name'
                            }
                            //,
                            //state: { label: 'label.status' } //comment it for now, since dataProvider below doesn't get called by widget code after action is done
                        }
                    },
                    // Nicira Nvp provider detail view
                    niciraNvp: {
                        type: 'detailView',
                        id: 'niciraNvpProvider',
                        label: 'label.niciraNvp',
                        viewAll: {
                            label: 'label.devices',
                            path: '_zone.niciraNvpDevices'
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    state: {
                                        label: 'label.state'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("NiciraNvp");
                                    var providerObj;
                                    $(nspHardcodingArray).each(function () {
                                        if (this.id == "niciraNvp") {
                                            providerObj = this;
                                            return false; //break each loop
                                        }
                                    });
                                    args.response.success({
                                        data: providerObj,
                                        actionFilter: networkProviderActionFilter('niciraNvp')
                                    });
                                }
                            }
                        },
                        actions: {
                            add: {
                                label: 'label.add.NiciraNvp.device',
                                createForm: {
                                    title: 'label.add.NiciraNvp.device',
                                    preFilter: function (args) {
                                    },
                                    // TODO What is this?
                                    fields: {
                                        host: {
                                            label: 'label.ip.address'
                                        },
                                        username: {
                                            label: 'label.username'
                                        },
                                        password: {
                                            label: 'label.password',
                                            isPassword: true
                                        },
                                        numretries: {
                                            label: 'label.numretries',
                                            defaultValue: '2'
                                        },
                                        transportzoneuuid: {
                                            label: 'label.nicira.transportzoneuuid'
                                        },
                                        l3gatewayserviceuuid: {
                                            label: 'label.nicira.l3gatewayserviceuuid'
                                        }
                                    }
                                },
                                action: function (args) {
                                    if (nspMap[ "niciraNvp"] == null) {
                                        $.ajax({
                                            url: createURL("addNetworkServiceProvider&name=NiciraNvp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                            dataType: "json",
                                            async: true,
                                            success: function (json) {
                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
                                                var addNiciraNvpProviderIntervalID = 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(addNiciraNvpProviderIntervalID);
                                                                if (result.jobstatus == 1) {
                                                                    nspMap[ "niciraNvp"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                    addNiciraNvpDevice(args, selectedPhysicalNetworkObj, "addNiciraNvpDevice", "addniciranvpdeviceresponse", "niciranvpdevice")
                                                                } else if (result.jobstatus == 2) {
                                                                    alert("addNetworkServiceProvider&name=NiciraNvp failed. Error: " + _s(result.jobresult.errortext));
                                                                }
                                                            }
                                                        },
                                                        error: function (XMLHttpResponse) {
                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                            alert("addNetworkServiceProvider&name=NiciraNvp failed. Error: " + errorMsg);
                                                        }
                                                    });
                                                },
                                                g_queryAsyncJobResultInterval);
                                            }
                                        });
                                    } else {
                                        addNiciraNvpDevice(args, selectedPhysicalNetworkObj, "addNiciraNvpDevice", "addniciranvpdeviceresponse", "niciranvpdevice")
                                    }
                                },
                                messages: {
                                    notification: function (args) {
                                        return 'label.add.NiciraNvp.device';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "niciraNvp"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "niciraNvp"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            destroy: {
                                label: 'label.shutdown.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "niciraNvp"].id),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                            
                                            $(window).trigger('cloudStack.fullRefresh');
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.shutdown.provider';
                                    },
                                    notification: function (args) {
                                        return 'label.shutdown.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
					// Brocade Vcs provider detail view
                    brocadeVcs: {
                        type: 'detailView',
                        id: 'brocadeVcsProvider',
                        label: 'label.brocadeVcs',
                        viewAll: {
                            label: 'label.devices',
                            path: '_zone.brocadeVcsDevices'
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    state: {
                                        label: 'label.state'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("BrocadeVcs");
                                    var providerObj;
                                    $(nspHardcodingArray).each(function () {
                                        if (this.id == "brocadeVcs") {
                                            providerObj = this;
                                            return false; //break each loop
                                        }
                                    });
                                    args.response.success({
                                        data: providerObj,
                                        actionFilter: networkProviderActionFilter('brocadeVcs')
                                    });
                                }
                            }
                        },
                        actions: {
                            add: {
                                label: 'label.add.BrocadeVcs.device',
                                createForm: {
                                    title: 'label.add.BrocadeVcs.device',
                                    preFilter: function (args) {
                                    },
                                    // TODO What is this?
                                    fields: {
                                        host: {
                                            label: 'label.ip.address'
                                        },
                                        username: {
                                            label: 'label.username'
                                        },
                                        password: {
                                            label: 'label.password',
                                            isPassword: true
                                        }
                                    }
                                },
                                action: function (args) {
                                    if (nspMap[ "brocadeVcs"] == null) {
                                        $.ajax({
                                            url: createURL("addNetworkServiceProvider&name=BrocadeVcs&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                            dataType: "json",
                                            async: true,
                                            success: function (json) {
                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
                                                var addBrocadeVcsProviderIntervalID = 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(addBrocadeVcsProviderIntervalID);
                                                                if (result.jobstatus == 1) {
                                                                    nspMap[ "brocadeVcs"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                    addBrocadeVcsDevice(args, selectedPhysicalNetworkObj, "addBrocadeVcsDevice", "addbrocadevcsdeviceresponse", "brocadevcsdevice")
                                                                } else if (result.jobstatus == 2) {
                                                                    alert("addNetworkServiceProvider&name=BrocadeVcs failed. Error: " + _s(result.jobresult.errortext));
                                                                }
                                                            }
                                                        },
                                                        error: function (XMLHttpResponse) {
                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                            alert("addNetworkServiceProvider&name=BrocadeVcs failed. Error: " + errorMsg);
                                                        }
                                                    });
                                                },
                                                g_queryAsyncJobResultInterval);
                                            }
                                        });
                                    } else {
                                        addBrocadeVcsDevice(args, selectedPhysicalNetworkObj, "addBrocadeVcsDevice", "addbrocadevcsdeviceresponse", "brocadevcsdevice")
                                    }
                                },
                                messages: {
                                    notification: function (args) {
                                        return 'label.add.BrocadeVcs.device';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "brocadeVcs"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "brocadeVcs"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            destroy: {
                                label: 'label.shutdown.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "brocadeVcs"].id),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                            $(window).trigger('cloudStack.fullRefresh');
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.shutdown.provider';
                                    },
                                    notification: function (args) {
                                        return 'label.shutdown.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    // BigSwitch Vns provider detail view
                    bigswitchVns: {
                        type: 'detailView',
                        id: 'bigswitchVnsProvider',
                        label: 'label.bigswitchVns',
                        viewAll: {
                            label: 'label.devices',
                            path: '_zone.bigswitchVnsDevices'
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    state: {
                                        label: 'label.state'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("BigSwitchVns");
                                    var providerObj;
                                    $(nspHardcodingArray).each(function () {
                                        if (this.id == "bigswitchVns") {
                                            providerObj = this;
                                            return false;
                                        }
                                    });
                                    args.response.success({
                                        data: providerObj,
                                        actionFilter: networkProviderActionFilter('bigswitchVns')
                                    });
                                }
                            }
                        },
                        actions: {
                            add: {
                                label: 'label.add.BigSwitchVns.device',
                                createForm: {
                                    title: 'label.add.BigSwitchVns.device',
                                    preFilter: function (args) {
                                    },
                                    fields: {
                                        host: {
                                            label: 'label.ip.address'
                                        },
                                        numretries: {
                                            label: 'label.numretries',
                                            defaultValue: '2'
                                        }
                                    }
                                },
                                action: function (args) {
                                    if (nspMap[ "bigswitchVns"] == null) {
                                        $.ajax({
                                            url: createURL("addNetworkServiceProvider&name=BigSwitchVns&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                            dataType: "json",
                                            async: true,
                                            success: function (json) {
                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
                                                var addBigSwitchVnsProviderIntervalID = 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(addBigSwitchVnsProviderIntervalID);
                                                                if (result.jobstatus == 1) {
                                                                    nspMap[ "bigswitchVns"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                    addBigSwitchVnsDevice(args, selectedPhysicalNetworkObj, "addBigSwitchVnsDevice", "addbigswitchvnsdeviceresponse", "bigswitchvnsdevice")
                                                                } else if (result.jobstatus == 2) {
                                                                    alert("addNetworkServiceProvider&name=BigSwitchVns failed. Error: " + _s(result.jobresult.errortext));
                                                                }
                                                            }
                                                        },
                                                        error: function (XMLHttpResponse) {
                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                            alert("addNetworkServiceProvider&name=BigSwitchVns failed. Error: " + errorMsg);
                                                        }
                                                    });
                                                },
                                                3000);
                                            }
                                        });
                                    } else {
                                        addBigSwitchVnsDevice(args, selectedPhysicalNetworkObj, "addBigSwitchVnsDevice", "addbigswitchvnsdeviceresponse", "bigswitchvnsdevice")
                                    }
                                },
                                messages: {
                                    notification: function (args) {
                                        return 'label.add.BigSwitchVns.device';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "bigswitchVns"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "bigswitchVns"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            destroy: {
                                label: 'label.shutdown.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "bigswitchVns"].id),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                            
                                            $(window).trigger('cloudStack.fullRefresh');
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.shutdown.provider';
                                    },
                                    notification: function (args) {
                                        return 'label.shutdown.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    
                    
                    // MidoNet provider detailView
                    midoNet: {
                        id: 'midoNet',
                        label: 'label.midoNet',
                        isMaximized: true,
                        type: 'detailView',
                        fields: {
                            name: {
                                label: 'label.name'
                            },
                            //ipaddress: { label: 'label.ip.address' },
                            state: {
                                label: 'label.status',
                                indicator: {
                                    'Enabled': 'on'
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.network',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    id: {
                                        label: 'label.id'
                                    },
                                    state: {
                                        label: 'label.state'
                                    },
                                    physicalnetworkid: {
                                        label: 'label.physical.network.ID'
                                    },
                                    destinationphysicalnetworkid: {
                                        label: 'label.destination.physical.network.id'
                                    },
                                    supportedServices: {
                                        label: 'label.supported.services'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("MidoNet");
                                    args.response.success({
                                        actionFilter: virtualRouterProviderActionFilter,
                                        data: $.extend(nspMap[ "midoNet"], {
                                            supportedServices: nspMap[ "midoNet"].servicelist.join(', ')
                                        })
                                    });
                                }
                            }
                        },
                        actions: {
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "midoNet"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "midoNet"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    
                    //ovs
                    Ovs: {
                        id: 'ovsProviders',
                        label: 'label.ovs',
                        isMaximized: true,
                        type: 'detailView',
                        fields: {
                            name: {
                                label: 'label.name'
                            },
                            ipaddress: {
                                label: 'label.ip.address'
                            },
                            state: {
                                label: 'label.status',
                                indicator: {
                                    'Enabled': 'on'
                                }
                            }
                        },
                        tabs: {
                            network: {
                                title: 'label.network',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    id: {
                                        label: 'label.id'
                                    },
                                    state: {
                                        label: 'label.state'
                                    },
                                    physicalnetworkid: {
                                        label: 'label.physical.network.ID'
                                    },
                                    destinationphysicalnetworkid: {
                                        label: 'label.destination.physical.network.id'
                                    },
                                    supportedServices: {
                                        label: 'label.supported.services'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("Ovs");
                                    args.response.success({
                                        actionFilter: virtualRouterProviderActionFilter,
                                        data: $.extend(nspMap[ "Ovs"], {
                                            supportedServices: nspMap["Ovs"] == undefined? "": nspMap["Ovs"].servicelist.join(', ')
                                        })
                                    });
                                }
                            },
                            
                            instances: {
                                title: 'label.instances',
                                listView: {
                                    label: 'label.virtual.appliances',
                                    id: 'routers',
                                    fields: {
                                        name: {
                                            label: 'label.name'
                                        },
                                        zonename: {
                                            label: 'label.zone'
                                        },
                                        routerType: {
                                            label: 'label.type'
                                        },
                                        state: {
                                            converter: function (str) {
                                                // For localization
                                                return str;
                                            },
                                            label: 'label.status',
                                            indicator: {
                                                'Running': 'on',
                                                'Stopped': 'off',
                                                'Error': 'off'
                                            }
                                        }
                                    },
                                    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;
                                                }
                                            }
                                        }
                                        
                                        var data2 = {
                                            forvpc: false
                                        };
                                        var routers =[];
                                        $.ajax({
                                            url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                            data: data2,
                                            success: function (json) {
                                                var items = json.listroutersresponse.router ?
                                                json.listroutersresponse.router:[];
                                                
                                                $(items).map(function (index, item) {
                                                    routers.push(item);
                                                });
                                                
                                                // Get project routers
                                                $.ajax({
                                                    url: createURL("listRouters&zoneid=" + selectedZoneObj.id + "&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
                                                    data: data2,
                                                    success: function (json) {
                                                        var items = json.listroutersresponse.router ?
                                                        json.listroutersresponse.router:[];
                                                        
                                                        $(items).map(function (index, item) {
                                                            routers.push(item);
                                                        });
                                                        args.response.success({
                                                            actionFilter: routerActionfilter,
                                                            data: $(routers).map(mapRouterType)
                                                        });
                                                    }
                                                });
                                            }
                                        });
                                    },
                                    detailView: {
                                        name: 'label.virtual.appliance.details',
                                        actions: {
                                            start: {
                                                label: 'label.action.start.router',
                                                messages: {
                                                    confirm: function (args) {
                                                        return 'message.action.start.router';
                                                    },
                                                    notification: function (args) {
                                                        return 'label.action.start.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL('startRouter&id=' + args.context.routers[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.startrouterresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        return json.queryasyncjobresultresponse.jobresult.domainrouter;
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return routerActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            stop: {
                                                label: 'label.action.stop.router',
                                                createForm: {
                                                    title: 'label.action.stop.router',
                                                    desc: 'message.action.stop.router',
                                                    fields: {
                                                        forced: {
                                                            label: 'force.stop',
                                                            isBoolean: true,
                                                            isChecked: false
                                                        }
                                                    }
                                                },
                                                messages: {
                                                    notification: function (args) {
                                                        return 'label.action.stop.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    var array1 =[];
                                                    array1.push("&forced=" + (args.data.forced == "on"));
                                                    $.ajax({
                                                        url: createURL('stopRouter&id=' + args.context.routers[0].id + array1.join("")),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.stoprouterresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        return json.queryasyncjobresultresponse.jobresult.domainrouter;
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return routerActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            'remove': {
                                                label: 'label.destroy.router',
                                                messages: {
                                                    confirm: function (args) {
                                                        return 'message.confirm.destroy.router';
                                                    },
                                                    notification: function (args) {
                                                        return 'label.destroy.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL("destroyRouter&id=" + args.context.routers[0].id),
                                                        dataType: "json",
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.destroyrouterresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            migrate: {
                                                label: 'label.action.migrate.router',
                                                createForm: {
                                                    title: 'label.action.migrate.router',
                                                    desc: '',
                                                    fields: {
                                                        hostId: {
                                                            label: 'label.host',
                                                            validation: {
                                                                required: true
                                                            },
                                                            select: function (args) {
                                                                $.ajax({
                                                                    url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.routers[0].id),
                                                                    dataType: "json",
                                                                    async: true,
                                                                    success: function (json) {
                                                                        var hostObjs = json.findhostsformigrationresponse.host;
                                                                        var items =[];
                                                                        $(hostObjs).each(function () {
                                                                            items.push({
                                                                                id: this.id,
                                                                                description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
                                                                            });
                                                                        });
                                                                        args.response.success({
                                                                            data: items
                                                                        });
                                                                    }
                                                                });
                                                            },
                                                            error: function (XMLHttpResponse) {
                                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                                args.response.error(errorMsg);
                                                            }
                                                        }
                                                    }
                                                },
                                                messages: {
                                                    notification: function (args) {
                                                        return 'label.action.migrate.router';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.routers[0].id),
                                                        dataType: "json",
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.migratesystemvmresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
                                                                        $.ajax({
                                                                            url: createURL("listRouters&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
                                                                            dataType: "json",
                                                                            async: false,
                                                                            success: function (json) {
                                                                                var items = json.listroutersresponse.router;
                                                                                if (items != null && items.length > 0) {
                                                                                    return items[0];
                                                                                }
                                                                            }
                                                                        });
                                                                    },
                                                                    getActionFilter: function () {
                                                                        return routerActionfilter;
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            },
                                            
                                            viewConsole: {
                                                label: 'label.view.console',
                                                action: {
                                                    externalLink: {
                                                        url: function (args) {
                                                            return clientConsoleUrl + '?cmd=access&vm=' + args.context.routers[0].id;
                                                        },
                                                        title: function (args) {
                                                            return args.context.routers[0].id.substr(0, 8);
                                                            //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
                                                        },
                                                        width: 820,
                                                        height: 640
                                                    }
                                                }
                                            }
                                        },
                                        tabs: {
                                            details: {
                                                title: 'label.details',
                                                preFilter: function (args) {
                                                    var hiddenFields =[];
                                                    if (! args.context.routers[0].project) {
                                                        hiddenFields.push('project');
                                                        hiddenFields.push('projectid');
                                                    }
                                                    if (selectedZoneObj.networktype == 'Basic') {
                                                        hiddenFields.push('publicip');
                                                        //In Basic zone, guest IP is public IP. So, publicip is not returned by listRouters API. Only guestipaddress is returned by listRouters API.
                                                    }
                                                    return hiddenFields;
                                                },
                                                fields:[ {
                                                    name: {
                                                        label: 'label.name'
                                                    },
                                                    project: {
                                                        label: 'label.project'
                                                    }
                                                },
                                                {
                                                    id: {
                                                        label: 'label.id'
                                                    },
                                                    projectid: {
                                                        label: 'label.project.id'
                                                    },
                                                    state: {
                                                        label: 'label.state'
                                                    },
                                                    guestnetworkid: {
                                                        label: 'label.network.id'
                                                    },
                                                    publicip: {
                                                        label: 'label.public.ip'
                                                    },
                                                    guestipaddress: {
                                                        label: 'label.guest.ip'
                                                    },
                                                    linklocalip: {
                                                        label: 'label.linklocal.ip'
                                                    },
                                                    hostname: {
                                                        label: 'label.host'
                                                    },
                                                    serviceofferingname: {
                                                        label: 'label.compute.offering'
                                                    },
                                                    networkdomain: {
                                                        label: 'label.network.domain'
                                                    },
                                                    domain: {
                                                        label: 'label.domain'
                                                    },
                                                    account: {
                                                        label: 'label.account'
                                                    },
                                                    created: {
                                                        label: 'label.created',
                                                        converter: cloudStack.converters.toLocalDate
                                                    },
                                                    isredundantrouter: {
                                                        label: 'label.redundant.router',
                                                        converter: cloudStack.converters.toBooleanText
                                                    },
                                                    redundantRouterState: {
                                                        label: 'label.redundant.state'
                                                    }
                                                }],
                                                dataProvider: function (args) {
                                                    $.ajax({
                                                        url: createURL("listRouters&id=" + args.context.routers[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jsonObj = json.listroutersresponse.router[0];
                                                            addExtraPropertiesToRouterInstanceObject(jsonObj);
                                                            args.response.success({
                                                                actionFilter: routerActionfilter,
                                                                data: jsonObj
                                                            });
                                                        }
                                                    });
                                                }
                                            },
                                            nics: {
                                                title: 'label.nics',
                                                multiple: true,
                                                fields:[ {
                                                    name: {
                                                        label: 'label.name',
                                                        header: true
                                                    },
                                                    type: {
                                                        label: 'label.type'
                                                    },
                                                    traffictype: {
                                                        label: 'label.traffic.type'
                                                    },
                                                    networkname: {
                                                        label: 'label.network.name'
                                                    },
                                                    netmask: {
                                                        label: 'label.netmask'
                                                    },
                                                    ipaddress: {
                                                        label: 'label.ip.address'
                                                    },
                                                    id: {
                                                        label: 'label.id'
                                                    },
                                                    networkid: {
                                                        label: 'label.network.id'
                                                    },
                                                    isolationuri: {
                                                        label: 'label.isolation.uri'
                                                    },
                                                    broadcasturi: {
                                                        label: 'label.broadcast.uri'
                                                    }
                                                }],
                                                dataProvider: function (args) {
                                                    $.ajax({
                                                        url: createURL("listRouters&id=" + args.context.routers[0].id),
                                                        dataType: 'json',
                                                        async: true,
                                                        success: function (json) {
                                                            var jsonObj = json.listroutersresponse.router[0].nic;
                                                            
                                                            args.response.success({
                                                                actionFilter: routerActionfilter,
                                                                data: $.map(jsonObj, function (nic, index) {
                                                                    var name = 'NIC ' + (index + 1);
                                                                    if (nic.isdefault) {
                                                                        name += ' (' + _l('label.default') + ')';
                                                                    }
                                                                    return $.extend(nic, {
                                                                        name: name
                                                                    });
                                                                })
                                                            });
                                                        }
                                                    });
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        },
                        actions: {
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "Ovs"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "Ovs"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },
                    // Nuage Vsp provider detail view
                    nuageVsp: {
	                     type: 'detailView',
	                     id: 'nuageVspProvider',
	                     label: 'label.nuageVsp',
	                     viewAll: {
	                         label: 'label.devices',
	                         path: '_zone.nuageVspDevices'
	                     },
	                     tabs: {
	                         details: {
	                             title: 'label.details',
	                             fields: [{
	                                 name: {
	                                     label: 'label.name'
	                                 }
	                             }, {
	                                 state: {
	                                     label: 'label.state'
	                                 }
	                             }],
	                             dataProvider: function(args) {
	                                 refreshNspData("NuageVsp");
	                                 var providerObj;
	                                 $(nspHardcodingArray).each(function() {
	                                     if (this.id == "nuageVsp") {
	                                         providerObj = this;
	                                         return false; //break each loop
	                                     }
	                                 });
	                                 args.response.success({
	                                     data: providerObj,
	                                     actionFilter: networkProviderActionFilter('nuageVsp')
	                                 });
	                             }
	                         }
	                     },
	                     actions: {
	                         add: {
	                             label: 'label.add.NuageVsp.device',
	                             createForm: {
	                                 title: 'label.add.NuageVsp.device',
	                                 preFilter: function(args) {},
	                                 fields: {
	                                     hostname: {
	                                         label: 'label.host.name',
	                                         validation: {
	                                             required: true
	                                         },
	                                         docID: 'helpVspHostname'
	                                     },
	                                     username: {
	                                         label: 'label.username',
	                                         validation: {
	                                             required: true
	                                         },
	                                         docID: 'helpVspUsername'
	                                     },
	                                     password: {
	                                         label: 'label.password',
	                                         isPassword: true,
	                                         validation: {
	                                             required: true
	                                         },
	                                         docID: 'helpVspPassword'
	                                     },
	                                     port: {
	                                         label: 'label.port',
	                                         validation: {
	                                             required: false,
	                                             number: true
	                                         },
	                                         docID: 'helpVspPort'
	                                     },
	                                     apiversion: {
	                                         label: 'label.api.version',
	                                         defaultValue: 'v1_0',
	                                         validation: {
	                                             required: true
	                                         },
	                                         docID: 'helpVspApiVersion'
	                                     },
	                                     retrycount: {
	                                         label: 'label.numretries',
	                                         defaultValue: '4',
	                                         validation: {
	                                             required: true,
	                                             number: true
	                                         },
	                                         docID: 'helpVspRetries'
	                                     },
	                                     retryinterval: {
	                                         label: 'label.retry.interval',
	                                         defaultValue: '60',
	                                         validation: {
	                                             required: false,
	                                             number: true
	                                         },
	                                         docID: 'helpVspRetryInterval'
	                                     }
	                                 }
	                             },
	                             action: function(args) {
	                                 if (nspMap["nuageVsp"] == null) {
	                                     $.ajax({
	                                         url: createURL("addNetworkServiceProvider&name=NuageVsp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
	                                         dataType: "json",
	                                         async: true,
	                                         success: function(json) {
	                                             var jobId = json.addnetworkserviceproviderresponse.jobid;
	                                             var addNuageVspProviderIntervalID = 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(addNuageVspProviderIntervalID);
	                                                             if (result.jobstatus == 1) {
	                                                                 nspMap["nuageVsp"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
	                                                                 addNuageVspDevice(args, selectedPhysicalNetworkObj, "addNuageVspDevice", "addnuagevspdeviceresponse", "nuagevspdevice")
	                                                             } else if (result.jobstatus == 2) {
	                                                                 alert("addNetworkServiceProvider&name=NuageVsp failed. Error: " + _s(result.jobresult.errortext));
	                                                             }
	                                                         }
	                                                     },
	                                                     error: function(XMLHttpResponse) {
	                                                         var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
	                                                         alert("addNetworkServiceProvider&name=NuageVsp failed. Error: " + errorMsg);
	                                                     }
	                                                 });
	                                             }, g_queryAsyncJobResultInterval);
	                                         }
	                                     });
	                                 } else {
	                                     addNuageVspDevice(args, selectedPhysicalNetworkObj, "addNuageVspDevice", "addnuagevspdeviceresponse", "nuagevspdevice")
	                                 }
	                             },
	                             messages: {
	                                 notification: function(args) {
	                                     return 'label.add.NuageVsp.device';
	                                 }
	                             },
	                             notification: {
	                                 poll: pollAsyncJobResult
	                             }
	                         },
	                         enable: {
	                             label: 'label.enable.provider',
	                             action: function(args) {
	                                 $.ajax({
	                                     url: createURL("updateNetworkServiceProvider&id=" + nspMap["nuageVsp"].id + "&state=Enabled"),
	                                     dataType: "json",
	                                     success: function(json) {
	                                         var jid = json.updatenetworkserviceproviderresponse.jobid;
	                                         args.response.success({
	                                             _custom: {
	                                                 jobId: jid,
	                                                 getUpdatedItem: function(json) {
	                                                     $(window).trigger('cloudStack.fullRefresh');
	                                                 }
	                                             }
	                                         });
	                                     }
	                                 });
	                             },
	                             messages: {
	                                 confirm: function(args) {
	                                     return 'message.confirm.enable.provider';
	                                 },
	                                 notification: function() {
	                                     return 'label.enable.provider';
	                                 }
	                             },
	                             notification: {
	                                 poll: pollAsyncJobResult
	                             }
	                         },
	                         disable: {
	                             label: 'label.disable.provider',
	                             action: function(args) {
	                                 $.ajax({
	                                     url: createURL("updateNetworkServiceProvider&id=" + nspMap["nuageVsp"].id + "&state=Disabled"),
	                                     dataType: "json",
	                                     success: function(json) {
	                                         var jid = json.updatenetworkserviceproviderresponse.jobid;
	                                         args.response.success({
	                                             _custom: {
	                                                 jobId: jid,
	                                                 getUpdatedItem: function(json) {
	                                                     $(window).trigger('cloudStack.fullRefresh');
	                                                 }
	                                             }
	                                         });
	                                     }
	                                 });
	                             },
	                             messages: {
	                                 confirm: function(args) {
	                                     return 'message.confirm.disable.provider';
	                                 },
	                                 notification: function() {
	                                     return 'label.disable.provider';
	                                 }
	                             },
	                             notification: {
	                                 poll: pollAsyncJobResult
	                             }
	                         },
	                         destroy: {
	                             label: 'label.shutdown.provider',
	                             action: function(args) {
	                                 $.ajax({
	                                     url: createURL("deleteNetworkServiceProvider&id=" + nspMap["nuageVsp"].id),
	                                     dataType: "json",
	                                     success: function(json) {
	                                         var jid = json.deletenetworkserviceproviderresponse.jobid;
	                                         args.response.success({
	                                             _custom: {
	                                                 jobId: jid
	                                             }
	                                         });
	
	                                         $(window).trigger('cloudStack.fullRefresh');
	                                     }
	                                 });
	                             },
	                             messages: {
	                                 confirm: function(args) {
	                                     return 'message.confirm.shutdown.provider';
	                                 },
	                                 notification: function(args) {
	                                     return 'label.shutdown.provider';
	                                 }
	                             },
	                             notification: {
	                                 poll: pollAsyncJobResult
	                             }
	                         }
	                     }
	                },
                    Opendaylight: {
                        type: 'detailView',
                        id: 'openDaylightProvider',
                        label: 'label.openDaylight',
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    state: {
                                        label: 'label.state'
                                    }
                                }],
                                dataProvider: function (args) {
                                    refreshNspData("Opendaylight");
                                    var providerObj;
                                    $(nspHardcodingArray).each(function () {
                                        if (this.id == "Opendaylight") {
                                            providerObj = this;
                                            return false; //break each loop
                                        }
                                    });
                                    args.response.success({
                                        data: providerObj,
                                        actionFilter: networkProviderActionFilter('Opendaylight')
                                    });
                                }
                            },
                            controllers: {
                                title: 'label.opendaylight.controllers',
                                listView: {
                                    id: 'openDaylightControllerList',
                                    fields: {
                                        name: {
                                            label: 'label.name'
                                        },
                                        url: {
                                            label: 'label.url'
                                        },
                                        username: {
                                            label: 'label.username'
                                        }
                                    },
                                    dataProvider: function (args) {
                                        var providerObj
                                        $.ajax({
                                            url: createURL("listOpenDaylightControllers"),
                                            async: false,
                                            success: function (json) {
                                                providerObj = json.listOpenDaylightControllers.opendaylightcontroller
                                            }
                                        });
                                        args.response.success({
                                            data: providerObj
                                        });
                                    },
                                    detailView: {
                                        name: "OpenDaylight Controller",
                                        tabs: {
                                            details: {
                                                title: 'label.opendaylight.controllerdetail',
                                                fields:[ {
                                                    name: {
                                                        label: 'label.name'
                                                    },
                                                    url: {
                                                        label: 'label.url', header: true
                                                    },
                                                    username: {
                                                        label: 'label.username'
                                                    }
                                                }],
                                                dataProvider: function (args) {
                                                    var providerObj
                                                    $.ajax({
                                                        url: createURL("listOpenDaylightControllers&id=" + args.id),
                                                        async: false,
                                                        success: function (json) {
                                                            providerObj = json.listOpenDaylightControllers.opendaylightcontroller
                                                        }
                                                    });
                                                    args.response.success({
                                                        data: providerObj[0],
                                                        actionFilter: function(args) { return [ 'destroy' ] }
                                                    });
                                                }
                                            }
                                        },
                                        actions: {
                                            destroy: {
                                                label: 'label.delete.OpenDaylight.device',
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL("deleteOpenDaylightController&id=" + args.data.id),
                                                        dataType: "json",
                                                        success: function (json) {
                                                            var jid = json.deleteOpenDaylightController.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid,
                                                                    getUpdatedItem: function (json) {
                                                                        $(window).trigger('cloudStack.fullRefresh');
                                                                    }
                                                                }
                                                            });
                                                        }
                                                    });
                                                },
                                                messages: {
                                                    notification: function(args) {
                                                        return 'label.openaylight.destroycontroller'
                                                    }
                                                },
                                                notification: {
                                                    poll: pollAsyncJobResult
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        },
                        actions: {
                            add: {
                                label: 'label.add.OpenDaylight.device',
                                createForm: {
                                    title: 'label.add.OpenDaylight.device',
                                    preFilter: function (args) {
                                    },
                                    // TODO What is this?
                                    fields: {
                                        url: {
                                            label: 'label.url'
                                        },
                                        username: {
                                            label: 'label.username'
                                        },
                                        password: {
                                            label: 'label.password',
                                            isPassword: true
                                        },
                                        numretries: {
                                            label: 'label.numretries',
                                            defaultValue: '2'
                                        }
                                    }
                                },
                                action: function (args) {
                                    if (nspMap[ "Opendaylight"] == null) {
                                        $.ajax({
                                            url: createURL("addNetworkServiceProvider&name=Opendaylight&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                            dataType: "json",
                                            async: true,
                                            success: function (json) {
                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
                                                var addOpenDaylightProviderIntervalID = 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(addOpenDaylightProviderIntervalID);
                                                                if (result.jobstatus == 1) {
                                                                    nspMap[ "Opendaylight"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                    addOpenDaylightController(args, selectedPhysicalNetworkObj, "addOpenDaylightController", "addopendaylightcontrollerresponse", "opendaylightcontroller")
                                                                } else if (result.jobstatus == 2) {
                                                                    alert("addNetworkServiceProvider&name=OpenDaylight failed. Error: " + _s(result.jobresult.errortext));
                                                                }
                                                            }
                                                        },
                                                        error: function (XMLHttpResponse) {
                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                            alert("addNetworkServiceProvider&name=OpenDaylight failed. Error: " + errorMsg);
                                                        }
                                                    });
                                                },
                                                g_queryAsyncJobResultInterval);
                                            }
                                        });
                                    } else {
                                        addOpenDaylightController(args, selectedPhysicalNetworkObj, "addOpenDaylightController", "addOpenDaylightController", "opendaylightcontroller")
                                    }
                                },
                                messages: {
                                    notification: function (args) {
                                        return 'label.add.OpenDaylight.device';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            enable: {
                                label: 'label.enable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "Opendaylight"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function () {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap[ "Opendaylight"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function () {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            destroy: {
                                label: 'label.shutdown.provider',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap[ "Opendaylight"].id),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                            
                                            $(window).trigger('cloudStack.fullRefresh');
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.shutdown.provider';
                                    },
                                    notification: function (args) {
                                        return 'label.shutdown.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    },

                    // GloboDns provider detail view
                    GloboDns: {
                        isMaximized: true,
                        type: 'detailView',
                        id: 'globoDnsProvider',
                        label: 'GloboDNS',
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields: [{
                                    name: {
                                        label: 'label.name'
                                    }
                                }, {
                                    state: {
                                        label: 'label.state'
                                    }
                                }],
                                dataProvider: function(args) {
                                    refreshNspData("GloboDns");
                                    var providerObj;
                                    $(nspHardcodingArray).each(function() {
                                        if (this.id == "GloboDns") {
                                            providerObj = this;
                                            return false; //break each loop
                                        }
                                    });
                                    args.response.success({
                                        data: providerObj,
                                        actionFilter: networkProviderActionFilter('GloboDns')
                                    });
                                }
                            },
                        },
                        actions: {
                            add: {
                                label: 'GloboDNS Configuration',
                                createForm: {
                                    title: 'GloboDNS Configuration',
                                    preFilter: function(args) {},
                                    fields: {
                                        username: {
                                            label: 'Username',
                                            validation: {
                                                required: true
                                            }
                                        },
                                        password: {
                                            label: 'Password',
                                            isPassword: true,
                                            validation: {
                                                required: true
                                            }
                                        },
                                        url: {
                                            label: 'URL',
                                            validation: {
                                                required: true
                                            }
                                        }
                                    }
                                },
                                action: function(args) {
                                    if (nspMap["GloboDns"] == null) {
                                        $.ajax({
                                            url: createURL("addNetworkServiceProvider&name=GloboDns&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                            dataType: "json",
                                            async: true,
                                            success: function(json) {
                                                var jobId = json.addnetworkserviceproviderresponse.jobid;
                                                var addGloboDnsProviderIntervalID = 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(addGloboDnsProviderIntervalID);
                                                                if (result.jobstatus == 1) {
                                                                    nspMap["GloboDns"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                    addGloboDnsHost(args, selectedPhysicalNetworkObj, "addGloboDnsHost", "addglobodnshostresponse");
                                                                } else if (result.jobstatus == 2) {
                                                                    alert("addNetworkServiceProvider&name=GloboDns failed. Error: " + _s(result.jobresult.errortext));
                                                                }
                                                            }
                                                        },
                                                        error: function(XMLHttpResponse) {
                                                            var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                            alert("addNetworkServiceProvider&name=GloboDns failed. Error: " + errorMsg);
                                                        }
                                                    });
                                                }, g_queryAsyncJobResultInterval);
                                            }
                                        });
                                    } else {
                                        addGloboDnsHost(args, selectedPhysicalNetworkObj, "addGloboDnsHost", "addglobodnshostresponse");
                                    }
                                },
                                messages: {
                                    notification: function(args) {
                                        return 'Add GloboDNS';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            enable: {
                                label: 'label.enable.provider',
                                action: function(args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap["GloboDns"].id + "&state=Enabled"),
                                        dataType: "json",
                                        success: function(json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function(json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function(args) {
                                        return 'message.confirm.enable.provider';
                                    },
                                    notification: function() {
                                        return 'label.enable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            disable: {
                                label: 'label.disable.provider',
                                action: function(args) {
                                    $.ajax({
                                        url: createURL("updateNetworkServiceProvider&id=" + nspMap["GloboDns"].id + "&state=Disabled"),
                                        dataType: "json",
                                        success: function(json) {
                                            var jid = json.updatenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function(json) {
                                                        $(window).trigger('cloudStack.fullRefresh');
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function(args) {
                                        return 'message.confirm.disable.provider';
                                    },
                                    notification: function() {
                                        return 'label.disable.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            destroy: {
                                label: 'label.shutdown.provider',
                                action: function(args) {
                                    $.ajax({
                                        url: createURL("deleteNetworkServiceProvider&id=" + nspMap["GloboDns"].id),
                                        dataType: "json",
                                        success: function(json) {
                                            var jid = json.deletenetworkserviceproviderresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });

                                            $(window).trigger('cloudStack.fullRefresh');
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function(args) {
                                        return 'message.confirm.shutdown.provider';
                                    },
                                    notification: function(args) {
                                        return 'label.shutdown.provider';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        }
                    }
                }
            }
        },
        show: cloudStack.uiCustom.physicalResources({
            sections: {
                physicalResources: {
                    type: 'select',
                    title: 'label.menu.physical.resources',
                    listView: {
                        zones: {
                            id: 'physicalResources',
                            label: 'label.menu.physical.resources',
                            fields: {
                                name: {
                                    label: 'label.zone'
                                },
                                networktype: {
                                    label: 'label.network.type'
                                },
                                domainid: {
                                    label: 'label.public',
                                    converter: function (args) {
                                        if (args == null)
                                        return "Yes"; else
                                        return "No";
                                    }
                                },
                                allocationstate: {
                                    label: 'label.allocation.state',
                                    converter: function (str) {
                                        // For localization
                                        return str;
                                    },
                                    indicator: {
                                        'Enabled': 'on',
                                        'Disabled': 'off'
                                    }
                                }
                            },
                            
                            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;
                                        }
                                    }
                                }
                                $.ajax({
                                    url: createURL("listZones&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                    dataType: "json",
                                    async: true,
                                    success: function (json) {
                                        zoneObjs = json.listzonesresponse.zone;
                                        args.response.success({
                                            actionFilter: zoneActionfilter,
                                            data: zoneObjs
                                        });
                                    }
                                });
                            },
                            
                            actions: {
                                add: {
                                    label: 'label.add.zone',
                                    action: {
                                        custom: cloudStack.uiCustom.zoneWizard(
                                        cloudStack.zoneWizard)
                                    },
                                    messages: {
                                        notification: function (args) {
                                            return 'label.add.zone';
                                        }
                                    },
                                    notification: {
                                        poll: function (args) {
                                            args.complete({
                                                actionFilter: zoneActionfilter,
                                                data: args._custom.zone
                                            });
                                        }
                                    }
                                }
                            },
                            
                            detailView: {
                                isMaximized: true,
                                actions: {
                                    addVmwareDc: {
                                        label: 'label.add.vmware.datacenter',
                                        textLabel: 'label.add.vmware.datacenter',
                                        messages: {
                                            notification: function (args) {
                                                return 'label.add.vmware.datacenter';
                                            }
                                        },
                                        createForm: {
                                            title: 'label.add.vmware.datacenter',
                                            fields: {
                                                name: {
                                                    label: 'label.dc.name',
                                                    validation: {
                                                        required: true
                                                    }
                                                },
                                                vcenter: {
                                                    label: 'label.vcenter',
                                                    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,
                                                name: args.data.name,
                                                vcenter: args.data.vcenter
                                            };
                                            
                                            if (args.data.username != null && args.data.username.length > 0) {
                                                $.extend(data, {
                                                    username: args.data.username
                                                })
                                            }
                                            if (args.data.password != null && args.data.password.length > 0) {
                                                $.extend(data, {
                                                    password: args.data.password
                                                })
                                            }
                                            
                                            $.ajax({
                                                url: createURL('addVmwareDc'),
                                                data: data,
                                                type: "POST",
                                                success: function (json) {
                                                    //var item = json.addvmwaredcresponse.vmwaredc;
                                                    args.response.success();
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: function (args) {
                                                args.complete();
                                            }
                                        }
                                    },
                                    
                                    removeVmwareDc: {
                                        label: 'label.remove.vmware.datacenter',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.confirm.remove.vmware.datacenter';
                                            },
                                            notification: function (args) {
                                                return 'label.remove.vmware.datacenter';
                                            }
                                        },
                                        action: function (args) {
                                            var data = {
                                                zoneid: args.context.physicalResources[0].id
                                            };
                                            $.ajax({
                                                url: createURL('removeVmwareDc'),
                                                data: data,
                                                success: function (json) {
                                                    delete args.context.physicalResources[0].vmwaredcName;
                                                    delete args.context.physicalResources[0].vmwaredcVcenter;
                                                    delete args.context.physicalResources[0].vmwaredcId;
                                                    
                                                    selectedZoneObj = args.context.physicalResources[0];
                                                    
                                                    args.response.success({
                                                        data: args.context.physicalResources[0]
                                                    });
                                                },
                                                error: function (XMLHttpResponse) {
                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                    args.response.error(errorMsg);
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: function (args) {
                                                args.complete();
                                            }
                                        }
                                    },
                                    
                                    enable: {
                                        label: 'label.action.enable.zone',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.action.enable.zone';
                                            },
                                            notification: function (args) {
                                                return 'label.action.enable.zone';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL("updateZone&id=" + args.context.physicalResources[0].id + "&allocationstate=Enabled"), //embedded objects in listView is called physicalResources while embedded objects in detailView is called zones
                                                dataType: "json",
                                                async: true,
                                                success: function (json) {
                                                    var item = json.updatezoneresponse.zone;
                                                    args.response.success({
                                                        actionFilter: zoneActionfilter,
                                                        data: item
                                                    });
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: function (args) {
                                                args.complete();
                                            }
                                        }
                                    },
                                    
                                    disable: {
                                        label: 'label.action.disable.zone',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.action.disable.zone';
                                            },
                                            notification: function (args) {
                                                return 'label.action.disable.zone';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL("updateZone&id=" + args.context.physicalResources[0].id + "&allocationstate=Disabled"), //embedded objects in listView is called physicalResources while embedded objects in detailView is called zones
                                                dataType: "json",
                                                async: true,
                                                success: function (json) {
                                                    var item = json.updatezoneresponse.zone;
                                                    args.response.success({
                                                        actionFilter: zoneActionfilter,
                                                        data: item
                                                    });
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: function (args) {
                                                args.complete();
                                            }
                                        }
                                    },
                                    
                                    dedicateZone: {
                                        label: 'label.dedicate.zone',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.confirm.dedicate.zone';
                                            },
                                            notification: function (args) {
                                                return 'label.zone.dedicated';
                                            }
                                        },
                                        createForm: {
                                            title: 'label.dedicate.zone',
                                            fields: {
                                                domainId: {
                                                    label: 'label.domain',
                                                    validation: {
                                                        required: true
                                                    },
                                                    select: function (args) {
                                                        $.ajax({
                                                            url: createURL("listDomains&listAll=true"),
                                                            dataType: "json",
                                                            async: false,
                                                            success: function (json) {
                                                                var domainObjs = json.listdomainsresponse.domain;
                                                                var items =[];
                                                                
                                                                $(domainObjs).each(function () {
                                                                    items.push({
                                                                        id: this.id,
                                                                        description: this.name
                                                                    });
                                                                });
                                                                
                                                                args.response.success({
                                                                    data: items
                                                                });
                                                            }
                                                        });
                                                    }
                                                },
                                                accountId: {
                                                    label: 'label.account',
                                                    docID: 'helpAccountForDedication',
                                                    validation: {
                                                        required: false
                                                    }
                                                }
                                            }
                                        },
                                        action: function (args) {
                                            //EXPLICIT DEDICATION
                                            var array2 =[];
                                            if (args.data.accountId != "")
                                            array2.push("&account=" + todb(args.data.accountId));
                                            
                                            $.ajax({
                                                url: createURL("dedicateZone&zoneId=" +
                                                args.context.physicalResources[0].id +
                                                "&domainId=" + args.data.domainId + array2.join("")),
                                                dataType: "json",
                                                success: function (json) {
                                                    var jid = json.dedicatezoneresponse.jobid;
                                                    args.response.success({
                                                        _custom: {
                                                            jobId: jid,
                                                            getActionFilter: function () {
                                                                return zoneActionfilter;
                                                            }
                                                        }
                                                    });
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    },
                                    releaseDedicatedZone: {
                                        label: 'label.release.dedicated.zone',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.confirm.release.dedicated.zone';
                                            },
                                            notification: function (args) {
                                                return 'message.dedicated.zone.released';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL("releaseDedicatedZone&zoneid=" +
                                                args.context.physicalResources[0].id),
                                                dataType: "json",
                                                async: true,
                                                success: function (json) {
                                                    var jid = json.releasededicatedzoneresponse.jobid;
                                                    args.response.success({
                                                        _custom: {
                                                            jobId: jid,
                                                            getActionFilter: function () {
                                                                return zoneActionfilter;
                                                            }
                                                        }
                                                    });
                                                },
                                                error: function (json) {
                                                    args.response.error(parseXMLHttpResponse(json));
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    },
                                    
                                    'remove': {
                                        label: 'label.action.delete.zone',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.action.delete.zone';
                                            },
                                            notification: function (args) {
                                                return 'label.action.delete.zone';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL("deleteZone&id=" + args.context.physicalResources[0].id), //embedded objects in listView is called physicalResources while embedded objects in detailView is called zones
                                                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();
                                            }
                                        }
                                    },
                                    edit: {
                                        label: 'label.edit',
                                        action: function (args) {
                                            var array1 =[];
                                            array1.push("&name=" + todb(args.data.name));
                                            array1.push("&dns1=" + todb(args.data.dns1));
                                            array1.push("&dns2=" + todb(args.data.dns2));
                                            //dns2 can be empty ("") when passed to API, so a user gets to update this field from an existing value to blank.
                                            array1.push("&ip6dns1=" + todb(args.data.ip6dns1));
                                            //p6dns1 can be empty ("") when passed to API, so a user gets to update this field from an existing value to blank.
                                            array1.push("&ip6dns2=" + todb(args.data.ip6dns2));
                                            //ip6dns2 can be empty ("") when passed to API, so a user gets to update this field from an existing value to blank.
                                            
                                            if (selectedZoneObj.networktype == "Advanced" && args.data.guestcidraddress) {
                                                array1.push("&guestcidraddress=" + todb(args.data.guestcidraddress));
                                            }
                                            
                                            array1.push("&internaldns1=" + todb(args.data.internaldns1));
                                            array1.push("&internaldns2=" + todb(args.data.internaldns2));
                                            //internaldns2 can be empty ("") when passed to API, so a user gets to update this field from an existing value to blank.
                                            array1.push("&domain=" + todb(args.data.domain));
                                            array1.push("&localstorageenabled=" + (args.data.localstorageenabled == 'on'));
                                            $.ajax({
                                                url: createURL("updateZone&id=" + args.context.physicalResources[0].id + array1.join("")),
                                                dataType: "json",
                                                async: false,
                                                success: function (json) {
                                                    selectedZoneObj = json.updatezoneresponse.zone; //override selectedZoneObj after update zone
                                                    args.response.success({
                                                        data: selectedZoneObj
                                                    });
                                                },
                                                error: function (json) {
                                                    args.response.error('Could not edit zone information; please ensure all fields are valid.');
                                                }
                                            });
                                        }
                                    }
                                },
                                tabs: {
                                    details: {
                                        title: 'label.details',
                                        
                                        preFilter: function (args) {
                                            var hiddenFields =[];
                                            if (selectedZoneObj.networktype == "Basic")
                                            hiddenFields.push("guestcidraddress");
                                            return hiddenFields;
                                        },
                                        
                                        fields:[ {
                                            name: {
                                                label: 'label.zone',
                                                isEditable: true,
                                                validation: {
                                                    required: true
                                                }
                                            }
                                        },
                                        {
                                            id: {
                                                label: 'label.id'
                                            },
                                            allocationstate: {
                                                label: 'label.allocation.state'
                                            },
                                            dns1: {
                                                label: 'label.dns.1',
                                                isEditable: true,
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            dns2: {
                                                label: 'label.dns.2',
                                                isEditable: true
                                            },
                                            ip6dns1: {
                                                label: 'label.ipv6.dns1',
                                                isEditable: true
                                            },
                                            ip6dns2: {
                                                label: 'label.ipv6.dns2',
                                                isEditable: true
                                            },
                                            internaldns1: {
                                                label: 'label.internal.dns.1',
                                                isEditable: true,
                                                validation: {
                                                    required: true
                                                }
                                            },
                                            internaldns2: {
                                                label: 'label.internal.dns.2',
                                                isEditable: true
                                            },
                                            domainname: {
                                                label: 'label.domain'
                                            },
                                            networktype: {
                                                label: 'label.network.type'
                                            },
                                            guestcidraddress: {
                                                label: 'label.guest.cidr',
                                                isEditable: true
                                            },
                                            domain: {
                                                label: 'label.network.domain',
                                                isEditable: true
                                            },
                                            localstorageenabled: {
                                                label: 'label.local.storage.enabled',
                                                isBoolean: true,
                                                isEditable: true,
                                                converter: cloudStack.converters.toBooleanText
                                            }
                                        },
                                        {
                                            isdedicated: {
                                                label: 'label.dedicated'
                                            },
                                            domainid: {
                                                label: 'label.domain.id'
                                            }
                                        },
                                        {
                                            vmwaredcName: {
                                                label: 'label.vmware.datacenter.name'
                                            },
                                            vmwaredcVcenter: {
                                                label: 'label.vmware.datacenter.vcenter'
                                            },
                                            vmwaredcId: {
                                                label: 'label.vmware.datacenter.id'
                                            }
                                        }],
                                        dataProvider: function (args) {
                                            $.ajax({
                                                url: createURL('listZones'),
                                                data: {
                                                    id: args.context.physicalResources[0].id
                                                },
                                                success: function (json) {
                                                    selectedZoneObj = json.listzonesresponse.zone[0];
                                                    $.ajax({
                                                        url: createURL('listDedicatedZones'),
                                                        data: {
                                                            zoneid: args.context.physicalResources[0].id
                                                        },
                                                        async: false,
                                                        success: function (json) {
                                                            if (json.listdedicatedzonesresponse.dedicatedzone != undefined) {
                                                                var dedicatedzoneObj = json.listdedicatedzonesresponse.dedicatedzone[0];
                                                                if (dedicatedzoneObj.domainid != null) {
                                                                    $.extend(selectedZoneObj, {
                                                                        isdedicated: 'Yes',
                                                                        domainid: dedicatedzoneObj.domainid,
                                                                        accountid: dedicatedzoneObj.accountid
                                                                    });
                                                                }
                                                            } else {
                                                                $.extend(selectedZoneObj, {
                                                                    isdedicated: 'No',
                                                                    domainid: null,
                                                                    accountid: null
                                                                })
                                                            }
                                                        }
                                                    });
                                                    
                                                    $.ajax({
                                                        url: createURL('listApis'), //listVmwareDcs API only exists in non-oss bild, so have to check whether it exists before calling it.
                                                        data: {
                                                            name: 'listVmwareDcs'
                                                        },
                                                        async: false,
                                                        success: function (json) {
                                                            $.ajax({
                                                                url: createURL('listVmwareDcs'),
                                                                data: {
                                                                    zoneid: args.context.physicalResources[0].id
                                                                },
                                                                async: false,
                                                                success: function (json) {
                                                                    //e.g. json == { "listvmwaredcsresponse" { "count":1 ,"VMwareDC" [ {"id":"c3c2562d-65e9-4fc7-92e2-773c2efe8f37","zoneid":1,"name":"datacenter","vcenter":"10.10.20.20"} ] } }
                                                                    var vmwaredcs = json.listvmwaredcsresponse.VMwareDC;
                                                                    if (vmwaredcs != null) {
                                                                        selectedZoneObj.vmwaredcName = vmwaredcs[0].name;
                                                                        selectedZoneObj.vmwaredcVcenter = vmwaredcs[0].vcenter;
                                                                        selectedZoneObj.vmwaredcId = vmwaredcs[0].id;
                                                                    }
                                                                }
                                                            });
                                                        },
                                                        error: function (XMLHttpResponse) {
                                                        }
                                                        //override default error handling: cloudStack.dialog.notice({ message: parseXMLHttpResponse(XMLHttpResponse)});
                                                    });
                                                    
                                                    if (isModuleIncluded("dr")) {
                                                        cloudStack.dr.sharedFunctions.addExtraProperties(selectedZoneObj, "Zone");
                                                    }
                                                    
                                                    args.response.success({
                                                        actionFilter: zoneActionfilter,
                                                        data: selectedZoneObj
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    
                                    compute: {
                                        title: 'label.compute.and.storage',
                                        custom: cloudStack.uiCustom.systemChart('compute')
                                    },
                                    network: {
                                        title: 'label.physical.network',
                                        custom: cloudStack.uiCustom.systemChart('network')
                                    },
                                    resources: {
                                        title: 'label.resources',
                                        custom: cloudStack.uiCustom.systemChart('resources')
                                    },
                                    
                                    systemVMs: {
                                        title: 'label.system.vms',
                                        listView: {
                                            label: 'label.system.vms',
                                            id: 'systemVMs',
                                            fields: {
                                                name: {
                                                    label: 'label.name'
                                                },
                                                systemvmtype: {
                                                    label: 'label.type',
                                                    converter: function (args) {
                                                        if (args == "consoleproxy")
                                                        return "Console Proxy VM"; else if (args == "secondarystoragevm")
                                                        return "Secondary Storage VM"; else
                                                        return args;
                                                    }
                                                },
                                                zonename: {
                                                    label: 'label.zone'
                                                },
                                                state: {
                                                    label: 'label.status',
                                                    converter: function (str) {
                                                        // For localization
                                                        return str;
                                                    },
                                                    indicator: {
                                                        'Running': 'on',
                                                        'Stopped': 'off',
                                                        'Error': 'off',
                                                        'Destroyed': 'off'
                                                    }
                                                }
                                            },
                                            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;
                                                        }
                                                    }
                                                }
                                                
                                                var selectedZoneObj = args.context.physicalResources[0];
                                                $.ajax({
                                                    url: createURL("listSystemVms&zoneid=" + selectedZoneObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                                    dataType: "json",
                                                    async: true,
                                                    success: function (json) {
                                                        var items = json.listsystemvmsresponse.systemvm;
                                                        args.response.success({
                                                            actionFilter: systemvmActionfilter,
                                                            data: items
                                                        });
                                                    }
                                                });
                                            },
                                            
                                            detailView: {
                                                noCompact: true,
                                                name: 'label.system.vm.details',
                                                actions: {
                                                    start: {
                                                        label: 'label.action.start.systemvm',
                                                        messages: {
                                                            confirm: function (args) {
                                                                return 'message.action.start.systemvm';
                                                            },
                                                            notification: function (args) {
                                                                return 'label.action.start.systemvm';
                                                            }
                                                        },
                                                        action: function (args) {
                                                            $.ajax({
                                                                url: createURL('startSystemVm&id=' + args.context.systemVMs[0].id),
                                                                dataType: 'json',
                                                                async: true,
                                                                success: function (json) {
                                                                    var jid = json.startsystemvmresponse.jobid;
                                                                    args.response.success({
                                                                        _custom: {
                                                                            jobId: jid,
                                                                            getUpdatedItem: function (json) {
                                                                                return json.queryasyncjobresultresponse.jobresult.systemvm;
                                                                            },
                                                                            getActionFilter: function () {
                                                                                return systemvmActionfilter;
                                                                            }
                                                                        }
                                                                    });
                                                                }
                                                            });
                                                        },
                                                        notification: {
                                                            poll: pollAsyncJobResult
                                                        }
                                                    },
                                                    
                                                    stop: {
                                                        label: 'label.action.stop.systemvm',
                                                        messages: {
                                                            confirm: function (args) {
                                                                return 'message.action.stop.systemvm';
                                                            },
                                                            notification: function (args) {
                                                                return 'label.action.stop.systemvm';
                                                            }
                                                        },
                                                        action: function (args) {
                                                            $.ajax({
                                                                url: createURL('stopSystemVm&id=' + args.context.systemVMs[0].id),
                                                                dataType: 'json',
                                                                async: true,
                                                                success: function (json) {
                                                                    var jid = json.stopsystemvmresponse.jobid;
                                                                    args.response.success({
                                                                        _custom: {
                                                                            jobId: jid,
                                                                            getUpdatedItem: function (json) {
                                                                                return json.queryasyncjobresultresponse.jobresult.systemvm;
                                                                            },
                                                                            getActionFilter: function () {
                                                                                return systemvmActionfilter;
                                                                            }
                                                                        }
                                                                    });
                                                                }
                                                            });
                                                        },
                                                        notification: {
                                                            poll: pollAsyncJobResult
                                                        }
                                                    },
                                                    
                                                    restart: {
                                                        label: 'label.action.reboot.systemvm',
                                                        messages: {
                                                            confirm: function (args) {
                                                                return 'message.action.reboot.systemvm';
                                                            },
                                                            notification: function (args) {
                                                                return 'label.action.reboot.systemvm';
                                                            }
                                                        },
                                                        action: function (args) {
                                                            $.ajax({
                                                                url: createURL('rebootSystemVm&id=' + args.context.systemVMs[0].id),
                                                                dataType: 'json',
                                                                async: true,
                                                                success: function (json) {
                                                                    var jid = json.rebootsystemvmresponse.jobid;
                                                                    args.response.success({
                                                                        _custom: {
                                                                            jobId: jid,
                                                                            getUpdatedItem: function (json) {
                                                                                return json.queryasyncjobresultresponse.jobresult.systemvm;
                                                                            },
                                                                            getActionFilter: function () {
                                                                                return systemvmActionfilter;
                                                                            }
                                                                        }
                                                                    });
                                                                }
                                                            });
                                                        },
                                                        notification: {
                                                            poll: pollAsyncJobResult
                                                        }
                                                    },
                                                    
                                                    remove: {
                                                        label: 'label.action.destroy.systemvm',
                                                        messages: {
                                                            confirm: function (args) {
                                                                return 'message.action.destroy.systemvm';
                                                            },
                                                            notification: function (args) {
                                                                return 'label.action.destroy.systemvm';
                                                            }
                                                        },
                                                        action: function (args) {
                                                            $.ajax({
                                                                url: createURL('destroySystemVm&id=' + args.context.systemVMs[0].id),
                                                                dataType: 'json',
                                                                async: true,
                                                                success: function (json) {
                                                                    var jid = json.destroysystemvmresponse.jobid;
                                                                    args.response.success({
                                                                        _custom: {
                                                                            getUpdatedItem: function () {
                                                                                return {
                                                                                    state: 'Destroyed'
                                                                                };
                                                                            },
                                                                            jobId: jid
                                                                        }
                                                                    });
                                                                }
                                                            });
                                                        },
                                                        notification: {
                                                            poll: pollAsyncJobResult
                                                        }
                                                    },
                                                    
                                                    migrate: {
                                                        label: 'label.action.migrate.systemvm',
                                                        messages: {
                                                            notification: function (args) {
                                                                return 'label.action.migrate.systemvm';
                                                            }
                                                        },
                                                        createForm: {
                                                            title: 'label.action.migrate.systemvm',
                                                            desc: '',
                                                            fields: {
                                                                hostId: {
                                                                    label: 'label.host',
                                                                    validation: {
                                                                        required: true
                                                                    },
                                                                    select: function (args) {
                                                                        $.ajax({
                                                                            url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.systemVMs[0].id),
                                                                            dataType: "json",
                                                                            async: true,
                                                                            success: function (json) {
                                                                                var hostObjs = json.findhostsformigrationresponse.host;
                                                                                var items =[];
                                                                                $(hostObjs).each(function () {
                                                                                    if (this.requiresStorageMotion == false) {
                                                                                        items.push({
                                                                                            id: this.id,
                                                                                            description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
                                                                                        });
                                                                                    }
                                                                                });
                                                                                args.response.success({
                                                                                    data: items
                                                                                });
                                                                            }
                                                                        });
                                                                    },
                                                                    error: function (XMLHttpResponse) {
                                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                                        args.response.error(errorMsg);
                                                                    }
                                                                }
                                                            }
                                                        },
                                                        action: function (args) {
                                                            $.ajax({
                                                                url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.systemVMs[0].id),
                                                                dataType: "json",
                                                                async: true,
                                                                success: function (json) {
                                                                    var jid = json.migratesystemvmresponse.jobid;
                                                                    args.response.success({
                                                                        _custom: {
                                                                            jobId: jid,
                                                                            getUpdatedItem: function (json) {
                                                                                //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
                                                                                $.ajax({
                                                                                    url: createURL("listSystemVms&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
                                                                                    dataType: "json",
                                                                                    async: false,
                                                                                    success: function (json) {
                                                                                        var items = json.listsystemvmsresponse.systemvm;
                                                                                        if (items != null && items.length > 0) {
                                                                                            return items[0];
                                                                                        }
                                                                                    }
                                                                                });
                                                                            },
                                                                            getActionFilter: function () {
                                                                                return systemvmActionfilter;
                                                                            }
                                                                        }
                                                                    });
                                                                }
                                                            });
                                                        },
                                                        notification: {
                                                            poll: pollAsyncJobResult
                                                        }
                                                    },
                                                    
                                                    scaleUp: {
                                                        label: 'label.change.service.offering',
                                                        createForm: {
                                                            title: 'label.change.service.offering',
                                                            desc: function (args) {
                                                                var description = '';
                                                                var vmObj = args.jsonObj;
                                                                //if (vmObj.state == 'Running' && vmObj.hypervisor == 'VMware') { //needs to wait for API fix that will return hypervisor property
                                                                if (vmObj.state == 'Running') {
                                                                    description = 'message.read.admin.guide.scaling.up';
                                                                }
                                                                return description;
                                                            },
                                                            fields: {
                                                                serviceOfferingId: {
                                                                    label: 'label.compute.offering',
                                                                    select: function (args) {
                                                                        var apiCmd = "listServiceOfferings&issystem=true";
                                                                        if (args.context.systemVMs[0].systemvmtype == "secondarystoragevm")
                                                                        apiCmd += "&systemvmtype=secondarystoragevm"; else if (args.context.systemVMs[0].systemvmtype == "consoleproxy")
                                                                        apiCmd += "&systemvmtype=consoleproxy";
                                                                        $.ajax({
                                                                            url: createURL(apiCmd),
                                                                            dataType: "json",
                                                                            async: true,
                                                                            success: function (json) {
                                                                                var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
                                                                                var items =[];
                                                                                $(serviceofferings).each(function () {
                                                                                    if (this.id != args.context.systemVMs[0].serviceofferingid) {
                                                                                        items.push({
                                                                                            id: this.id,
                                                                                            description: this.name
                                                                                        });
                                                                                    }
                                                                                });
                                                                                args.response.success({
                                                                                    data: items
                                                                                });
                                                                            }
                                                                        });
                                                                    }
                                                                }
                                                            }
                                                        },
                                                        
                                                        action: function (args) {
                                                            $.ajax({
                                                                url: createURL("scaleSystemVm&id=" + args.context.systemVMs[0].id + "&serviceofferingid=" + args.data.serviceOfferingId),
                                                                dataType: "json",
                                                                async: true,
                                                                success: function (json) {
                                                                    var jid = json.changeserviceforsystemvmresponse.jobid;
                                                                    args.response.success({
                                                                        _custom: {
                                                                            jobId: jid,
                                                                            getUpdatedItem: function (json) {
                                                                                return json.queryasyncjobresultresponse.jobresult.systemvm;
                                                                            },
                                                                            getActionFilter: function () {
                                                                                return systemvmActionfilter;
                                                                            }
                                                                        }
                                                                    });
                                                                },
                                                                error: function (json) {
                                                                    args.response.error(parseXMLHttpResponse(json));
                                                                }
                                                            });
                                                        },
                                                        messages: {
                                                            confirm: function (args) {
                                                                return 'message.confirm.scale.up.system.vm';
                                                            },
                                                            notification: function (args) {
                                                                
                                                                return 'label.system.vm.scaled.up';
                                                            }
                                                        },
                                                        notification: {
                                                            poll: pollAsyncJobResult
                                                        }
                                                    },
                                                    
                                                    
                                                    viewConsole: {
                                                        label: 'label.view.console',
                                                        action: {
                                                            externalLink: {
                                                                url: function (args) {
                                                                    return clientConsoleUrl + '?cmd=access&vm=' + args.context.systemVMs[0].id;
                                                                },
                                                                title: function (args) {
                                                                    return args.context.systemVMs[0].id.substr(0, 8);
                                                                    //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
                                                                },
                                                                width: 820,
                                                                height: 640
                                                            }
                                                        }
                                                    }
                                                },
                                                tabs: {
                                                    details: {
                                                        title: 'label.details',
                                                        fields:[ {
                                                            name: {
                                                                label: 'label.name'
                                                            }
                                                        },
                                                        {
                                                            id: {
                                                                label: 'label.id'
                                                            },
                                                            state: {
                                                                label: 'label.state'
                                                            },
                                                            systemvmtype: {
                                                                label: 'label.type',
                                                                converter: function (args) {
                                                                    if (args == "consoleproxy")
                                                                    return 'label.console.proxy.vm'; else if (args == "secondarystoragevm")
                                                                    return 'label.secondary.storage.vm'; else
                                                                    return args;
                                                                }
                                                            },
                                                            zonename: {
                                                                label: 'label.zone'
                                                            },
                                                            publicip: {
                                                                label: 'label.public.ip'
                                                            },
                                                            privateip: {
                                                                label: 'label.private.ip'
                                                            },
                                                            linklocalip: {
                                                                label: 'label.linklocal.ip'
                                                            },
                                                            hostname: {
                                                                label: 'label.host'
                                                            },
                                                            gateway: {
                                                                label: 'label.gateway'
                                                            },
                                                            created: {
                                                                label: 'label.created',
                                                                converter: cloudStack.converters.toLocalDate
                                                            },
                                                            activeviewersessions: {
                                                                label: 'label.active.sessions'
                                                            }
                                                        }],
                                                        dataProvider: function (args) {
                                                            $.ajax({
                                                                url: createURL("listSystemVms&id=" + args.context.systemVMs[0].id),
                                                                dataType: "json",
                                                                async: true,
                                                                success: function (json) {
                                                                    args.response.success({
                                                                        actionFilter: systemvmActionfilter,
                                                                        data: json.listsystemvmsresponse.systemvm[0]
                                                                    });
                                                                }
                                                            });
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    },
                                    
                                    // Granular settings for zone
                                    settings: {
                                        title: 'label.settings',
                                        custom: cloudStack.uiCustom.granularSettings({
                                            dataProvider: function (args) {
                                                $.ajax({
                                                    url: createURL('listConfigurations&zoneid=' + args.context.physicalResources[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 updateZoneLevelParamter
                                                    var data = {
                                                        name: args.data.jsonObj.name,
                                                        value: args.data.value
                                                    };
                                                    
                                                    $.ajax({
                                                        url: createURL('updateConfiguration&zoneid=' + args.context.physicalResources[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));
                                                        }
                                                    });
                                                }
                                            }
                                        })
                                    }
                                }
                            }
                        },
                        pods: function () {
                            var listView = $.extend(true, {
                            },
                            cloudStack.sections.system.subsections.pods.listView, {
                                dataProvider: function (args) {
                                    var data = {
                                    };
                                    listViewDataProvider(args, data);
                                    
                                    $.ajax({
                                        url: createURL('listPods'),
                                        data: data,
                                        success: function (json) {
                                            args.response.success({
                                                data: json.listpodsresponse.pod
                                            });
                                        },
                                        error: function (json) {
                                            args.response.error(parseXMLHttpResponse(json));
                                        }
                                    });
                                },
                                
                                detailView: {
                                    updateContext: function (args) {
                                        var zone;
                                        
                                        $.ajax({
                                            url: createURL('listZones'),
                                            data: {
                                                id: args.context.pods[0].zoneid
                                            },
                                            async: false,
                                            success: function (json) {
                                                zone = json.listzonesresponse.zone[0];
                                            }
                                        });
                                        
                                        selectedZoneObj = zone;
                                        
                                        return {
                                            zones:[zone]
                                        };
                                    }
                                }
                            });
                            
                            return listView;
                        },
                        clusters: function () {
                            var listView = $.extend(true, {
                            },
                            cloudStack.sections.system.subsections.clusters.listView, {
                                dataProvider: function (args) {
                                    var data = {
                                    };
                                    listViewDataProvider(args, data);
                                    
                                    $.ajax({
                                        url: createURL('listClusters'),
                                        data: data,
                                        success: function (json) {
                                            args.response.success({
                                                data: json.listclustersresponse.cluster
                                            });
                                        },
                                        error: function (json) {
                                            args.response.error(parseXMLHttpResponse(json));
                                        }
                                    });
                                },
                                
                                detailView: {
                                    updateContext: function (args) {
                                        var zone;
                                        
                                        $.ajax({
                                            url: createURL('listZones'),
                                            data: {
                                                id: args.context.clusters[0].zoneid
                                            },
                                            async: false,
                                            success: function (json) {
                                                zone = json.listzonesresponse.zone[0];
                                            }
                                        });
                                        
                                        selectedZoneObj = zone;
                                        
                                        return {
                                            zones:[zone]
                                        };
                                    }
                                }
                            });
                            
                            return listView;
                        },
                        hosts: function () {
                            var listView = $.extend(true, {
                            },
                            cloudStack.sections.system.subsections.hosts.listView, {
                                dataProvider: function (args) {
                                    var data = {
                                        type: 'routing'
                                    };
                                    listViewDataProvider(args, data);
                                    
                                    $.ajax({
                                        url: createURL('listHosts'),
                                        data: data,
                                        success: function (json) {
                                            args.response.success({
                                                data: json.listhostsresponse.host
                                            });
                                        },
                                        error: function (json) {
                                            args.response.error(parseXMLHttpResponse(json));
                                        }
                                    });
                                },
                                
                                detailView: {
                                    updateContext: function (args) {
                                        var zone;
                                        
                                        $.ajax({
                                            url: createURL('listZones'),
                                            data: {
                                                id: args.context.hosts[0].zoneid
                                            },
                                            async: false,
                                            success: function (json) {
                                                zone = json.listzonesresponse.zone[0];
                                            }
                                        });
                                        
                                        selectedZoneObj = zone;
                                        
                                        return {
                                            zones:[zone]
                                        };
                                    }
                                }
                            });
                            
                            return listView;
                        },
                        primaryStorage: function () {
                            var listView = $.extend(true, {
                            },
                            cloudStack.sections.system.subsections[ 'primary-storage'].listView, {
                                dataProvider: function (args) {
                                    var data = {
                                    };
                                    listViewDataProvider(args, data);
                                    
                                    $.ajax({
                                        url: createURL('listStoragePools'),
                                        data: data,
                                        success: function (json) {
                                            args.response.success({
                                                data: json.liststoragepoolsresponse.storagepool
                                            });
                                        },
                                        error: function (json) {
                                            args.response.error(parseXMLHttpResponse(json));
                                        }
                                    });
                                },
                                
                                detailView: {
                                    updateContext: function (args) {
                                        var zone;
                                        
                                        $.ajax({
                                            url: createURL('listZones'),
                                            data: {
                                                id: args.context.primarystorages[0].zoneid
                                            },
                                            async: false,
                                            success: function (json) {
                                                zone = json.listzonesresponse.zone[0];
                                            }
                                        });
                                        
                                        selectedZoneObj = zone;
                                        
                                        return {
                                            zones:[zone]
                                        };
                                    }
                                }
                            });
                            
                            return listView;
                        },
                        
                        secondaryStorage: function () {
                            var listView = $.extend(
                            true, {
                            },
                            cloudStack.sections.system.subsections[ 'secondary-storage'], {
                                sections: {
                                    secondaryStorage: {
                                        listView: {
                                            dataProvider: function (args) {
                                                var data = {
                                                    type: 'SecondaryStorage'
                                                };
                                                listViewDataProvider(args, data);
                                                
                                                $.ajax({
                                                    url: createURL('listImageStores'),
                                                    data: data,
                                                    success: function (json) {
                                                        var items = json.listimagestoresresponse.imagestore;
                                                        if (items != undefined) {
                                                            for (var i = 0; i < items.length; i++) {
                                                                processPropertiesInImagestoreObject(items[i]);
                                                            }
                                                        }
                                                        args.response.success({
                                                            data: items
                                                        });
                                                    },
                                                    error: function (json) {
                                                        args.response.error(parseXMLHttpResponse(json));
                                                    }
                                                });
                                            }
                                        }
                                    },
                                    cacheStorage: {
                                        listView: {
                                            dataProvider: function (args) {
                                                var data = {
                                                };
                                                listViewDataProvider(args, data);
                                                
                                                $.ajax({
                                                    url: createURL('listSecondaryStagingStores'),
                                                    data: data,
                                                    success: function (json) {
                                                        args.response.success({
                                                            data: json.listsecondarystagingstoreresponse.imagestore
                                                        });
                                                    },
                                                    error: function (json) {
                                                        args.response.error(parseXMLHttpResponse(json));
                                                    }
                                                });
                                            }
                                            
                                            /*
                                            ,
                                            detailView: {
                                            updateContext: function (args) {
                                            return {
                                            zones: [{}]
                                            };
                                            }
                                            }
                                             */
                                        }
                                    }
                                }
                            });
                            
                            return listView;
                        },
                        systemVms: function () {
                            var listView = $.extend(true, {
                            },
                            cloudStack.sections.system.subsections.systemVms.listView, {
                                dataProvider: function (args) {
                                    var data = {
                                    };
                                    listViewDataProvider(args, data);
                                    
                                    $.ajax({
                                        url: createURL('listSystemVms'),
                                        data: data,
                                        success: function (json) {
                                            var systemvmObjs = json.listsystemvmsresponse.systemvm;
                                            if (systemvmObjs != undefined) {
                                                $.ajax({
                                                    url: createURL('listHosts'),
                                                    data: {
                                                        listAll: true,
                                                        details: 'min'
                                                    },
                                                    success: function (json) {
                                                        var hostObjs = json.listhostsresponse.host;
                                                        for (var i = 0; i < systemvmObjs.length; i++) {
                                                            for (var k = 0; k < hostObjs.length; k++) {
                                                                if (hostObjs[k].name == systemvmObjs[i].name) {
                                                                    systemvmObjs[i].agentstate = hostObjs[k].state;
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                        args.response.success({
                                                            data: systemvmObjs
                                                        });
                                                    }
                                                });
                                            } else {
                                                args.response.success({
                                                    data:[]
                                                });
                                            }
                                        }
                                    });
                                },
                                
                                detailView: {
                                    updateContext: function (args) {
                                        var zone;
                                        
                                        $.ajax({
                                            url: createURL('listZones'),
                                            data: {
                                                id: args.context.systemVMs[0].zoneid
                                            },
                                            async: false,
                                            success: function (json) {
                                                zone = json.listzonesresponse.zone[0];
                                            }
                                        });
                                        
                                        selectedZoneObj = zone;
                                        
                                        return {
                                            zones:[zone]
                                        };
                                    }
                                }
                            });
                            
                            return listView;
                        },
                        virtualRouters: function () {
                            var listView = $.extend(true, {
                            },
                            cloudStack.sections.system.subsections.virtualRouters, {
                                sections: {
                                    virtualRouterNoGrouping: {
                                        listView: {
                                            dataProvider: function (args) {
                                                var data = {
                                                };
                                                listViewDataProvider(args, data);
                                                
                                                var routers =[];
                                                
                                                //get account-owned routers
                                                $.ajax({
                                                    url: createURL('listRouters'),
                                                    data: $.extend(data, {
                                                        listAll: true
                                                    }),
                                                    async: false,
                                                    success: function (json) {
                                                        var items = json.listroutersresponse.router ? json.listroutersresponse.router:[];
                                                        $(items).map(function (index, item) {
                                                            routers.push(item);
                                                        });
                                                        
                                                        //if account is specified in advanced search, don't search project-owned routers
                                                        var accountIsNotSpecifiedInAdvSearch = true;
                                                        if (args.filterBy != null) {
                                                            if (args.filterBy.advSearch != null && typeof(args.filterBy.advSearch) == "object") { //advanced search
                                                                if ('account' in args.filterBy.advSearch  && args.filterBy.advSearch.account.length > 0) { 
                                                                    accountIsNotSpecifiedInAdvSearch = false;  //since account and projectid can't be specified together
                                                                }
                                                            }
                                                        }
                                                        if (accountIsNotSpecifiedInAdvSearch) {                                                        
				                                            /*
				                                             * In project view, the first listRotuers API(without projectid=-1) will return the same objects as the second listRouters API(with projectid=-1),
				                                             * because in project view, all API calls are appended with projectid=[projectID].  
				                                             * Therefore, we only call the second listRouters API(with projectid=-1) in non-project view.
				                                             */   
				                                            if (cloudStack.context && cloudStack.context.projects == null) { //non-project view
                                                            $.ajax({
					                                                url: createURL("listRouters&listAll=true&page=" + args.page + "&pagesize=" + pageSize + "&projectid=-1"),
                                                                async: false,
                                                                success: function (json) {
                                                                    var items = json.listroutersresponse.router ? json.listroutersresponse.router:[];
                                                                    $(items).map(function (index, item) {
                                                                        routers.push(item);
                                                                    });
                                                                }
                                                            });
				
                                                        }
                                                    }
			                                                                                        
			                                            args.response.success({
			                                                actionFilter: routerActionfilter,
			                                                data: $(routers).map(mapRouterType)
			                                            });                                                    
                                                    }
                                                });
                                                
                                                args.response.success({
                                                    actionFilter: routerActionfilter,
                                                    data: $(routers).map(mapRouterType)
                                                });
                                            },
                                            
                                            detailView: {
                                                updateContext: function (args) {
                                                    var zone;
                                                    
                                                    $.ajax({
                                                        url: createURL('listZones'),
                                                        data: {
                                                            id: args.context.routers[0].zoneid
                                                        },
                                                        async: false,
                                                        success: function (json) {
                                                            zone = json.listzonesresponse.zone[0];
                                                        }
                                                    });
                                                    
                                                    selectedZoneObj = zone;
                                                    
                                                    return {
                                                        zones:[zone]
                                                    };
                                                }
                                            }
                                        }
                                    }
                                }
                            });
                            
                            return listView;
                        },
                        
                        sockets: function () {
                            var listView = {
                                id: 'sockets',
                                fields: {
                                    hypervisor: {
                                        label: 'label.hypervisor'
                                    },
                                    hosts: {
                                        label: 'label.hosts'
                                    },
                                    sockets: {
                                        label: 'label.sockets'
                                    }
                                },
                                dataProvider: function (args) {
                                	var array1 = [];
                                	
                                	// ***** non XenServer (begin) *****
                                	var hypervisors = ["Hyperv", "KVM", "VMware", "BareMetal", "LXC"];
                                	
                                        	var supportSocketHypervisors = {
                                        		"Hyperv": 1, 
                                        		"KVM": 1, 
                                        		"VMware": 1
                                        	};                                        	
                                        	
                                	for (var h = 0; h < hypervisors.length; h++) {
                                                    var totalHostCount = 0;
                                                    var currentPage = 1;
                                                    var returnedHostCount = 0;
                                                    var returnedHostCpusocketsSum = 0;
                                                    
                                    	var callListHostsWithPage = function() {                                                		
                                                        $.ajax({
                                                            url: createURL('listHosts'),
                                                            async: false,
                                                            data: {
                                                                type: 'routing',
                                        			hypervisor: hypervisors[h],
                                                                page: currentPage,
                                                                pagesize: pageSize //global variable
                                                            },
                                                            success: function (json) {
                                                                if (json.listhostsresponse.count == undefined) {
                                                                    return;
                                                                }
                                                                
                                                                    totalHostCount = json.listhostsresponse.count;
                                                                returnedHostCount += json.listhostsresponse.host.length;
                                                                
                                                                var items = json.listhostsresponse.host;
                                                                for (var i = 0; i < items.length; i++) {
                                                                    if (items[i].cpusockets != undefined && isNaN(items[i].cpusockets) == false) {
                                                                        returnedHostCpusocketsSum += items[i].cpusockets;
                                                                    }
                                                                }
                                                                
                                                                if (returnedHostCount < totalHostCount) {
                                                                    currentPage++;
                                        				callListHostsWithPage();
                                                                }
                                                            }
                                                        });
                                                    }
                                                    
                                    	callListHostsWithPage();
                                                    
                                    	if ((hypervisors[h] in supportSocketHypervisors) == false) {                                                		
                                                		returnedHostCpusocketsSum = 'N/A';                                                		                                              		
                                                	}
                                                	                                                	
                                    	var hypervisorName = hypervisors[h];
                                    	if (hypervisorName == "Hyperv") {
                                    		hypervisorName = "Hyper-V";
                                    	}
                                    	
                                    	array1.push({
                                            hypervisor: hypervisorName,
                                                        hosts: totalHostCount,
                                                        sockets: returnedHostCpusocketsSum
                                            });
                                        }
                                	// ***** non XenServer (end) *****
                                	
                                	
                                	// ***** XenServer (begin) *****
                                	var totalHostCount = 0;                                                	
                                	var currentPage = 1;
                                	var returnedHostCount = 0;
                                	
                                	var returnedHostCountForXenServer61x = 0;  //'XenServer 6.1.x and before'
                                	var returnedHostCountForXenServer620 = 0;  //'XenServer 6.2.0'                               	
                                	var returnedHostCpusocketsSumForXenServer620 = 0;    
                                	
                                	var callListHostsWithPage = function() {                                                		
                                		$.ajax({
                        					url: createURL('listHosts'),
                                    		async: false,
                                    		data: {
                                    			type: 'routing',
                                    			hypervisor: 'XenServer',
                                    			page: currentPage,
                                    	        pagesize: pageSize //global variable
                                    		},
                                    		success: function(json) {   
                                    			if (json.listhostsresponse.count == undefined) {   
                                    				return;
                                    			}           
                                    			
                                    			totalHostCount = json.listhostsresponse.count;                                        			                                                    			
                                    			returnedHostCount += json.listhostsresponse.host.length;
                                    			                                                    			
                                    			var items = json.listhostsresponse.host;
                                    			for (var i = 0; i < items.length; i++) {
                                    				//"hypervisorversion" == "6.2.0"
                                    				if (items[i].hypervisorversion == "6.2.0") {
                                    					returnedHostCountForXenServer620 ++;
                                    					if (items[i].cpusockets != undefined && isNaN(items[i].cpusockets) == false) {
                                        					returnedHostCpusocketsSumForXenServer620 += items[i].cpusockets;
                                        				} 
                                    				} else {
                                    					returnedHostCountForXenServer61x++;
                                    				}
                                    			}  
                                    			
                                    			if (returnedHostCount < totalHostCount) {
                                    				currentPage++;
                                    				callListHostsWithPage();
                                    			}                                                    			
                                    		}
                        				});                                                		
                                	}
                                	
                                	callListHostsWithPage();                                	                                                  	
                                	
                                	array1.push({
                                        hypervisor: 'XenServer 6.1.x and before',
                                        hosts: returnedHostCountForXenServer61x,
                                        sockets: 'N/A'                                                   
                                    });
                                	
                                	array1.push({
                                        hypervisor: 'XenServer 6.2.0',
                                        hosts: returnedHostCountForXenServer620,
                                        sockets: returnedHostCpusocketsSumForXenServer620                                                    
                                    });
                                	// ***** XenServer (end) *****
                                	
                                	
                                	args.response.success({
                                        data: array1
                                    });
                                	
                                }
                            };
                            
                            return listView;
                        }
                    }
                }
            }
        }),
        subsections: {
            virtualRouters: {
                sectionSelect: {
                    label: 'label.select-view',
                    preFilter: function(args) {                    	
                    	//Only clicking ViewAll Link("view all Virtual Routers") in "Virtual Routers group by XXXXXXX" detailView will have "routerGroupByXXXXXXX" included in args.context
                        if ("routerGroupByZone" in args.context) {
                        	return ["routerGroupByZone"]; // read-only (i.e. text "group by Zone") 
                        } else if ( "routerGroupByPod" in args.context) {
                        	return ["routerGroupByPod"]; // read-only (i.e. text "group by Pod") 
                        } else if ("routerGroupByCluster" in args.context) {
                        	return ["routerGroupByCluster"]; // read-only (i.e. text "group by Cluster") 
                        } else if ("routerGroupByAccount" in args.context) {
                        	return ["routerGroupByAccount"]; // read-only (i.e. text "group by Account") 
                        } else {
                        	return ["routerNoGroup", "routerGroupByZone", "routerGroupByPod", "routerGroupByCluster", "routerGroupByAccount"]; //editable dropdown 
                        }
                    }
                },
                sections: {
                    routerNoGroup: {
                        id: 'routers',
                        type: 'select',
                        title: 'label.no.grouping',
                        listView: {
                            id: 'routers',
                            label: 'label.virtual.appliances',
                            fields: {
                                name: {
                                    label: 'label.name'
                                },
                                publicip: {
                                    label: 'label.public.ip'
                                },
                                routerType: {
                                    label: 'label.type'
                                },
                                state: {
                                    converter: function (str) {
                                        // For localization
                                        return str;
                                    },
                                    label: 'label.status',
                                    indicator: {
                                        'Running': 'on',
                                        'Stopped': 'off',
                                        'Error': 'off'
                                    }
                                },
                                requiresupgrade: {
                                    label: 'label.requires.upgrade',
                                    converter: cloudStack.converters.toBooleanText
                                }
                            },
                            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;
                                        }
                                    }
                                }
                                
                                var data2 = {
                                    // forvpc: false
                                };
                                
                                if (args.context != undefined) {
	                                if ("routerGroupByZone" in args.context) {
	                                    $.extend(data2, {
	                                        zoneid: args.context.routerGroupByZone[0].id
	                                    })
	                                } else if ("routerGroupByPod" in args.context) {
	                                    $.extend(data2, {
	                                        podid: args.context.routerGroupByPod[0].id
	                                    })
	                                } else if ("routerGroupByCluster" in args.context) {
	                                    $.extend(data2, {
	                                        clusterid: args.context.routerGroupByCluster[0].id
	                                    })
	                                } else if ("routerGroupByAccount" in args.context) {
	                                    $.extend(data2, {
	                                    	 account: args.context.routerGroupByAccount[0].name,
	                                         domainid: args.context.routerGroupByAccount[0].domainid
	                                    })
	                                }
                                }                               
                                
                                var routers =[];
                                $.ajax({
                                    url: createURL("listRouters&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                    data: data2,
                                    success: function (json) {
                                        var items = json.listroutersresponse.router ?
                                        json.listroutersresponse.router:[];
                                        
                                        $(items).map(function (index, item) {
                                            routers.push(item);
                                        });
                                
                                /*
                                 * In project view, the first listRotuers API(without projectid=-1) will return the same objects as the second listRouters API(with projectid=-1),
                                 * because in project view, all API calls are appended with projectid=[projectID].  
                                 * Therefore, we only call the second listRouters API(with projectid=-1) in non-project view.
                                 */   
                                if (cloudStack.context && cloudStack.context.projects == null) { //non-project view
                                    /* 
                                     * account parameter(account+domainid) and project parameter(projectid) are not allowed to be passed together to listXXXXXXX API. 
                                     * So, remove account parameter(account+domainid) from data2
                                     */                                    	
                                	if ("account" in data2) {
                                		delete data2.account;
                                	}
                                	if ("domainid" in data2) {
                                		delete data2.domainid;
                                	}                                	
                                	
                                	$.ajax({
                                            url: createURL("listRouters&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("") + "&projectid=-1"),
                                            data: data2,
	                                    async: false,
                                            success: function (json) {
                                                var items = json.listroutersresponse.router ?
                                                json.listroutersresponse.router:[];
                                                
                                                $(items).map(function (index, item) {
                                                    routers.push(item);
                                                });
	                                    }
	                                });
                                }
                                
                                                args.response.success({
                                                    actionFilter: routerActionfilter,
                                                    data: $(routers).map(mapRouterType)
                                                });
                                            }
                                        });
                            },
                            detailView: {
                                name: 'label.virtual.appliance.details',
                                actions: {
                                    start: {
                                        label: 'label.action.start.router',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.action.start.router';
                                            },
                                            notification: function (args) {
                                                return 'label.action.start.router';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL('startRouter&id=' + args.context.routers[0].id),
                                                dataType: 'json',
                                                async: true,
                                                success: function (json) {
                                                    var jid = json.startrouterresponse.jobid;
                                                    args.response.success({
                                                        _custom: {
                                                            jobId: jid,
                                                            getUpdatedItem: function (json) {
                                                                return json.queryasyncjobresultresponse.jobresult.router;
                                                            },
                                                            getActionFilter: function () {
                                                                return routerActionfilter;
                                                            }
                                                        }
                                                    });
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    },
                                    
                                    stop: {
                                        label: 'label.action.stop.router',
                                        createForm: {
                                            title: 'label.action.stop.router',
                                            desc: 'message.action.stop.router',
                                            fields: {
                                                forced: {
                                                    label: 'force.stop',
                                                    isBoolean: true,
                                                    isChecked: false
                                                }
                                            }
                                        },
                                        messages: {
                                            notification: function (args) {
                                                return 'label.action.stop.router';
                                            }
                                        },
                                        action: function (args) {
                                            var array1 =[];
                                            array1.push("&forced=" + (args.data.forced == "on"));
                                            $.ajax({
                                                url: createURL('stopRouter&id=' + args.context.routers[0].id + array1.join("")),
                                                dataType: 'json',
                                                async: true,
                                                success: function (json) {
                                                    var jid = json.stoprouterresponse.jobid;
                                                    args.response.success({
                                                        _custom: {
                                                            jobId: jid,
                                                            getUpdatedItem: function (json) {
                                                                return json.queryasyncjobresultresponse.jobresult.router;
                                                            },
                                                            getActionFilter: function () {
                                                                return routerActionfilter;
                                                            }
                                                        }
                                                    });
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    },
                                    
                                    upgradeRouterToUseNewerTemplate: {
                                        label: 'label.upgrade.router.newer.template',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.confirm.upgrade.router.newer.template';
                                            },
                                            notification: function (args) {
                                                return 'label.upgrade.router.newer.template';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL('upgradeRouterTemplate'),
                                                data: {
                                                    id: args.context.routers[0].id
                                                },
                                                success: function (json) {
                                                    var jobs = json.upgraderoutertemplateresponse.asyncjobs;
                                                    if (jobs != undefined) {
                                                        args.response.success({
                                                            _custom: {
                                                                jobId: jobs[0].jobid
                                                            }
                                                        });
                                                    }
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    },
                                    
                                    'remove': {
                                        label: 'label.destroy.router',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.confirm.destroy.router';
                                            },
                                            notification: function (args) {
                                                return 'label.destroy.router';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL("destroyRouter&id=" + args.context.routers[0].id),
                                                dataType: "json",
                                                async: true,
                                                success: function (json) {
                                                    var jid = json.destroyrouterresponse.jobid;
                                                    args.response.success({
                                                        _custom: {
                                                            jobId: jid
                                                        }
                                                    });
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    },
                                    
                                    restart: {
                                        label: 'label.action.reboot.router',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.action.reboot.router';
                                            },
                                            notification: function (args) {
                                                return 'label.action.reboot.router';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL('rebootRouter&id=' + args.context.routers[0].id),
                                                dataType: 'json',
                                                async: true,
                                                success: function (json) {
                                                    var jid = json.rebootrouterresponse.jobid;
                                                    args.response.success({
                                                        _custom: {
                                                            jobId: jid,
                                                            getUpdatedItem: function (json) {
                                                                return json.queryasyncjobresultresponse.jobresult.router;
                                                            },
                                                            getActionFilter: function () {
                                                                return routerActionfilter;
                                                            }
                                                        }
                                                    });
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    },
                                    
                                    migrate: {
                                        label: 'label.action.migrate.router',
                                        createForm: {
                                            title: 'label.action.migrate.router',
                                            desc: '',
                                            fields: {
                                                hostId: {
                                                    label: 'label.host',
                                                    validation: {
                                                        required: true
                                                    },
                                                    select: function (args) {
                                                        $.ajax({
                                                            url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.routers[0].id),
                                                            dataType: "json",
                                                            async: true,
                                                            success: function (json) {
                                                                var hostObjs = json.findhostsformigrationresponse.host;
                                                                var items =[];
                                                                $(hostObjs).each(function () {
                                                                    items.push({
                                                                        id: this.id,
                                                                        description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
                                                                    });
                                                                });
                                                                args.response.success({
                                                                    data: items
                                                                });
                                                            }
                                                        });
                                                    },
                                                    error: function (XMLHttpResponse) {
                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                        args.response.error(errorMsg);
                                                    }
                                                }
                                            }
                                        },
                                        messages: {
                                            notification: function (args) {
                                                return 'label.action.migrate.router';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.routers[0].id),
                                                dataType: "json",
                                                async: true,
                                                success: function (json) {
                                                    var jid = json.migratesystemvmresponse.jobid;
                                                    args.response.success({
                                                        _custom: {
                                                            jobId: jid,
                                                            getUpdatedItem: function (json) {
                                                                //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
                                                                $.ajax({
                                                                    url: createURL("listRouters&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
                                                                    dataType: "json",
                                                                    async: false,
                                                                    success: function (json) {
                                                                        var items = json.listroutersresponse.router;
                                                                        if (items != null && items.length > 0) {
                                                                            return items[0];
                                                                        }
                                                                    }
                                                                });
                                                            },
                                                            getActionFilter: function () {
                                                                return routerActionfilter;
                                                            }
                                                        }
                                                    });
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    },
                                    
                                    scaleUp: {
                                        label: 'label.change.service.offering',
                                        createForm: {
                                            title: 'label.change.service.offering',
                                            desc: function (args) {
                                                var description = '';
                                                var vmObj = args.jsonObj;
                                                //if (vmObj.state == 'Running' && vmObj.hypervisor == 'VMware') { //needs to wait for API fix that will return hypervisor property
                                                if (vmObj.state == 'Running') {
                                                    description = 'message.read.admin.guide.scaling.up';
                                                }
                                                return description;
                                            },
                                            fields: {
                                                serviceOfferingId: {
                                                    label: 'label.compute.offering',
                                                    select: function (args) {
                                                        $.ajax({
                                                            url: createURL('listServiceOfferings'),
                                                            data: {
                                                                issystem: true,
                                                                systemvmtype: 'domainrouter'
                                                            },
                                                            success: function (json) {
                                                                var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
                                                                var items =[];
                                                                $(serviceofferings).each(function () {
                                                                    // if(this.id != args.context.routers[0].serviceofferingid) {
                                                                    items.push({
                                                                        id: this.id,
                                                                        description: this.name
                                                                    });
                                                                    //default one (i.e. "System Offering For Software Router") doesn't have displaytext property. So, got to use name property instead.
                                                                });
                                                                args.response.success({
                                                                    data: items
                                                                });
                                                            }
                                                        });
                                                    }
                                                }
                                            }
                                        },
                                        
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL("scaleSystemVm&id=" + args.context.routers[0].id + "&serviceofferingid=" + args.data.serviceOfferingId),
                                                dataType: "json",
                                                async: true,
                                                success: function (json) {
                                                    var jid = json.changeserviceforsystemvmresponse.jobid;
                                                    args.response.success({
                                                        _custom: {
                                                            jobId: jid,
                                                            getUpdatedItem: function (json) {
                                                                return json.queryasyncjobresultresponse.jobresult.systemvm;
                                                            },
                                                            getActionFilter: function () {
                                                                return routerActionfilter;
                                                            }
                                                        }
                                                    });
                                                },
                                                error: function (json) {
                                                    args.response.error(parseXMLHttpResponse(json));
                                                }
                                            });
                                        },
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.confirm.scale.up.router.vm';
                                            },
                                            notification: function (args) {
                                                
                                                return 'label.router.vm.scaled.up';
                                            }
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    },
                                    
                                    
                                    viewConsole: {
                                        label: 'label.view.console',
                                        action: {
                                            externalLink: {
                                                url: function (args) {
                                                    return clientConsoleUrl + '?cmd=access&vm=' + args.context.routers[0].id;
                                                },
                                                title: function (args) {
                                                    return args.context.routers[0].id.substr(0, 8);
                                                    //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
                                                },
                                                width: 820,
                                                height: 640
                                            }
                                        }
                                    }
                                },
                                tabs: {
                                    details: {
                                        title: 'label.details',
                                        preFilter: function (args) {
                                            var hiddenFields =[];
                                            if (! args.context.routers[0].project) {
                                                hiddenFields.push('project');
                                                hiddenFields.push('projectid');
                                            }
                                            $.ajax({
                                                url: createURL('listZones'),
                                                data: {
                                                    id: args.context.routers[0].zoneid
                                                },
                                                async: false,
                                                success: function (json) {
                                                    if (json.listzonesresponse.zone != undefined) {
                                                        var zoneObj = json.listzonesresponse.zone[0];
                                                        if (zoneObj.networktype == 'Basic') {
                                                            hiddenFields.push('publicip');
                                                            //In Basic zone, guest IP is public IP. So, publicip is not returned by listRouters API. Only guestipaddress is returned by listRouters API.
                                                        }
                                                    }
                                                }
                                            });
                                            
                                            return hiddenFields;
                                        },
                                        fields:[ {
                                            name: {
                                                label: 'label.name'
                                            },
                                            project: {
                                                label: 'label.project'
                                            }
                                        },
                                        {
                                            id: {
                                                label: 'label.id'
                                            },
                                            projectid: {
                                                label: 'label.project.id'
                                            },
                                            state: {
                                                label: 'label.state'
                                            },
                                            version: {
                                                label: 'label.version'
                                            },
                                            requiresupgrade: {
                                                label: 'label.requires.upgrade',
                                                converter: cloudStack.converters.toBooleanText
                                            },
                                            guestnetworkid: {
                                                label: 'label.network.id'
                                            },
                                            publicip: {
                                                label: 'label.public.ip'
                                            },
                                            guestipaddress: {
                                                label: 'label.guest.ip'
                                            },
                                            linklocalip: {
                                                label: 'label.linklocal.ip'
                                            },
                                            hostname: {
                                                label: 'label.host'
                                            },
                                            serviceofferingname: {
                                                label: 'label.compute.offering'
                                            },
                                            networkdomain: {
                                                label: 'label.network.domain'
                                            },
                                            domain: {
                                                label: 'label.domain'
                                            },
                                            account: {
                                                label: 'label.account'
                                            },
                                            created: {
                                                label: 'label.created',
                                                converter: cloudStack.converters.toLocalDate
                                            },
                                            isredundantrouter: {
                                                label: 'label.redundant.router',
                                                converter: cloudStack.converters.toBooleanText
                                            },
                                            redundantRouterState: {
                                                label: 'label.redundant.state'
                                            },
                                            vpcid: {
                                                label: 'label.vpc.id'
                                            }
                                        }],
                                        dataProvider: function (args) {
                                            $.ajax({
                                                url: createURL("listRouters&id=" + args.context.routers[0].id),
                                                dataType: 'json',
                                                async: true,
                                                success: function (json) {
                                                    var jsonObj = json.listroutersresponse.router[0];
                                                    addExtraPropertiesToRouterInstanceObject(jsonObj);
                                                    args.response.success({
                                                        actionFilter: routerActionfilter,
                                                        data: jsonObj
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    nics: {
                                        title: 'label.nics',
                                        multiple: true,
                                        fields:[ {
                                            name: {
                                                label: 'label.name',
                                                header: true
                                            },
                                            type: {
                                                label: 'label.type'
                                            },
                                            traffictype: {
                                                label: 'label.traffic.type'
                                            },
                                            networkname: {
                                                label: 'label.network.name'
                                            },
                                            netmask: {
                                                label: 'label.netmask'
                                            },
                                            ipaddress: {
                                                label: 'label.ip.address'
                                            },
                                            id: {
                                                label: 'label.id'
                                            },
                                            networkid: {
                                                label: 'label.network.id'
                                            },
                                            isolationuri: {
                                                label: 'label.isolation.uri'
                                            },
                                            broadcasturi: {
                                                label: 'label.broadcast.uri'
                                            }
                                        }],
                                        dataProvider: function (args) {
                                            $.ajax({
                                                url: createURL("listRouters&id=" + args.context.routers[0].id),
                                                dataType: 'json',
                                                async: true,
                                                success: function (json) {
                                                    var jsonObj = json.listroutersresponse.router[0].nic;
                                                    
                                                    args.response.success({
                                                        actionFilter: routerActionfilter,
                                                        data: $.map(jsonObj, function (nic, index) {
                                                            var name = 'NIC ' + (index + 1);
                                                            if (nic.isdefault) {
                                                                name += ' (' + _l('label.default') + ')';
                                                            }
                                                            return $.extend(nic, {
                                                                name: name
                                                            });
                                                        })
                                                    });
                                                }
                                            });
                                        }
                                    }
                                }
                            }
                        }
                    },
                    routerGroupByZone: {
                        id: 'routerGroupByZone',
                        type: 'select',
                        title: 'label.group.by.zone',
                        listView: {
                            id: 'routerGroupByZone',
                            label: 'label.virtual.appliances',
                            fields: {
                                name: {
                                    label: 'label.zone'
                                },
                                routerCount: {
                                    label: 'label.total.virtual.routers'
                                },
                                routerRequiresUpgrade: {
                                    label: 'label.upgrade.required',
                                    converter: function (args) {
                                        if (args > 0) {
                                            return 'label.yes';
                                        } else {
                                            return 'label.no';
                                        }
                                    }
                                }
                            },
                            
                            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;
                                        }
                                    }
                                }
                                $.ajax({
                                    url: createURL("listZones&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                    dataType: "json",
                                    async: true,
                                    success: function (json) {
                                        var groupbyObjs = json.listzonesresponse.zone;
                                        if (groupbyObjs != null) {
                                            addExtraPropertiesToGroupbyObjects(groupbyObjs, 'zoneid');
                                        }
                                        args.response.success({
                                            data: groupbyObjs
                                        });
                                    }
                                });
                            },
                            detailView: {
                                name: 'label.virtual.routers.group.zone',                                
                                viewAll: {
                                    path: '_zone.virtualRouters',
                                    label: 'label.virtual.appliances'
                                },                                
                                actions: {
                                    upgradeRouterToUseNewerTemplate: {
                                        label: 'label.upgrade.router.newer.template',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.confirm.upgrade.routers.newtemplate';
                                            },
                                            notification: function (args) {
                                                return 'label.upgrade.router.newer.template';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL('upgradeRouterTemplate'),
                                                data: {
                                                    zoneid: args.context.routerGroupByZone[0].id
                                                },
                                                success: function (json) {
                                                    var jobs = json.upgraderoutertemplateresponse.asyncjobs;
                                                    if (jobs != undefined) {
                                                        args.response.success({
                                                            _custom: {
                                                                jobId: jobs[0].jobid
                                                            }
                                                        });
                                                    }
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    }
                                },
                                tabs: {
                                    details: {
                                        title: 'label.virtual.routers.group.zone',
                                        fields:[ {
                                            name: {
                                                label: 'label.zone'
                                            }
                                        },
                                        {
                                            routerCount: {
                                                label: 'label.total.virtual.routers'
                                            },
                                            routerRequiresUpgrade: {
                                                label: 'label.upgrade.required',
                                                converter: function (args) {
                                                    if (args > 0) {
                                                        return 'label.yes';
                                                    } else {
                                                        return 'label.no';
                                                    }
                                                }
                                            },                                            
                                            numberOfRouterRequiresUpgrade: {
                                            	label: 'label.total.virtual.routers.upgrade'
                                            }
                                        }],
                                        dataProvider: function (args) {
                                            addExtraPropertiesToGroupbyObject(args.context.routerGroupByZone[0], 'zoneid');
                                            args.response.success({
                                                data: args.context.routerGroupByZone[0],
                                                actionFilter: routerGroupActionfilter
                                            });
                                        }
                                    }
                                }
                            }
                        }
                    },
                    routerGroupByPod: {
                        id: 'routerGroupByPod',
                        type: 'select',
                        title: 'label.group.by.pod',
                        listView: {
                            id: 'routerGroupByPod',
                            label: 'label.virtual.appliances',
                            fields: {
                                name: {
                                    label: 'label.pod'
                                },
                                routerCount: {
                                    label: 'label.total.virtual.routers'
                                },
                                routerRequiresUpgrade: {
                                    label: 'label.upgrade.required',
                                    converter: function (args) {
                                        if (args > 0) {
                                            return 'label.yes';
                                        } else {
                                            return 'label.no';
                                        }
                                    }
                                }
                            },
                            
                            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;
                                        }
                                    }
                                }
                                $.ajax({
                                    url: createURL("listPods&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                    dataType: "json",
                                    async: true,
                                    success: function (json) {
                                        var groupbyObjs = json.listpodsresponse.pod;
                                        if (groupbyObjs != null) {
                                            addExtraPropertiesToGroupbyObjects(groupbyObjs, 'podid');
                                        }
                                        args.response.success({
                                            data: groupbyObjs
                                        });
                                    }
                                });
                            },
                            detailView: {
                                name: 'label.virtual.routers.group.pod',                                
                                viewAll: {
                                    path: '_zone.virtualRouters',
                                    label: 'label.virtual.appliances'
                                },                               
                                actions: {
                                    upgradeRouterToUseNewerTemplate: {
                                        label: 'label.upgrade.router.newer.template',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.confirm.upgrade.routers.pod.newtemplate';
                                            },
                                            notification: function (args) {
                                                return 'label.upgrade.router.newer.template';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL('upgradeRouterTemplate'),
                                                data: {
                                                    podid: args.context.routerGroupByPod[0].id
                                                },
                                                success: function (json) {
                                                    var jobs = json.upgraderoutertemplateresponse.asyncjobs;
                                                    if (jobs != undefined) {
                                                        args.response.success({
                                                            _custom: {
                                                                jobId: jobs[0].jobid
                                                            }
                                                        });
                                                    }
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    }
                                },
                                tabs: {
                                    details: {
                                        title: 'label.virtual.routers.group.pod',
                                        fields:[ {
                                            name: {
                                                label: 'label.pod'
                                            }
                                        },
                                        {
                                            routerCount: {
                                                label: 'label.total.virtual.routers'
                                            },
                                            routerRequiresUpgrade: {
                                                label: 'label.upgrade.required',
                                                converter: function (args) {
                                                    if (args > 0) {
                                                        return 'label.yes';
                                                    } else {
                                                        return 'label.no';
                                                    }
                                                }
                                            },
                                            numberOfRouterRequiresUpgrade: {
                                            	label: 'label.total.virtual.routers.upgrade'
                                            },
                                            zonename: {
                                                label: 'label.zone'
                                            }
                                        }],
                                        dataProvider: function (args) {
                                            addExtraPropertiesToGroupbyObject(args.context.routerGroupByPod[0], 'podid');
                                            args.response.success({
                                                data: args.context.routerGroupByPod[0],
                                                actionFilter: routerGroupActionfilter
                                            });
                                        }
                                    }
                                }
                            }
                        }
                    },
                    routerGroupByCluster: {
                        id: 'routerGroupByCluster',
                        type: 'select',
                        title: 'label.group.by.cluster',
                        listView: {
                            id: 'routerGroupByCluster',
                            label: 'label.virtual.appliances',
                            fields: {
                                name: {
                                    label: 'label.cluster'
                                },
                                routerCount: {
                                    label: 'label.total.virtual.routers'
                                },
                                routerRequiresUpgrade: {
                                    label: 'label.upgrade.required',
                                    converter: function (args) {
                                        if (args > 0) {
                                            return 'label.yes';
                                        } else {
                                            return 'label.no';
                                        }
                                    }
                                }
                            },
                            
                            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;
                                        }
                                    }
                                }
                                $.ajax({
                                    url: createURL("listClusters&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                    dataType: "json",
                                    async: true,
                                    success: function (json) {
                                        var groupbyObjs = json.listclustersresponse.cluster;
                                        if (groupbyObjs != null) {
                                            addExtraPropertiesToGroupbyObjects(groupbyObjs, 'clusterid');
                                        }
                                        args.response.success({
                                            data: groupbyObjs
                                        });
                                    }
                                });
                            },
                            detailView: {
                                name: 'label.virtual.routers.group.cluster',                               
                                viewAll: {
                                    path: '_zone.virtualRouters',
                                    label: 'label.virtual.appliances'
                                },                               
                                actions: {
                                    upgradeRouterToUseNewerTemplate: {
                                        label: 'label.upgrade.router.newer.template',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.confirm.upgrade.routers.cluster.newtemplate';
                                            },
                                            notification: function (args) {
                                                return 'label.upgrade.router.newer.template';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL('upgradeRouterTemplate'),
                                                data: {
                                                    clusterid: args.context.routerGroupByCluster[0].id
                                                },
                                                success: function (json) {
                                                    var jobs = json.upgraderoutertemplateresponse.asyncjobs;
                                                    if (jobs != undefined) {
                                                        args.response.success({
                                                            _custom: {
                                                                jobId: jobs[0].jobid
                                                            }
                                                        });
                                                    }
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    }
                                },
                                tabs: {
                                    details: {
                                        title: 'label.virtual.routers.group.cluster',
                                        fields:[ {
                                            name: {
                                                label: 'label.cluster'
                                            }
                                        },
                                        {
                                            routerCount: {
                                                label: 'label.total.virtual.routers'
                                            },
                                            routerRequiresUpgrade: {
                                                label: 'label.upgrade.required',
                                                converter: function (args) {
                                                    if (args > 0) {
                                                        return 'label.yes';
                                                    } else {
                                                        return 'label.no';
                                                    }
                                                }
                                            },
                                            numberOfRouterRequiresUpgrade: {
                                            	label: 'label.total.virtual.routers that require upgrade'
                                            },
                                            podname: {
                                                label: 'label.pod'
                                            },
                                            zonename: {
                                                label: 'label.zone.lower'
                                            }
                                        }],
                                        dataProvider: function (args) {
                                            addExtraPropertiesToGroupbyObject(args.context.routerGroupByCluster[0], 'clusterid');
                                            args.response.success({
                                                data: args.context.routerGroupByCluster[0],
                                                actionFilter: routerGroupActionfilter
                                            });
                                        }
                                    }
                                }
                            }
                        }
                    },
                    routerGroupByAccount: {
                        id: 'routerGroupByAccount',
                        type: 'select',
                        title: 'group by account',
                        listView: {
                            id: 'routerGroupByAccount',
                            label: 'label.virtual.appliances',
                            fields: {
                                name: {
                                    label: 'label.account'
                                },
                                domain: {
                                    label: 'label.domain'
                                },
                                routerCount: {
                                    label: 'label.total.virtual.routers'
                                },
                                routerRequiresUpgrade: {
                                    label: 'label.upgrade.required',
                                    converter: function (args) {
                                        if (args > 0) {
                                            return 'label.yes';
                                        } else {
                                            return 'label.no';
                                        }
                                    }
                                }
                            },
                            
                            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;
                                        }
                                    }
                                }
                                $.ajax({
                                    url: createURL("listAccounts&listAll=true&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                                    success: function (json) {
                                        var accountObjs = json.listaccountsresponse.account;
                                        if (accountObjs != null) {
                                            for (var i = 0; i < accountObjs.length; i++) {
                                                var currentPage = 1;
                                                $.ajax({
                                                    url: createURL('listRouters'),
                                                    data: {
                                                        account: accountObjs[i].name,
                                                        domainid: accountObjs[i].domainid,
                                                        listAll: true,
                                                        page: currentPage,
                                                        pagesize: pageSize //global variable
                                                    },
                                                    async: false,
                                                    success: function (json) {
                                                        if (json.listroutersresponse.count != undefined) {
                                                            accountObjs[i].routerCount = json.listroutersresponse.count;
                                                            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++;
                	                            				}
                	                            			}  
                                                            
                                                            var callListApiWithPage = function () {
                                                                $.ajax({
                                                                    url: createURL('listRouters'),
                                                                    async: false,
                                                                    data: {
                                                                        account: accountObjs[i].name,
                                                                        domainid: accountObjs[i].domainid,
                                                                        listAll: true,
                                                                        page: currentPage,
                                                                        pagesize: pageSize //global variable
                                                                    },
                                                                    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++;
                                                                            }
                                                                        }
                                                                        if (routerCountFromFirstPageToCurrentPage < routerCountFromAllPages) {
                                                                            currentPage++;
                                                                            callListApiWithPage();
                                                                        }
                                                                    }
                                                                });
                                                            }
                                                            if (routerCountFromFirstPageToCurrentPage < routerCountFromAllPages) {
                                                                currentPage++;
                                                                callListApiWithPage();
                                                            }
                                                            accountObjs[i].routerRequiresUpgrade = routerRequiresUpgrade;
                                                        } else {
                                                            accountObjs[i].routerCount = 0;
                                                            accountObjs[i].routerRequiresUpgrade = 0;
                                                        }
                                                    }
                                                });
                                            }
                                        }
                                        args.response.success({
                                            data: accountObjs
                                        });
                                    }
                                });
                            },
                            detailView: {
                                name: 'label.virtual.routers.group.account',                                
                                viewAll: {
                                    path: '_zone.virtualRouters',
                                    label: 'label.virtual.appliances'
                                },                               
                                actions: {
                                    upgradeRouterToUseNewerTemplate: {
                                        label: 'label.upgrade.router.newer.template',
                                        messages: {
                                            confirm: function (args) {
                                                return 'message.confirm.upgrade.routers.account.newtemplate';
                                            },
                                            notification: function (args) {
                                                return 'label.upgrade.router.newer.template';
                                            }
                                        },
                                        action: function (args) {
                                            $.ajax({
                                                url: createURL('upgradeRouterTemplate'),
                                                data: {
                                                    account: args.context.routerGroupByAccount[0].name,
                                                    domainid: args.context.routerGroupByAccount[0].domainid
                                                },
                                                success: function (json) {
                                                    var jobs = json.upgraderoutertemplateresponse.asyncjobs;
                                                    if (jobs != undefined) {
                                                        args.response.success({
                                                            _custom: {
                                                                jobId: jobs[0].jobid
                                                            }
                                                        });
                                                    }
                                                }
                                            });
                                        },
                                        notification: {
                                            poll: pollAsyncJobResult
                                        }
                                    }
                                },
                                tabs: {
                                    details: {
                                        title: 'label.virtual.routers.group.account',
                                        fields:[ {
                                            name: {
                                                label: 'label.account'
                                            },
                                            domain: {
                                                label: 'label.domain'
                                            }
                                        },
                                        {
                                            routerCount: {
                                                label: 'label.total.virtual.routers'
                                            },
                                            routerRequiresUpgrade: {
                                                label: 'label.upgrade.required',
                                                converter: function (args) {
                                                    if (args > 0) {
                                                        return 'label.yes';
                                                    } else {
                                                        return 'label.no';
                                                    }
                                                }
                                            },                                            
                                            numberOfRouterRequiresUpgrade: {
                                            	label: 'label.total.virtual.routers that require upgrade'
                                            }
                                        }],
                                        dataProvider: function (args) {
                                            var currentPage = 1;
                                            $.ajax({
                                                url: createURL('listRouters'),
                                                data: {
                                                    account: args.context.routerGroupByAccount[0].name,
                                                    domainid: args.context.routerGroupByAccount[0].domainid,
                                                    listAll: true,
                                                    page: currentPage,
                                                    pagesize: pageSize //global variable
                                                },
                                                async: false,
                                                success: function (json) {
                                                    if (json.listroutersresponse.count != undefined) {
                                                        args.context.routerGroupByAccount[0].routerCount = json.listroutersresponse.count;
                                                        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++;
            	                            				}
            	                            			}  
                                                        
                                                        var callListApiWithPage = function () {
                                                            $.ajax({
                                                                url: createURL('listRouters'),
                                                                async: false,
                                                                data: {
                                                                    account: args.context.routerGroupByAccount[0].name,
                                                                    domainid: args.context.routerGroupByAccount[0].domainid,
                                                                    listAll: true,
                                                                    page: currentPage,
                                                                    pagesize: pageSize //global variable
                                                                },
                                                                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++;
                                                                        }
                                                                    }
                                                                    if (routerCountFromFirstPageToCurrentPage < routerCountFromAllPages) {
                                                                        currentPage++;
                                                                        callListApiWithPage();
                                                                    }
                                                                }
                                                            });
                                                        }
                                                        if (routerCountFromFirstPageToCurrentPage < routerCountFromAllPages) {
                                                            currentPage++;
                                                            callListApiWithPage();
                                                        }
                                                        args.context.routerGroupByAccount[0].routerRequiresUpgrade = routerRequiresUpgrade;
                                                        args.context.routerGroupByAccount[0].numberOfRouterRequiresUpgrade = routerRequiresUpgrade;
                                                    } else {
                                                        args.context.routerGroupByAccount[0].routerCount = 0;
                                                        args.context.routerGroupByAccount[0].routerRequiresUpgrade = 0;
                                                        args.context.routerGroupByAccount[0].numberOfRouterRequiresUpgrade = 0;
                                                    }
                                                }
                                            });
                                            setTimeout(function () {
                                                args.response.success({
                                                    data: args.context.routerGroupByAccount[0],
                                                    actionFilter: routerGroupActionfilter
                                                });
                                            });
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            },
            systemVms: {
                listView: {
                    label: 'label.system.vms',
                    id: 'systemVMs',
                    fields: {
                        name: {
                            label: 'label.name'
                        },
                        systemvmtype: {
                            label: 'label.type',
                            converter: function (args) {
                                if (args == "consoleproxy")
                                return "Console Proxy VM"; else if (args == "secondarystoragevm")
                                return "Secondary Storage VM"; else
                                return args;
                            }
                        },
                        zonename: {
                            label: 'label.zone'
                        },
                        state: {
                            label: 'label.vm.state',
                            converter: function (str) {
                                // For localization
                                return str;
                            },
                            indicator: {
                                'Running': 'on',
                                'Stopped': 'off',
                                'Error': 'off',
                                'Destroyed': 'off'
                            }
                        },
                        
                        agentstate: {
                            label: 'label.agent.state',
                            indicator: {
                                'Up': 'on',
                                'Down': 'off'
                            }
                        }
                    },
                    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;
                                }
                            }
                        }
                        
                        var selectedZoneObj = args.context.physicalResources[0];
                        $.ajax({
                            url: createURL("listSystemVms&zoneid=" + selectedZoneObj.id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                            dataType: "json",
                            async: true,
                            success: function (json) {
                                var items = json.listsystemvmsresponse.systemvm;
                                args.response.success({
                                    actionFilter: systemvmActionfilter,
                                    data: items
                                });
                            }
                        });
                    },
                    
                    detailView: {
                        name: 'label.system.vm.details',
                        actions: {
                            start: {
                                label: 'label.action.start.systemvm',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.start.systemvm';
                                    },
                                    notification: function (args) {
                                        return 'label.action.start.systemvm';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL('startSystemVm&id=' + args.context.systemVMs[0].id),
                                        dataType: 'json',
                                        async: true,
                                        success: function (json) {
                                            var jid = json.startsystemvmresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        return json.queryasyncjobresultresponse.jobresult.systemvm;
                                                    },
                                                    getActionFilter: function () {
                                                        return systemvmActionfilter;
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            
                            stop: {
                                label: 'label.action.stop.systemvm',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.stop.systemvm';
                                    },
                                    notification: function (args) {
                                        return 'label.action.stop.systemvm';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL('stopSystemVm&id=' + args.context.systemVMs[0].id),
                                        dataType: 'json',
                                        async: true,
                                        success: function (json) {
                                            var jid = json.stopsystemvmresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        return json.queryasyncjobresultresponse.jobresult.systemvm;
                                                    },
                                                    getActionFilter: function () {
                                                        return systemvmActionfilter;
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            
                            restart: {
                                label: 'label.action.reboot.systemvm',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.reboot.systemvm';
                                    },
                                    notification: function (args) {
                                        return 'label.action.reboot.systemvm';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL('rebootSystemVm&id=' + args.context.systemVMs[0].id),
                                        dataType: 'json',
                                        async: true,
                                        success: function (json) {
                                            var jid = json.rebootsystemvmresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        return json.queryasyncjobresultresponse.jobresult.systemvm;
                                                    },
                                                    getActionFilter: function () {
                                                        return systemvmActionfilter;
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            
                            remove: {
                                label: 'label.action.destroy.systemvm',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.destroy.systemvm';
                                    },
                                    notification: function (args) {
                                        return 'label.action.destroy.systemvm';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL('destroySystemVm&id=' + args.context.systemVMs[0].id),
                                        dataType: 'json',
                                        async: true,
                                        success: function (json) {
                                            var jid = json.destroysystemvmresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    getUpdatedItem: function () {
                                                        return {
                                                            state: 'Destroyed'
                                                        };
                                                    },
                                                    jobId: jid
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            
                            migrate: {
                                label: 'label.action.migrate.systemvm',
                                messages: {
                                    notification: function (args) {
                                        return 'label.action.migrate.systemvm';
                                    }
                                },
                                createForm: {
                                    title: 'label.action.migrate.systemvm',
                                    desc: '',
                                    fields: {
                                        hostId: {
                                            label: 'label.host',
                                            validation: {
                                                required: true
                                            },
                                            select: function (args) {
                                                $.ajax({
                                                    url: createURL("findHostsForMigration&VirtualMachineId=" + args.context.systemVMs[0].id),
                                                    dataType: "json",
                                                    async: true,
                                                    success: function (json) {
                                                        var hostObjs = json.findhostsformigrationresponse.host;
                                                        var items =[];
                                                        $(hostObjs).each(function () {
                                                            if (this.requiresStorageMotion == false) {
                                                                items.push({
                                                                    id: this.id,
                                                                    description: (this.name + " (" + (this.suitableformigration ? "Suitable": "Not Suitable") + ")")
                                                                });
                                                            }
                                                        });
                                                        args.response.success({
                                                            data: items
                                                        });
                                                    }
                                                });
                                            },
                                            error: function (XMLHttpResponse) {
                                                var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                args.response.error(errorMsg);
                                            }
                                        }
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("migrateSystemVm&hostid=" + args.data.hostId + "&virtualmachineid=" + args.context.systemVMs[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.migratesystemvmresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        //return json.queryasyncjobresultresponse.jobresult.systemvminstance;    //not all properties returned in systemvminstance
                                                        $.ajax({
                                                            url: createURL("listSystemVms&id=" + json.queryasyncjobresultresponse.jobresult.systemvm.id),
                                                            dataType: "json",
                                                            async: false,
                                                            success: function (json) {
                                                                var items = json.listsystemvmsresponse.systemvm;
                                                                if (items != null && items.length > 0) {
                                                                    return items[0];
                                                                }
                                                            }
                                                        });
                                                    },
                                                    getActionFilter: function () {
                                                        return systemvmActionfilter;
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            
                            scaleUp: {
                                label: 'label.change.service.offering',
                                createForm: {
                                    title: 'label.change.service.offering',
                                    desc: function (args) {
                                        var description = '';
                                        var vmObj = args.jsonObj;
                                        //if (vmObj.state == 'Running' && vmObj.hypervisor == 'VMware') { //needs to wait for API fix that will return hypervisor property
                                        if (vmObj.state == 'Running') {
                                            description = 'message.read.admin.guide.scaling.up';
                                        }
                                        return description;
                                    },
                                    fields: {
                                        serviceOfferingId: {
                                            label: 'label.compute.offering',
                                            select: function (args) {
                                                var apiCmd = "listServiceOfferings&issystem=true";
                                                if (args.context.systemVMs[0].systemvmtype == "secondarystoragevm")
                                                apiCmd += "&systemvmtype=secondarystoragevm"; else if (args.context.systemVMs[0].systemvmtype == "consoleproxy")
                                                apiCmd += "&systemvmtype=consoleproxy";
                                                $.ajax({
                                                    url: createURL(apiCmd),
                                                    dataType: "json",
                                                    async: true,
                                                    success: function (json) {
                                                        var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
                                                        var items =[];
                                                        $(serviceofferings).each(function () {
                                                            if (this.id != args.context.systemVMs[0].serviceofferingid) {
                                                                items.push({
                                                                    id: this.id,
                                                                    description: this.name
                                                                });
                                                            }
                                                        });
                                                        args.response.success({
                                                            data: items
                                                        });
                                                    }
                                                });
                                            }
                                        }
                                    }
                                },
                                
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("scaleSystemVm&id=" + args.context.systemVMs[0].id + "&serviceofferingid=" + args.data.serviceOfferingId),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.changeserviceforsystemvmresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        return json.queryasyncjobresultresponse.jobresult.systemvm;
                                                    },
                                                    getActionFilter: function () {
                                                        return vmActionfilter;
                                                    }
                                                }
                                            });
                                        },
                                        error: function (json) {
                                            args.response.error(parseXMLHttpResponse(json));
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.scale.up.system.vm';
                                    },
                                    notification: function (args) {
                                        
                                        return 'label.system.vm.scaled.up';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            
                            
                            
                            viewConsole: {
                                label: 'label.view.console',
                                action: {
                                    externalLink: {
                                        url: function (args) {
                                            return clientConsoleUrl + '?cmd=access&vm=' + args.context.systemVMs[0].id;
                                        },
                                        title: function (args) {
                                            return args.context.systemVMs[0].id.substr(0, 8);
                                            //title in window.open() can't have space nor longer than 8 characters. Otherwise, IE browser will have error.
                                        },
                                        width: 820,
                                        height: 640
                                    }
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    id: {
                                        label: 'label.id'
                                    },
                                    state: {
                                        label: 'label.state'
                                    },
                                    systemvmtype: {
                                        label: 'label.type',
                                        converter: function (args) {
                                            if (args == "consoleproxy")
                                            return "Console Proxy VM"; else if (args == "secondarystoragevm")
                                            return "Secondary Storage VM"; else
                                            return args;
                                        }
                                    },
                                    zonename: {
                                        label: 'label.zone'
                                    },
                                    publicip: {
                                        label: 'label.public.ip'
                                    },
                                    privateip: {
                                        label: 'label.private.ip'
                                    },
                                    linklocalip: {
                                        label: 'label.linklocal.ip'
                                    },
                                    hostname: {
                                        label: 'label.host'
                                    },
                                    gateway: {
                                        label: 'label.gateway'
                                    },
                                    created: {
                                        label: 'label.created',
                                        converter: cloudStack.converters.toLocalDate
                                    },
                                    activeviewersessions: {
                                        label: 'label.active.sessions'
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listSystemVms&id=" + args.context.systemVMs[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            args.response.success({
                                                actionFilter: systemvmActionfilter,
                                                data: json.listsystemvmsresponse.systemvm[0]
                                            });
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
            },
            // netscaler devices listView
            netscalerDevices: {
                id: 'netscalerDevices',
                title: 'label.devices',
                listView: {
                    id: 'netscalerDevices',
                    fields: {
                        ipaddress: {
                            label: 'label.ip.address'
                        },
                        lbdevicestate: {
                            converter: function (str) {
                                // For localization
                                return str;
                            },
                            label: 'label.status'
                        }
                    },
                    dataProvider: function (args) {
                        $.ajax({
                            url: createURL("listNetscalerLoadBalancers&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                            data: {
                                page: args.page,
                                pageSize: pageSize
                            },
                            dataType: "json",
                            async: false,
                            success: function (json) {
                                var items = json.listnetscalerloadbalancerresponse.netscalerloadbalancer;
                                args.response.success({
                                    data: items
                                });
                            }
                        });
                    },
                    actions: {
                        add: {
                            label: 'label.add.netScaler.device',
                            createForm: {
                                title: 'label.add.netScaler.device',
                                preFilter: cloudStack.preFilter.addLoadBalancerDevice,
                                fields: {
                                    ip: {
                                        label: 'label.ip.address'
                                    },
                                    username: {
                                        label: 'label.username'
                                    },
                                    password: {
                                        label: 'label.password',
                                        isPassword: true
                                    },
                                    networkdevicetype: {
                                        label: 'label.type',
                                        select: function (args) {
                                            var items =[];
                                            items.push({
                                                id: "NetscalerMPXLoadBalancer",
                                                description: "NetScaler MPX LoadBalancer"
                                            });
                                            items.push({
                                                id: "NetscalerVPXLoadBalancer",
                                                description: "NetScaler VPX LoadBalancer"
                                            });
                                            items.push({
                                                id: "NetscalerSDXLoadBalancer",
                                                description: "NetScaler SDX LoadBalancer"
                                            });
                                            args.response.success({
                                                data: items
                                            });
                                        }
                                    },
                                    publicinterface: {
                                        label: 'label.public.interface'
                                    },
                                    privateinterface: {
                                        label: 'label.private.interface'
                                    },
                                    
                                    gslbprovider: {
                                        label: 'label.gslb.service',
                                        isBoolean: true,
                                        isChecked: false
                                    },
                                    gslbproviderpublicip: {
                                        label: 'label.gslb.service.public.ip'
                                    },
                                    gslbproviderprivateip: {
                                        label: 'label.gslb.service.private.ip'
                                    },
                                    
                                    numretries: {
                                        label: 'label.numretries',
                                        defaultValue: '2'
                                    },
                                    /* inline: {
                                    label: 'Mode',
                                    select: function(args) {
                                    var items = [];
                                    items.push({id: "false", description: "side by side"});
                                    items.push({id: "true", description: "inline"});
                                    args.response.success({data: items});
                                    }
                                    },*/
                                    dedicated: {
                                        label: 'label.dedicated',
                                        isBoolean: true,
                                        isChecked: false
                                    },
                                    capacity: {
                                        label: 'label.capacity',
                                        validation: {
                                            required: false,
                                            number: true
                                        }
                                    }
                                }
                            },
                            action: function (args) {
                                if (nspMap[ "netscaler"] == null) {
                                    $.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);
                                        }
                                    });
                                } else {
                                    addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addNetscalerLoadBalancer", "addnetscalerloadbalancerresponse", "netscalerloadbalancer");
                                }
                            },
                            messages: {
                                notification: function (args) {
                                    return 'label.add.netScaler.device';
                                }
                            },
                            notification: {
                                poll: pollAsyncJobResult
                            }
                        }
                    },
                    detailView: {
                        name: 'label.netscaler.details',
                        actions: {
                            'remove': {
                                label: 'label.delete.NetScaler',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.delete.NetScaler';
                                    },
                                    notification: function (args) {
                                        return 'label.delete.NetScaler';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteNetscalerLoadBalancer&lbdeviceid=" + args.context.netscalerDevices[0].lbdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.deletenetscalerloadbalancerresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                        },
                                        
                                        error: function (json) {
                                            args.response.error(parseXMLHttpResponse(json));
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    lbdeviceid: {
                                        label: 'label.id'
                                    },
                                    ipaddress: {
                                        label: 'label.ip.address'
                                    },
                                    lbdevicestate: {
                                        label: 'label.status'
                                    },
                                    lbdevicename: {
                                        label: 'label.type'
                                    },
                                    lbdevicecapacity: {
                                        label: 'label.capacity'
                                    },
                                    lbdevicededicated: {
                                        label: 'label.dedicated',
                                        converter: cloudStack.converters.toBooleanText
                                    },
                                    gslbprovider: {
                                        label: 'label.gslb.service',
                                        converter: cloudStack.converters.toBooleanText
                                    },
                                    gslbproviderpublicip: {
                                        label: 'label.gslb.service.public.ip'
                                    },
                                    gslbproviderprivateip: {
                                        label: 'label.gslb.service.private.ip'
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listNetscalerLoadBalancers&lbdeviceid=" + args.context.netscalerDevices[0].lbdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.listnetscalerloadbalancerresponse.netscalerloadbalancer[0];
                                            args.response.success({
                                                data: item
                                            });
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
            },
            
            // Baremetal DHCP devices listView
            BaremetalDhcpDevices: {
                id: 'BaremetalDhcpDevices',
                title: 'label.baremetal.dhcp.devices',
                listView: {
                    id: 'BaremetalDhcpDevices',
                    fields: {
                        url: {
                            label: 'label.url'
                        }
                    },
                    actions: {
                        add: {
                            label: 'label.add.baremetal.dhcp.device',
                            createForm: {
                                title: 'label.add.baremetal.dhcp.device',
                                fields: {
                                    url: {
                                        label: 'label.url',
                                        validation: {
                                            required: true
                                        }
                                    },
                                    username: {
                                        label: 'label.username',
                                        validation: {
                                            required: true
                                        }
                                    },
                                    password: {
                                        label: 'label.password',
                                        isPassword: true,
                                        validation: {
                                            required: true
                                        }
                                    }
                                }
                            },
                            action: function (args) {
                                addBaremetalDhcpDeviceFn(args);
                            },
                            messages: {
                                notification: function (args) {
                                    return 'label.add.baremetal.dhcp.device';
                                }
                            },
                            notification: {
                                poll: pollAsyncJobResult
                            }
                        }
                    },
                    dataProvider: function (args) {
                        $.ajax({
                            url: createURL('listBaremetalDhcp'),
                            data: {
                                physicalnetworkid: selectedPhysicalNetworkObj.id,
                                page: args.page,
                                pageSize: pageSize
                            },
                            dataType: "json",
                            async: false,
                            success: function (json) {
                                var items = json.listbaremetaldhcpresponse.baremetaldhcp;
                                args.response.success({
                                    data: items
                                });
                            }
                        });
                    }
                }
            },
            
            // Baremetal PXE devices listView
            BaremetalPxeDevices: {
                id: 'BaremetalPxeDevices',
                title: 'label.baremetal.pxe.devices',
                listView: {
                    id: 'BaremetalPxeDevices',
                    fields: {
                        url: {
                            label: 'label.url'
                        }
                    },
                    actions: {
                        add: {
                            label: 'label.baremetal.pxe.device',
                            createForm: {
                                title: 'label.baremetal.pxe.device',
                                fields: {
                                    url: {
                                        label: 'label.url',
                                        validation: {
                                            required: true
                                        }
                                    },
                                    username: {
                                        label: 'label.username',
                                        validation: {
                                            required: true
                                        }
                                    },
                                    password: {
                                        label: 'label.password',
                                        isPassword: true,
                                        validation: {
                                            required: true
                                        }
                                    },
                                    tftpdir: {
                                        label: 'label.tftp.root.directory',
                                        validation: {
                                            required: true
                                        }
                                    }
                                }
                            },
                            action: function (args) {
                                addBaremetalPxeDeviceFn(args);
                            },
                            messages: {
                                notification: function (args) {
                                    return 'label.baremetal.pxe.device';
                                }
                            },
                            notification: {
                                poll: pollAsyncJobResult
                            }
                        }
                    },
                    dataProvider: function (args) {
                        $.ajax({
                            url: createURL('listBaremetalPxeServers'),
                            data: {
                                physicalnetworkid: selectedPhysicalNetworkObj.id,
                                page: args.page,
                                pageSize: pageSize
                            },
                            dataType: "json",
                            async: false,
                            success: function (json) {
                                var items = json.listbaremetalpxeserversresponse.baremetalpxeserver;
                                args.response.success({
                                    data: items
                                });
                            }
                        });
                    }
                }
            },
            
            // F5 devices listView
            f5Devices: {
                id: 'f5Devices',
                title: 'label.devices',
                listView: {
                    id: 'f5Devices',
                    fields: {
                        ipaddress: {
                            label: 'label.ip.address'
                        },
                        lbdevicestate: {
                            converter: function (str) {
                                // For localization
                                return str;
                            },
                            label: 'label.status'
                        }
                    },
                    actions: {
                        add: {
                            label: 'label.add.F5.device',
                            createForm: {
                                title: 'label.add.F5.device',
                                preFilter: cloudStack.preFilter.addLoadBalancerDevice,
                                fields: {
                                    ip: {
                                        label: 'label.ip.address'
                                    },
                                    username: {
                                        label: 'label.username'
                                    },
                                    password: {
                                        label: 'label.password',
                                        isPassword: true
                                    },
                                    networkdevicetype: {
                                        label: 'label.type',
                                        select: function (args) {
                                            var items =[];
                                            items.push({
                                                id: "F5BigIpLoadBalancer",
                                                description: "F5 Big Ip Load Balancer"
                                            });
                                            args.response.success({
                                                data: items
                                            });
                                        }
                                    },
                                    publicinterface: {
                                        label: 'label.public.interface'
                                    },
                                    privateinterface: {
                                        label: 'label.private.interface'
                                    },
                                    numretries: {
                                        label: 'label.numretries',
                                        defaultValue: '2'
                                    },
                                    //Inline Mode has been moved from Add F5 Device to Create Network Offering (both backend and UI)
                                    /*
                                    inline: {
                                    label: 'Mode',
                                    select: function(args) {
                                    var items = [];
                                    items.push({id: "false", description: "side by side"});
                                    items.push({id: "true", description: "inline"});
                                    args.response.success({data: items});
                                    }
                                    },
                                     */
                                    dedicated: {
                                        label: 'label.dedicated',
                                        isBoolean: true,
                                        isChecked: false
                                    },
                                    capacity: {
                                        label: 'label.capacity',
                                        validation: {
                                            required: false,
                                            number: true
                                        }
                                    }
                                }
                            },
                            action: function (args) {
                                if (nspMap[ "f5"] == null) {
                                    $.ajax({
                                        url: createURL("addNetworkServiceProvider&name=F5BigIp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
                                            var addF5ProviderIntervalID = 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(addF5ProviderIntervalID);
                                                            if (result.jobstatus == 1) {
                                                                nspMap[ "f5"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addF5LoadBalancer", "addf5bigiploadbalancerresponse", "f5loadbalancer");
                                                            } else if (result.jobstatus == 2) {
                                                                alert("addNetworkServiceProvider&name=F5BigIp failed. Error: " + _s(result.jobresult.errortext));
                                                            }
                                                        }
                                                    },
                                                    error: function (XMLHttpResponse) {
                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                        alert("addNetworkServiceProvider&name=F5BigIpfailed. Error: " + errorMsg);
                                                    }
                                                });
                                            },
                                            g_queryAsyncJobResultInterval);
                                        }
                                    });
                                } else {
                                    addExternalLoadBalancer(args, selectedPhysicalNetworkObj, "addF5LoadBalancer", "addf5bigiploadbalancerresponse", "f5loadbalancer");
                                }
                            },
                            messages: {
                                notification: function (args) {
                                    return 'label.addes.new.f5';
                                }
                            },
                            notification: {
                                poll: pollAsyncJobResult
                            }
                        }
                    },
                    dataProvider: function (args) {
                        $.ajax({
                            url: createURL("listF5LoadBalancers&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                            data: {
                                page: args.page,
                                pageSize: pageSize
                            },
                            dataType: "json",
                            async: false,
                            success: function (json) {
                                var items = json.listf5loadbalancerresponse.f5loadbalancer;
                                args.response.success({
                                    data: items
                                });
                            }
                        });
                    },
                    detailView: {
                        name: 'label.f5.details',
                        actions: {
                            'remove': {
                                label: 'label.delete.F5',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.delete.F5';
                                    },
                                    notification: function (args) {
                                        return 'label.delete.F5';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteF5LoadBalancer&lbdeviceid=" + args.context.f5Devices[0].lbdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.deletef5loadbalancerresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    lbdeviceid: {
                                        label: 'label.id'
                                    },
                                    ipaddress: {
                                        label: 'label.ip.address'
                                    },
                                    lbdevicestate: {
                                        label: 'label.status'
                                    },
                                    lbdevicename: {
                                        label: 'label.type'
                                    },
                                    lbdevicecapacity: {
                                        label: 'label.capacity'
                                    },
                                    lbdevicededicated: {
                                        label: 'label.dedicated',
                                        converter: cloudStack.converters.toBooleanText
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listF5LoadBalancers&lbdeviceid=" + args.context.f5Devices[0].lbdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.listf5loadbalancerresponse.f5loadbalancer[0];
                                            args.response.success({
                                                data: item
                                            });
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
            },
            
            //SRX devices listView
            srxDevices: {
                id: 'srxDevices',
                title: 'label.devices',
                listView: {
                    id: 'srxDevices',
                    fields: {
                        ipaddress: {
                            label: 'label.ip.address'
                        },
                        fwdevicestate: {
                            label: 'label.status'
                        },
                        fwdevicename: {
                            label: 'label.type'
                        }
                    },
                    actions: {
                        add: {
                            label: 'label.add.SRX.device',
                            createForm: {
                                title: 'label.add.SRX.device',
                                fields: {
                                    ip: {
                                        label: 'label.ip.address'
                                    },
                                    username: {
                                        label: 'label.username'
                                    },
                                    password: {
                                        label: 'label.password',
                                        isPassword: true
                                    },
                                    networkdevicetype: {
                                        label: 'label.type',
                                        select: function (args) {
                                            var items =[];
                                            items.push({
                                                id: "JuniperSRXFirewall",
                                                description: "Juniper SRX Firewall"
                                            });
                                            args.response.success({
                                                data: items
                                            });
                                        }
                                    },
                                    publicinterface: {
                                        label: 'label.public.interface'
                                    },
                                    privateinterface: {
                                        label: 'label.private.interface'
                                    },
                                    usageinterface: {
                                        label: 'label.usage.interface'
                                    },
                                    numretries: {
                                        label: 'label.numretries',
                                        defaultValue: '2'
                                    },
                                    timeout: {
                                        label: 'label.timeout',
                                        defaultValue: '300'
                                    },
                                    // inline: {
                                    //   label: 'Mode',
                                    //   select: function(args) {
                                    //     var items = [];
                                    //     items.push({id: "false", description: "side by side"});
                                    //     items.push({id: "true", description: "inline"});
                                    //     args.response.success({data: items});
                                    //   }
                                    // },
                                    publicnetwork: {
                                        label: 'label.public.network',
                                        defaultValue: 'untrusted',
                                        isDisabled: true
                                    },
                                    privatenetwork: {
                                        label: 'label.private.network',
                                        defaultValue: 'trusted',
                                        isDisabled: true
                                    },
                                    capacity: {
                                        label: 'label.capacity',
                                        validation: {
                                            required: false,
                                            number: true
                                        }
                                    },
                                    dedicated: {
                                        label: 'label.dedicated',
                                        isBoolean: true,
                                        isChecked: false
                                    }
                                }
                            },
                            action: function (args) {
                                if (nspMap[ "srx"] == null) {
                                    $.ajax({
                                        url: createURL("addNetworkServiceProvider&name=JuniperSRX&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
                                            var addJuniperSRXProviderIntervalID = 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(addJuniperSRXProviderIntervalID);
                                                            if (result.jobstatus == 1) {
                                                                nspMap[ "srx"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                addExternalFirewall(args, selectedPhysicalNetworkObj, "addSrxFirewall", "addsrxfirewallresponse", "srxfirewall");
                                                            } else if (result.jobstatus == 2) {
                                                                alert("addNetworkServiceProvider&name=JuniperSRX failed. Error: " + _s(result.jobresult.errortext));
                                                            }
                                                        }
                                                    },
                                                    error: function (XMLHttpResponse) {
                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                        alert("addNetworkServiceProvider&name=JuniperSRX failed. Error: " + errorMsg);
                                                    }
                                                });
                                            },
                                            g_queryAsyncJobResultInterval);
                                        }
                                    });
                                } else {
                                    addExternalFirewall(args, selectedPhysicalNetworkObj, "addSrxFirewall", "addsrxfirewallresponse", "srxfirewall");
                                }
                            },
                            messages: {
                                notification: function (args) {
                                    return 'label.add.SRX.device';
                                }
                            },
                            notification: {
                                poll: pollAsyncJobResult
                            }
                        }
                    },
                    dataProvider: function (args) {
                        $.ajax({
                            url: createURL("listSrxFirewalls&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                            data: {
                                page: args.page,
                                pageSize: pageSize
                            },
                            dataType: "json",
                            async: false,
                            success: function (json) {
                                var items = json.listsrxfirewallresponse.srxfirewall;
                                args.response.success({
                                    data: items
                                });
                            }
                        });
                    },
                    detailView: {
                        name: 'label.srx.details',
                        actions: {
                            'remove': {
                                label: 'label.delete.SRX',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.delete.SRX';
                                    },
                                    notification: function (args) {
                                        return 'label.delete.SRX';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteSrxFirewall&fwdeviceid=" + args.context.srxDevices[0].fwdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.deletesrxfirewallresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    fwdeviceid: {
                                        label: 'label.id'
                                    },
                                    ipaddress: {
                                        label: 'label.ip.address'
                                    },
                                    fwdevicestate: {
                                        label: 'label.status'
                                    },
                                    fwdevicename: {
                                        label: 'label.type'
                                    },
                                    fwdevicecapacity: {
                                        label: 'label.capacity'
                                    },
                                    timeout: {
                                        label: 'label.timeout'
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listSrxFirewalls&fwdeviceid=" + args.context.srxDevices[0].fwdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.listsrxfirewallresponse.srxfirewall[0];
                                            args.response.success({
                                                data: item
                                            });
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
            },
            
            //Palo Alto devices listView
            paDevices: {
                id: 'paDevices',
                title: 'label.devices',
                listView: {
                    id: 'paDevices',
                    fields: {
                        ipaddress: {
                            label: 'label.ip.address'
                        },
                        fwdevicestate: {
                            label: 'label.status'
                        },
                        fwdevicename: {
                            label: 'label.type'
                        }
                    },
                    actions: {
                        add: {
                            label: 'label.add.PA.device',
                            createForm: {
                                title: 'label.add.PA.device',
                                fields: {
                                    ip: {
                                        label: 'label.ip.address'
                                    },
                                    username: {
                                        label: 'label.username'
                                    },
                                    password: {
                                        label: 'label.password',
                                        isPassword: true
                                    },
                                    networkdevicetype: {
                                        label: 'label.type',
                                        select: function (args) {
                                            var items =[];
                                            items.push({
                                                id: "PaloAltoFirewall",
                                                description: "Palo Alto Firewall"
                                            });
                                            args.response.success({
                                                data: items
                                            });
                                        }
                                    },
                                    publicinterface: {
                                        label: 'label.public.interface'
                                    },
                                    privateinterface: {
                                        label: 'label.private.interface'
                                    },
                                    //usageinterface: {
                                    //  label: 'label.usage.interface'
                                    //},
                                    numretries: {
                                        label: 'label.numretries',
                                        defaultValue: '2'
                                    },
                                    timeout: {
                                        label: 'label.timeout',
                                        defaultValue: '300'
                                    },
                                    // inline: {
                                    //   label: 'Mode',
                                    //   select: function(args) {
                                    //     var items = [];
                                    //     items.push({id: "false", description: "side by side"});
                                    //     items.push({id: "true", description: "inline"});
                                    //     args.response.success({data: items});
                                    //   }
                                    // },
                                    publicnetwork: {
                                        label: 'label.public.network',
                                        defaultValue: 'untrust'
                                    },
                                    privatenetwork: {
                                        label: 'label.private.network',
                                        defaultValue: 'trust'
                                    },
                                    pavr: {
                                        label: 'label.virtual.router'
                                    },
                                    patp: {
                                        label: 'label.PA.threat.profile'
                                    },
                                    palp: {
                                        label: 'label.PA.log.profile'
                                    },
                                    capacity: {
                                        label: 'label.capacity',
                                        validation: {
                                            required: false,
                                            number: true
                                        }
                                    },
                                    dedicated: {
                                        label: 'label.dedicated',
                                        isBoolean: true,
                                        isChecked: false
                                    }
                                }
                            },
                            action: function (args) {
                                if (nspMap[ "pa"] == null) {
                                    $.ajax({
                                        url: createURL("addNetworkServiceProvider&name=PaloAlto&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
                                            var addPaloAltoProviderIntervalID = 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(addPaloAltoProviderIntervalID);
                                                            if (result.jobstatus == 1) {
                                                                nspMap[ "pa"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                addExternalFirewall(args, selectedPhysicalNetworkObj, "addPaloAltoFirewall", "addpaloaltofirewallresponse", "pafirewall");
                                                            } else if (result.jobstatus == 2) {
                                                                alert("addNetworkServiceProvider&name=Palo Alto failed. Error: " + _s(result.jobresult.errortext));
                                                            }
                                                        }
                                                    },
                                                    error: function (XMLHttpResponse) {
                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                        alert("addNetworkServiceProvider&name=Palo Alto failed. Error: " + errorMsg);
                                                    }
                                                });
                                            },
                                            3000);
                                        }
                                    });
                                } else {
                                    addExternalFirewall(args, selectedPhysicalNetworkObj, "addPaloAltoFirewall", "addpaloaltofirewallresponse", "pafirewall");
                                }
                            },
                            messages: {
                                notification: function (args) {
                                    return 'label.add.PA.device';
                                }
                            },
                            notification: {
                                poll: pollAsyncJobResult
                            }
                        }
                    },
                    dataProvider: function (args) {
                        $.ajax({
                            url: createURL("listPaloAltoFirewalls&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                            data: {
                                page: args.page,
                                pageSize: pageSize
                            },
                            dataType: "json",
                            async: false,
                            success: function (json) {
                                var items = json.listpaloaltofirewallresponse.paloaltofirewall;
                                args.response.success({
                                    data: items
                                });
                            }
                        });
                    },
                    detailView: {
                        name: 'label.palo.alto.details',
                        actions: {
                            'remove': {
                                label: 'label.delete.PA',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.delete.PA';
                                    },
                                    notification: function (args) {
                                        return 'label.delete.PA';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deletePaloAltoFirewall&fwdeviceid=" + args.context.paDevices[0].fwdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.deletepaloaltofirewallresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    fwdeviceid: {
                                        label: 'label.id'
                                    },
                                    ipaddress: {
                                        label: 'label.ip.address'
                                    },
                                    fwdevicestate: {
                                        label: 'label.status'
                                    },
                                    fwdevicename: {
                                        label: 'label.type'
                                    },
                                    fwdevicecapacity: {
                                        label: 'label.capacity'
                                    },
                                    timeout: {
                                        label: 'label.timeout'
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listPaloAltoFirewalls&fwdeviceid=" + args.context.paDevices[0].fwdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.listpaloaltofirewallresponse.paloaltofirewall[0];
                                            args.response.success({
                                                data: item
                                            });
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
            },
            
            // FIXME convert to nicira detailview
            // NiciraNvp devices listView
            niciraNvpDevices: {
                id: 'niciraNvpDevices',
                title: 'label.devices',
                listView: {
                    id: 'niciraNvpDevices',
                    fields: {
                        hostname: {
                            label: 'label.nicira.controller.address'
                        },
                        transportzoneuuid: {
                            label: 'label.nicira.transportzoneuuid'
                        },
                        l3gatewayserviceuuid: {
                            label: 'label.nicira.l3gatewayserviceuuid'
                        }
                    },
                    actions: {
                        add: {
                            label: 'label.add.NiciraNvp.device',
                            createForm: {
                                title: 'label.add.NiciraNvp.device',
                                preFilter: function (args) {
                                },
                                // TODO What is this?
                                fields: {
                                    host: {
                                        label: 'label.ip.address'
                                    },
                                    username: {
                                        label: 'label.username'
                                    },
                                    password: {
                                        label: 'label.password',
                                        isPassword: true
                                    },
                                    numretries: {
                                        label: 'label.numretries',
                                        defaultValue: '2'
                                    },
                                    transportzoneuuid: {
                                        label: 'label.nicira.transportzoneuuid'
                                    },
                                    l3gatewayserviceuuid: {
                                        label: 'label.nicira.l3gatewayserviceuuid'
                                    }
                                }
                            },
                            action: function (args) {
                                if (nspMap[ "niciraNvp"] == null) {
                                    $.ajax({
                                        url: createURL("addNetworkServiceProvider&name=NiciraNvp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
                                            var addNiciraNvpProviderIntervalID = 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(addNiciraNvpProviderIntervalID);
                                                            if (result.jobstatus == 1) {
                                                                nspMap[ "niciraNvp"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                addNiciraNvpDevice(args, selectedPhysicalNetworkObj, "addNiciraNvpDevice", "addniciranvpdeviceresponse", "niciranvpdevice")
                                                            } else if (result.jobstatus == 2) {
                                                                alert("addNetworkServiceProvider&name=NiciraNvp failed. Error: " + _s(result.jobresult.errortext));
                                                            }
                                                        }
                                                    },
                                                    error: function (XMLHttpResponse) {
                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                        alert("addNetworkServiceProvider&name=NiciraNvp failed. Error: " + errorMsg);
                                                    }
                                                });
                                            },
                                            g_queryAsyncJobResultInterval);
                                        }
                                    });
                                } else {
                                    addNiciraNvpDevice(args, selectedPhysicalNetworkObj, "addNiciraNvpDevice", "addniciranvpdeviceresponse", "niciranvpdevice")
                                }
                            },
                            
                            messages: {
                                notification: function (args) {
                                    return 'label.added.nicira.nvp.controller';
                                }
                            },
                            notification: {
                                poll: pollAsyncJobResult
                            }
                        }
                    },
                    dataProvider: function (args) {
                        $.ajax({
                            url: createURL("listNiciraNvpDevices&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                            data: {
                                page: args.page,
                                pageSize: pageSize
                            },
                            dataType: "json",
                            async: false,
                            success: function (json) {
                                var items = json.listniciranvpdeviceresponse.niciranvpdevice;
                                args.response.success({
                                    data: items
                                });
                            }
                        });
                    },
                    detailView: {
                        name: 'label.nicira.nvp.details',
                        actions: {
                            'remove': {
                                label: 'label.delete.NiciaNvp',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.delete.NiciraNvp';
                                    },
                                    notification: function (args) {
                                        return 'label.delete.NiciraNvp';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteNiciraNvpDevice&nvpdeviceid=" + args.context.niciraNvpDevices[0].nvpdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.deleteniciranvpdeviceresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    nvpdeviceid: {
                                        label: 'label.id'
                                    },
                                    hostname: {
                                        label: 'label.ip.address'
                                    },
                                    transportzoneuuid: {
                                        label: 'label.nicira.transportzoneuuid'
                                    },
                                    l3gatewayserviceuuid: {
                                        label: 'label.nicira.l3gatewayserviceuuid'
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listNiciraNvpDevices&nvpdeviceid=" + args.context.niciraNvpDevices[0].nvpdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.listniciranvpdeviceresponse.niciranvpdevice[0];
                                            args.response.success({
                                                data: item
                                            });
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
            },
			// BrocadeVcs devices listView
            brocadeVcsDevices: {
                id: 'brocadeVcsDevices',
                title: 'label.devices',
                listView: {
                    id: 'brocadeVcsDevices',
                    fields: {
                        hostname: {
                            label: 'label.brocade.vcs.address'
                        }
                    },
                    actions: {
                        add: {
                            label: 'label.add.BrocadeVcs.device',
                            createForm: {
                                title: 'label.add.BrocadeVcs.device',
                                preFilter: function (args) {
                                },
                                // TODO What is this?
                                fields: {
                                    host: {
                                        label: 'label.ip.address'
                                    },
                                    username: {
                                        label: 'label.username'
                                    },
                                    password: {
                                        label: 'label.password',
                                        isPassword: true
                                    }
                                }
                            },
                            action: function (args) {
                                if (nspMap[ "brocadeVcs"] == null) {
                                    $.ajax({
                                        url: createURL("addNetworkServiceProvider&name=BrocadeVcs&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
                                            var addBrocadeVcsProviderIntervalID = 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(addBrocadeVcsProviderIntervalID);
                                                            if (result.jobstatus == 1) {
                                                                nspMap[ "brocadeVcs"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                addBrocadeVcsDevice(args, selectedPhysicalNetworkObj, "addBrocadeVcsDevice", "addbrocadevcsdeviceresponse", "brocadevcsdevice")
                                                            } else if (result.jobstatus == 2) {
                                                                alert("addNetworkServiceProvider&name=BrocadeVcs failed. Error: " + _s(result.jobresult.errortext));
                                                            }
                                                        }
                                                    },
                                                    error: function (XMLHttpResponse) {
                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                        alert("addNetworkServiceProvider&name=BrocadeVcs failed. Error: " + errorMsg);
                                                    }
                                                });
                                            },
                                            g_queryAsyncJobResultInterval);
                                        }
                                    });
                                } else {
                                    addBrocadeVcsDevice(args, selectedPhysicalNetworkObj, "addBrocadeVcsDevice", "addbrocadevcsdeviceresponse", "brocadevcsdevice")
                                }
                            },
                            messages: {
                                notification: function (args) {
                                    return 'label.added.brocade.vcs.switch';
                                }
                            },
                            notification: {
                                poll: pollAsyncJobResult
                            }
                        }
                    },
                    dataProvider: function (args) {
                        $.ajax({
                            url: createURL("listBrocadeVcsDevices&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                            data: {
                                page: args.page,
                                pageSize: pageSize
                            },
                            dataType: "json",
                            async: false,
                            success: function (json) {
                                var items = json.listbrocadevcsdeviceresponse.brocadevcsdevice;
                                args.response.success({
                                    data: items
                                });
                            }
                        });
                    },
                    detailView: {
                        name: 'label.brocade.vcs.details',
                        actions: {
                            'remove': {
                                label: 'label.delete.BrocadeVcs',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.delete.BrocadeVcs';
                                    },
                                    notification: function (args) {
                                        return 'label.delete.BrocadeVcs';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteBrocadeVcsDevice&vcsdeviceid=" + args.context.brocadeVcsDevices[0].vcsdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.deletebrocadevcsdeviceresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    vcsdeviceid: {
                                        label: 'label.id'
                                    },
                                    hostname: {
                                        label: 'label.ip.address'
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listBrocadeVcsDevices&vcsdeviceid=" + args.context.brocadeVcsDevices[0].vcsdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.listbrocadevcsdeviceresponse.brocadevcsdevice[0];
                                            args.response.success({
                                                data: item
                                            });
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
            },
            bigswitchVnsDevices: {
                id: 'bigswitchVnsDevices',
                title: 'label.devices',
                listView: {
                    id: 'bigswitchVnsDevices',
                    fields: {
                        hostname: {
                            label: 'label.bigswitch.controller.address'
                        }
                    },
                    actions: {
                        add: {
                            label: 'label.add.BigSwitchVns.device',
                            createForm: {
                                title: 'label.add.BigSwitchVns.device',
                                preFilter: function (args) {
                                },
                                fields: {
                                    host: {
                                        label: 'label.ip.address'
                                    },
                                    numretries: {
                                        label: 'label.numretries',
                                        defaultValue: '2'
                                    }
                                }
                            },
                            action: function (args) {
                                if (nspMap[ "bigswitchVns"] == null) {
                                    $.ajax({
                                        url: createURL("addNetworkServiceProvider&name=BigSwitchVns&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
                                            var addBigSwitchVnsProviderIntervalID = setInterval(function () {
                                                $.ajax({
                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
                                                    dataType: "json",
                                                    success: function (json) {
                                                        var result = json.queryasyncjobresultresponse;
                                                        if (result.jobstatus == 0) {
                                                            return;
                                                        } else {
                                                            clearInterval(addBigSwitchVnsProviderIntervalID);
                                                            if (result.jobstatus == 1) {
                                                                nspMap[ "bigswitchVns"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                addBigSwitchVnsDevice(args, selectedPhysicalNetworkObj, "addBigSwitchVnsDevice", "addbigswitchvnsdeviceresponse", "bigswitchvnsdevice")
                                                            } else if (result.jobstatus == 2) {
                                                                alert("addNetworkServiceProvider&name=BigSwitchVns failed. Error: " + _s(result.jobresult.errortext));
                                                            }
                                                        }
                                                    },
                                                    error: function (XMLHttpResponse) {
                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                        alert("addNetworkServiceProvider&name=BigSwitchVns failed. Error: " + errorMsg);
                                                    }
                                                });
                                            },
                                            3000);
                                        }
                                    });
                                } else {
                                    addBigSwitchVnsDevice(args, selectedPhysicalNetworkObj, "addBigSwitchVnsDevice", "addbigswitchvnsdeviceresponse", "bigswitchvnsdevice")
                                }
                            },
                            
                            messages: {
                                notification: function (args) {
                                    return 'label.added.new.bigswitch.vns.controller';
                                }
                            },
                            notification: {
                                poll: pollAsyncJobResult
                            }
                        }
                    },
                    dataProvider: function (args) {
                        $.ajax({
                            url: createURL("listBigSwitchVnsDevices&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                            data: {
                                page: args.page,
                                pageSize: pageSize
                            },
                            dataType: "json",
                            async: false,
                            success: function (json) {
                                var items = json.listbigswitchvnsdeviceresponse.bigswitchvnsdevice;
                                args.response.success({
                                    data: items
                                });
                            }
                        });
                    },
                    detailView: {
                        name: 'label.bigswitch.vns.details',
                        actions: {
                            'remove': {
                                label: 'label.delete.BigSwitchVns',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.delete.BigSwitchVns';
                                    },
                                    notification: function (args) {
                                        return 'label.delete.BigSwitchVns';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteBigSwitchVnsDevice&vnsdeviceid=" + args.context.bigswitchvnsDevices[0].vnsdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.deletebigswitchvnsdeviceresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields:[ {
                                    vnsdeviceid: {
                                        label: 'label.id'
                                    },
                                    hostname: {
                                        label: 'label.ip.address'
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listBigSwitchVnsDevices&vnsdeviceid=" + args.context.bigswitchVnsDevices[0].vnsdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.listbigswitchvnsdeviceresponse.bigswitchvnsdevice[0];
                                            args.response.success({
                                                data: item
                                            });
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
            },
            nuageVspDevices: {
                id: 'nuageVspDevices',
                title: 'label.devices',
                listView: {
                    id: 'nuageVspDevices',
                    fields: {
                        hostname: {
                            label: 'label.host.name'
                        },
                        port: {
                            label: 'label.port'
                        },
                        apiversion: {
                            label: 'label.api.version'
                        },
                        retrycount: {
                            label: 'label.numretries',
                        },
                        retryinterval: {
                            label: 'label.retry.interval'
                        }
                    },
                    actions: {
                        add: {
                            label: 'label.add.NuageVsp.device',
                            createForm: {
                                title: 'label.add.NuageVsp.device',
                                preFilter: function(args) {},
                                fields: {
                                    hostname: {
                                        label: 'label.host.name'
                                    },
                                    username: {
                                        label: 'label.username'
                                    },
                                    password: {
                                        label: 'label.password',
                                        isPassword: true
                                    },
                                    port: {
                                        label: 'label.port'
                                    },
                                    apiversion: {
                                        label: 'label.api.version',
                                        defaultValue: 'v1_0'
                                    },
                                    retrycount: {
                                        label: 'label.numretries',
                                        defaultValue: '4'
                                    },
                                    retryinterval: {
                                        label: 'label.retry.interval',
                                        defaultValue: '60'
                                    }
                                }
                            },
                            action: function(args) {
                                if (nspMap["nuageVsp"] == null) {
                                    $.ajax({
                                        url: createURL("addNetworkServiceProvider&name=NuageVsp&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                                        dataType: "json",
                                        async: true,
                                        success: function(json) {
                                            var jobId = json.addnetworkserviceproviderresponse.jobid;
                                            var addNuageVspProviderIntervalID = setInterval(function() {
                                                $.ajax({
                                                    url: createURL("queryAsyncJobResult&jobId=" + jobId),
                                                    dataType: "json",
                                                    success: function(json) {
                                                        var result = json.queryasyncjobresultresponse;
                                                        if (result.jobstatus == 0) {
                                                            return;
                                                        } else {
                                                            clearInterval(addNuageVspProviderIntervalID);
                                                            if (result.jobstatus == 1) {
                                                                nspMap["nuageVsp"] = json.queryasyncjobresultresponse.jobresult.networkserviceprovider;
                                                                addNuageVspDevice(args, selectedPhysicalNetworkObj, "addNuageVspDevice", "addnuagevspdeviceresponse", "nuagevspdevice")
                                                            } else if (result.jobstatus == 2) {
                                                                alert("addNetworkServiceProvider&name=NuageVsp failed. Error: " + _s(result.jobresult.errortext));
                                                            }
                                                        }
                                                    },
                                                    error: function(XMLHttpResponse) {
                                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                        alert("addNetworkServiceProvider&name=NuageVsp failed. Error: " + errorMsg);
                                                    }
                                                });
                                            }, g_queryAsyncJobResultInterval);
                                        }
                                    });
                                } else {
                                    addNuageVspDevice(args, selectedPhysicalNetworkObj, "addNuageVspDevice", "addnuagevspdeviceresponse", "nuagevspdevice")
                                }
                            },

                            messages: {
                                notification: function(args) {
                                    return 'Added new Nuage Vsp Controller';
                                }
                            },
                            notification: {
                                poll: pollAsyncJobResult
                            }
                        }
                    },
                    dataProvider: function(args) {
                        $.ajax({
                            url: createURL("listNuageVspDevices&physicalnetworkid=" + selectedPhysicalNetworkObj.id),
                            data: {
                                page: args.page,
                                pageSize: pageSize
                            },
                            dataType: "json",
                            async: false,
                            success: function(json) {
                                var items = json.listnuagevspdeviceresponse.nuagevspdevice;
                                args.response.success({
                                    data: items
                                });
                            }
                        });
                    },
                    detailView: {
                        name: 'Nuage Vsp details',
                        actions: {
                            'remove': {
                                label: 'label.delete.NuageVsp',
                                messages: {
                                    confirm: function(args) {
                                        return 'message.confirm.delete.NuageVsp';
                                    },
                                    notification: function(args) {
                                        return 'label.delete.NuageVsp';
                                    }
                                },
                                action: function(args) {
                                    $.ajax({
                                        url: createURL("deleteNuageVspDevice&vspdeviceid=" + args.context.nuageVspDevices[0].vspdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function(json) {
                                            var jid = json.deletenuagevspdeviceresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            }
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                fields: [{
                                    vspdeviceid: {
                                        label: 'label.id'
                                    },
                                    hostname: {
                                        label: 'label.host.name'
                                    },
                                    port: {
                                        label: 'label.port'
                                    },
                                    apiversion: {
                                        label: 'label.api.version'
                                    },
                                    retrycount: {
                                        label: 'label.numretries',
                                    },
                                    retryinterval: {
                                        label: 'label.retry.interval'
                                    }
                                }],
                                dataProvider: function(args) {
                                    $.ajax({
                                        url: createURL("listNuageVspDevices&vspdeviceid=" + args.context.nuageVspDevices[0].vspdeviceid),
                                        dataType: "json",
                                        async: true,
                                        success: function(json) {
                                            var item = json.listnuagevspdeviceresponse.nuagevspdevice[0];
                                            args.response.success({
                                                data: item
                                            });
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
            },
            pods: {
                title: 'label.pods',
                listView: {
                    id: 'pods',
                    section: 'pods',
                    fields: {
                        name: {
                            label: 'label.name'
                        },
                        gateway: {
                            label: 'label.gateway'
                        },
                        netmask: {
                            label: 'label.netmask'
                        },
                        allocationstate: {
                            converter: function (str) {
                                // For localization
                                return str;
                            },
                            label: 'label.allocation.state'
                        }
                    },
                    
                    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;
                                }
                            }
                        }
                        
                        $.ajax({
                            url: createURL("listPods&zoneid=" + args.context.zones[0].id + "&page=" + args.page + "&pagesize=" + pageSize + array1.join("")),
                            dataType: "json",
                            async: true,
                            success: function (json) {
                                var items = json.listpodsresponse.pod;
                                args.response.success({
                                    actionFilter: podActionfilter,
                                    data: items
                                });
                            }
                        });
                    },
                    
                    actions: {
                        add: {
                            label: 'label.add.pod',
                            
                            createForm: {
                                title: 'label.add.pod',
                                fields: {
                                    zoneid: {
                                        label: 'label.zone',
                                        docID: 'helpPodZone',
                                        validation: {
                                            required: true
                                        },
                                        select: function (args) {
                                            var data = args.context.zones ? {
                                                id: args.context.zones[0].id
                                            }: {
                                                listAll: true
                                            };
                                            
                                            $.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
                                                            };
                                                        })
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    podname: {
                                        label: 'label.pod.name',
                                        docID: 'helpPodName',
                                        validation: {
                                            required: true
                                        }
                                    },
                                    reservedSystemGateway: {
                                        label: 'label.reserved.system.gateway',
                                        docID: 'helpPodGateway',
                                        validation: {
                                            required: true
                                        }
                                    },
                                    reservedSystemNetmask: {
                                        label: 'label.reserved.system.netmask',
                                        docID: 'helpPodNetmask',
                                        validation: {
                                            required: true
                                        }
                                    },
                                    reservedSystemStartIp: {
                                        label: 'label.start.reserved.system.IP',
                                        docID: 'helpPodStartIP',
                                        validation: {
                                            required: true
                                        }
                                    },
                                    reservedSystemEndIp: {
                                        label: 'label.end.reserved.system.IP',
                                        docID: 'helpPodEndIP',
                                        validation: {
                                            required: false
                                        }
                                    },
                                    
                                    isDedicated: {
                                        label: 'label.dedicate',
                                        isBoolean: true,
                                        isChecked: false,
                                        docID: 'helpDedicateResource'
                                    },
                                    
                                    domainId: {
                                        label: 'label.domain',
                                        isHidden: true,
                                        validation: {
                                            required: true
                                        },
                                        dependsOn: 'isDedicated',
                                        select: function (args) {
                                            $.ajax({
                                                url: createURL("listDomains&listAll=true"),
                                                dataType: "json",
                                                async: false,
                                                success: function (json) {
                                                    var domainObjs = json.listdomainsresponse.domain;
                                                    var items =[];
                                                    
                                                    $(domainObjs).each(function () {
                                                        items.push({
                                                            id: this.id,
                                                            description: this.name
                                                        });
                                                    });
                                                    
                                                    args.response.success({
                                                        data: items
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    
                                    accountId: {
                                        label: 'label.account',
                                        isHidden: true,
                                        dependsOn: 'isDedicated',
                                        docID: 'helpAccountForDedication',
                                        validation: {
                                            required: false
                                        }
                                    }
                                }
                            },
                            
                            action: function (args) {
                                var array1 =[];
                                var appendData = args.data.append ? args.data.append: {
                                };
                                
                                array1.push("&zoneId=" + args.data.zoneid);
                                array1.push("&name=" + todb(args.data.podname));
                                array1.push("&gateway=" + todb(args.data.reservedSystemGateway));
                                array1.push("&netmask=" + todb(args.data.reservedSystemNetmask));
                                array1.push("&startIp=" + todb(args.data.reservedSystemStartIp));
                                
                                var endip = args.data.reservedSystemEndIp; //optional
                                if (endip != null && endip.length > 0)
                                array1.push("&endIp=" + todb(endip));
                                var podId = null;
                                $.ajax({
                                    url: createURL("createPod" + array1.join("")),
                                    data: appendData,
                                    dataType: "json",
                                    success: function (json) {
                                        var item = json.createpodresponse.pod;
                                        podId = json.createpodresponse.pod.id;
                                        
                                        //EXPLICIT DEDICATION
                                        if (args.$form.find('.form-item[rel=isDedicated]').find('input[type=checkbox]').is(':Checked') == true) {
                                            var array2 =[];
                                            if (args.data.accountId != "")
                                            array2.push("&account=" + todb(args.data.accountId));
                                            
                                            if (podId != null) {
                                                $.ajax({
                                                    url: createURL("dedicatePod&podId=" + podId + "&domainId=" + args.data.domainId + array2.join("")),
                                                    dataType: "json",
                                                    success: function (json) {
                                                        var jid = json.dedicatepodresponse.jobid;
                                                        args.response.success({
                                                            _custom: {
                                                                jobId: jid
                                                            },
                                                            notification: {
                                                                poll: pollAsyncJobResult,
                                                                interval: 4500,
                                                                desc: "Dedicate Pod"
                                                            },
                                                            
                                                            data: item
                                                        });
                                                    },
                                                    
                                                    error: function (json) {
                                                        args.response.error(parseXMLHttpResponse(XMLHttpResponse));
                                                    }
                                                });
                                            }
                                        }
                                        args.response.success({
                                            data: item
                                        });
                                    },
                                    error: function (XMLHttpResponse) {
                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                        args.response.error(errorMsg);
                                    }
                                });
                            },
                            
                            notification: {
                                poll: function (args) {
                                    args.complete({
                                        actionFilter: podActionfilter
                                    });
                                }
                            },
                            
                            messages: {
                                notification: function (args) {
                                    return 'label.add.pod';
                                }
                            }
                        }
                    },
                    
                    detailView: {
                        viewAll: {
                            path: '_zone.clusters',
                            label: 'label.clusters'
                        },
                        tabFilter: function (args) {
                            var hiddenTabs =[];
                            if (selectedZoneObj.networktype == "Basic") {
                                //basic-mode network (pod-wide VLAN)
                                //$("#tab_ipallocation, #add_iprange_button, #tab_network_device, #add_network_device_button").show();
                            } else if (selectedZoneObj.networktype == "Advanced") {
                                //advanced-mode network (zone-wide VLAN)
                                //$("#tab_ipallocation, #add_iprange_button, #tab_network_device, #add_network_device_button").hide();
                                hiddenTabs.push("ipAllocations");
                                //hiddenTabs.push("networkDevices"); //network devices tab is moved out of pod page at 3.0 UI. It will go to new network page.
                            }
                            return hiddenTabs;
                        },
                        actions: {
                            edit: {
                                label: 'label.edit',
                                action: function (args) {
                                    var array1 =[];
                                    array1.push("&name=" + todb(args.data.name));
                                    array1.push("&netmask=" + todb(args.data.netmask));
                                    array1.push("&startIp=" + todb(args.data.startip));
                                    if (args.data.endip != null && args.data.endip.length > 0)
                                    array1.push("&endIp=" + todb(args.data.endip));
                                    if (args.data.gateway != null && args.data.gateway.length > 0)
                                    array1.push("&gateway=" + todb(args.data.gateway));
                                    
                                    $.ajax({
                                        url: createURL("updatePod&id=" + args.context.pods[0].id + array1.join("")),
                                        dataType: "json",
                                        success: function (json) {
                                            var item = json.updatepodresponse.pod;
                                            args.response.success({
                                                actionFilter: podActionfilter,
                                                data: item
                                            });
                                        },
                                        error: function (data) {
                                            args.response.error(parseXMLHttpResponse(data));
                                        }
                                    });
                                }
                            },
                            
                            enable: {
                                label: 'label.action.enable.pod',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.enable.pod';
                                    },
                                    notification: function (args) {
                                        return 'label.action.enable.pod';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updatePod&id=" + args.context.pods[0].id + "&allocationstate=Enabled"),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.updatepodresponse.pod;
                                            args.response.success({
                                                actionFilter: podActionfilter,
                                                data: item
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: function (args) {
                                        args.complete();
                                    }
                                }
                            },
                            
                            dedicate: {
                                label: 'label.dedicate.pod',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.dedicate.pod.domain.account';
                                    },
                                    notification: function (args) {
                                        return 'label.pod.dedicated';
                                    }
                                },
                                createForm: {
                                    title: 'label.dedicate.pod',
                                    fields: {
                                        domainId: {
                                            label: 'label.domain',
                                            validation: {
                                                required: true
                                            },
                                            select: function (args) {
                                                $.ajax({
                                                    url: createURL("listDomains&listAll=true"),
                                                    dataType: "json",
                                                    async: false,
                                                    success: function (json) {
                                                        var domainObjs = json.listdomainsresponse.domain;
                                                        var items =[];
                                                        
                                                        $(domainObjs).each(function () {
                                                            items.push({
                                                                id: this.id,
                                                                description: this.name
                                                            });
                                                        });
                                                        
                                                        args.response.success({
                                                            data: items
                                                        });
                                                    }
                                                });
                                            }
                                        },
                                        accountId: {
                                            label: 'label.account',
                                            docID: 'helpAccountForDedication',
                                            validation: {
                                                required: false
                                            }
                                        }
                                    }
                                },
                                action: function (args) {
                                    //EXPLICIT DEDICATION
                                    var array2 =[];
                                    if (args.data.accountId != "")
                                    array2.push("&account=" + todb(args.data.accountId));
                                    
                                    $.ajax({
                                        url: createURL("dedicatePod&podId=" +
                                        args.context.pods[0].id +
                                        "&domainId=" + args.data.domainId + array2.join("")),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.dedicatepodresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getActionFilter: function () {
                                                        return podActionfilter;
                                                    }
                                                }
                                            });
                                        },
                                        error: function (json) {
                                            args.response.error(parseXMLHttpResponse(XMLHttpResponse));
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            release: {
                                label: 'label.release.dedicated.pod',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.release.dedicated.pod';
                                    },
                                    notification: function (args) {
                                        return 'message.pod.dedication.released';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("releaseDedicatedPod&podid=" + args.context.pods[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.releasededicatedpodresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getActionFilter: function () {
                                                        return podActionfilter;
                                                    }
                                                }
                                            });
                                        },
                                        error: function (json) {
                                            args.response.error(parseXMLHttpResponse(json));
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            
                            
                            disable: {
                                label: 'label.action.disable.pod',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.disable.pod';
                                    },
                                    notification: function (args) {
                                        return 'label.action.disable.pod';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updatePod&id=" + args.context.pods[0].id + "&allocationstate=Disabled"),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.updatepodresponse.pod;
                                            args.response.success({
                                                actionFilter: podActionfilter,
                                                data: item
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: function (args) {
                                        args.complete();
                                    }
                                }
                            },
                            
                            'remove': {
                                label: 'label.delete',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.delete.pod';
                                    },
                                    notification: function (args) {
                                        return 'label.action.delete.pod';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deletePod&id=" + args.context.pods[0].id),
                                        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',
                                        isEditable: true,
                                        validation: {
                                            required: true
                                        }
                                    }
                                },
                                {
                                    id: {
                                        label: 'label.id'
                                    },
                                    netmask: {
                                        label: 'label.netmask',
                                        isEditable: true,
                                        validation: {
                                            required: true
                                        }
                                    },
                                    startip: {
                                        label: 'label.start.IP',
                                        isEditable: true,
                                        validation: {
                                            required: true
                                        }
                                    },
                                    endip: {
                                        label: 'label.end.IP',
                                        isEditable: true
                                    },
                                    gateway: {
                                        label: 'label.gateway',
                                        isEditable: true,
                                        validation: {
                                            required: true
                                        }
                                    },
                                    allocationstate: {
                                        converter: function (str) {
                                            // For localization
                                            return str;
                                        },
                                        label: 'label.allocation.state'
                                    }
                                }, {
                                    
                                    isdedicated: {
                                        label: 'label.dedicated'
                                    },
                                    domainid: {
                                        label: 'label.domain.id'
                                    }
                                }],
                                
                                dataProvider: function (args) {
                                    
                                    $.ajax({
                                        url: createURL("listPods&id=" + args.context.pods[0].id),
                                        success: function (json) {
                                            var item = json.listpodsresponse.pod[0];
                                            
                                            
                                            $.ajax({
                                                url: createURL("listDedicatedPods&podid=" + args.context.pods[0].id),
                                                success: function (json) {
                                                    if (json.listdedicatedpodsresponse.dedicatedpod != undefined) {
                                                        var podItem = json.listdedicatedpodsresponse.dedicatedpod[0];
                                                        if (podItem.domainid != null) {
                                                            $.extend(item, podItem, {
                                                                isdedicated: 'label.yes'
                                                            });
                                                        }
                                                    } else
                                                    $.extend(item, {
                                                        isdedicated: 'label.no'
                                                    });
                                                    
                                                    args.response.success({
                                                        actionFilter: podActionfilter,
                                                        data: item
                                                    });
                                                },
                                                error: function (json) {
                                                    args.response.error(parseXMLHttpResponse(XMLHttpResponse));
                                                }
                                            });
                                            //  args.response.success({
                                            //     actionFilter: podActionfilter,
                                            //     data: item
                                            // });
                                        }
                                    });
                                }
                            },
                            
                            ipAllocations: {
                                title: 'label.ip.allocations',
                                multiple: true,
                                fields:[ {
                                    id: {
                                        label: 'label.id'
                                    },
                                    gateway: {
                                        label: 'label.gateway'
                                    },
                                    netmask: {
                                        label: 'label.netmask'
                                    },
                                    startip: {
                                        label: 'label.start.IP'
                                    },
                                    endip: {
                                        label: 'label.end.IP'
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listVlanIpRanges&zoneid=" + args.context.zones[0].id + "&podid=" + args.context.pods[0].id),
                                        dataType: "json",
                                        success: function (json) {
                                            var items = json.listvlaniprangesresponse.vlaniprange;
                                            args.response.success({
                                                data: items
                                            });
                                        }
                                    });
                                }
                            }
                        }
                    }
                }
            },
            clusters: {
                title: 'label.clusters',
                listView: {
                    id: 'clusters',
                    section: 'clusters',
                    fields: {
                        name: {
                            label: 'label.name'
                        },
                        podname: {
                            label: 'label.pod'
                        },
                        hypervisortype: {
                            label: 'label.hypervisor'
                        },
                        //allocationstate: { label: 'label.allocation.state' },
                        //managedstate: { label: 'Managed State' },
                        allocationstate: {
                            converter: function (str) {
                                // For localization
                                return str;
                            },
                            label: 'label.state',
                            indicator: {
                                'Enabled': 'on',
                                'Destroyed': 'off'
                            }
                        }
                    },
                    
                    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);
                        $.ajax({
                            url: createURL("listClusters" + array1.join("") + "&page=" + args.page + "&pagesize=" + pageSize),
                            dataType: "json",
                            async: true,
                            success: function (json) {
                                var items = json.listclustersresponse.cluster;
                                $(items).each(function () {
                                    addExtraPropertiesToClusterObject(this);
                                });
                                
                                args.response.success({
                                    actionFilter: clusterActionfilter,
                                    data: items
                                });
                            }
                        });
                    },
                    
                    actions: {
                        add: {
                            label: 'label.add.cluster',
                            messages: {
                                notification: function (args) {
                                    return 'label.add.cluster';
                                }
                            },
                            createForm: {
                                title: 'label.add.cluster',
                                preFilter: function (args) {
                                    var $form = args.$form;
                                    $form.click(function () {
                                        var $nexusDvsOptFields = $form.find('.form-item').filter(function () {
                                            var nexusDvsOptFields =[
                                            'vsmipaddress',
                                            'vsmusername',
                                            'vsmpassword'];
                                            return $.inArray($(this).attr('rel'), nexusDvsOptFields) > -1;
                                        });
                                        var $nexusDvsReqFields = $form.find('.form-item').filter(function () {
                                            var nexusDvsReqFields =[
                                            'vsmipaddress_req',
                                            'vsmusername_req',
                                            'vsmpassword_req'];
                                            return $.inArray($(this).attr('rel'), nexusDvsReqFields) > -1;
                                        });
                                        
                                        if ($form.find('.form-item[rel=hypervisor] select').val() == 'VMware') {
                                            $form.find('.form-item[rel=vCenterHost]').css('display', 'inline-block');
                                            $form.find('.form-item[rel=vCenterUsername]').css('display', 'inline-block');
                                            $form.find('.form-item[rel=vCenterPassword]').css('display', 'inline-block');
                                            $form.find('.form-item[rel=vCenterDatacenter]').css('display', 'inline-block');
                                            
                                            var $overridePublicTraffic = $form.find('.form-item[rel=overridepublictraffic] input[type=checkbox]');
                                            var $vSwitchPublicType = $form.find('.form-item[rel=vSwitchPublicType] select');
                                            var $overrideGuestTraffic = $form.find('.form-item[rel=overrideguesttraffic] input[type=checkbox]');
                                            var $vSwitchGuestType = $form.find('.form-item[rel=vSwitchGuestType] select');
                                            
                                            
                                            var useDvs = false;
                                            $.ajax({
                                                url: createURL('listConfigurations'),
                                                data: {
                                                    name: 'vmware.use.dvswitch'
                                                },
                                                async: false,
                                                success: function (json) {
                                                    if (json.listconfigurationsresponse.configuration[0].value == 'true') {
                                                        useDvs = true;
                                                    }
                                                }
                                            });
                                            if (useDvs == true) {
                                                //If using Distributed vswitch, there is OverrideTraffic option.
                                                $form.find('.form-item[rel=overridepublictraffic]').css('display', 'inline-block');
                                                $form.find('.form-item[rel=overrideguesttraffic]').css('display', 'inline-block');
                                                
                                                var useNexusDvs = false;
                                                $.ajax({
                                                    url: createURL('listConfigurations'),
                                                    data: {
                                                        name: 'vmware.use.nexus.vswitch'
                                                    },
                                                    async: false,
                                                    success: function (json) {
                                                        if (json.listconfigurationsresponse.configuration[0].value == 'true') {
                                                            useNexusDvs = true;
                                                        }
                                                    }
                                                });
                                                if (useNexusDvs == true) {
                                                    //If using Nexus Distributed vswitch, show Nexus Distributed vswitch fields (either required ones or optional ones).
                                                    if (($overridePublicTraffic.is(':checked') && $vSwitchPublicType.val() == 'nexusdvs') ||
                                                    ($overrideGuestTraffic.is(':checked') && $vSwitchGuestType.val() == 'nexusdvs')) {
                                                        $nexusDvsReqFields.css('display', 'inline-block');
                                                        $nexusDvsOptFields.hide();
                                                    } else {
                                                        $nexusDvsOptFields.css('display', 'inline-block');
                                                        $nexusDvsReqFields.hide();
                                                    }
                                                } else {
                                                    //If not using Nexus Distributed vswitch, hide Nexus Distributed vswitch fields.
                                                    $nexusDvsOptFields.hide();
                                                    $nexusDvsReqFields.hide();
                                                }
                                            } else {
                                                //useDvs == false
                                                $form.find('.form-item[rel=overridepublictraffic]').css('display', 'none');
                                                $form.find('.form-item[rel=vSwitchPublicType]').css('display', 'none');
                                                $form.find('.form-item[rel=vSwitchPublicName]').css('display', 'none');
                                                
                                                $form.find('.form-item[rel=overrideguesttraffic]').css('display', 'none');
                                                $form.find('.form-item[rel=vSwitchGuestType]').css('display', 'none');
                                                $form.find('.form-item[rel=vSwitchGuestName]').css('display', 'none');
                                                
                                                $nexusDvsOptFields.hide();
                                                $nexusDvsReqFields.hide();
                                            }
                                        } else {
                                            //XenServer, KVM, etc (non-VMware)
                                            $form.find('.form-item[rel=vCenterHost]').css('display', 'none');
                                            $form.find('.form-item[rel=vCenterUsername]').css('display', 'none');
                                            $form.find('.form-item[rel=vCenterPassword]').css('display', 'none');
                                            $form.find('.form-item[rel=vCenterDatacenter]').css('display', 'none');
                                            $form.find('.form-item[rel=enableNexusVswitch]').css('display', 'none');
                                            
                                            $form.find('.form-item[rel=overridepublictraffic]').css('display', 'none');
                                            $form.find('.form-item[rel=overrideguesttraffic]').css('display', 'none');
                                            $nexusDvsOptFields.hide();
                                            $nexusDvsReqFields.hide();
                                        }
                                        
                                        if ($form.find('.form-item[rel=overridepublictraffic]').css('display') != 'none' && $overridePublicTraffic.is(':checked')) {
                                            $form.find('.form-item[rel=vSwitchPublicType]').css('display', 'inline-block');
                                            $form.find('.form-item[rel=vSwitchPublicName]').css('display', 'inline-block');
                                        } else {
                                            $form.find('.form-item[rel=vSwitchPublicType]').css('display', 'none');
                                            $form.find('.form-item[rel=vSwitchPublicName]').css('display', 'none');
                                        }
                                        
                                        if ($form.find('.form-item[rel=overrideguesttraffic]').css('display') != 'none' && $overrideGuestTraffic.is(':checked')) {
                                            $form.find('.form-item[rel=vSwitchGuestType]').css('display', 'inline-block');
                                            $form.find('.form-item[rel=vSwitchGuestName]').css('display', 'inline-block');
                                        } else {
                                            $form.find('.form-item[rel=vSwitchGuestType]').css('display', 'none');
                                            $form.find('.form-item[rel=vSwitchGuestName]').css('display', 'none');
                                        }
                                    });
                                    
                                    $form.trigger('click');
                                },
                                fields: {
                                    zoneid: {
                                        label: 'label.zone.name',
                                        docID: 'helpClusterZone',
                                        validation: {
                                            required: true
                                        },
                                        select: function (args) {
                                            var data = args.context.zones ? {
                                                id: args.context.zones[0].id
                                            }: {
                                                listAll: true
                                            };
                                            
                                            $.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
                                                            };
                                                        })
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    hypervisor: {
                                        label: 'label.hypervisor',
                                        docID: 'helpClusterHypervisor',
                                        select: function (args) {
                                            $.ajax({
                                                url: createURL("listHypervisors"),
                                                dataType: "json",
                                                async: false,
                                                success: function (json) {
                                                    var hypervisors = json.listhypervisorsresponse.hypervisor;
                                                    var items =[];
                                                    $(hypervisors).each(function () {
                                                        items.push({
                                                            id: this.name,
                                                            description: this.name
                                                        });
                                                    });
                                                    args.response.success({
                                                        data: items
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    podId: {
                                        label: 'label.pod.name',
                                        docID: 'helpClusterPod',
                                        dependsOn: 'zoneid',
                                        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 () {
                                                        if (("pods" in args.context) && (this.id == args.context.pods[0].id))
                                                        items.unshift({
                                                            id: this.id,
                                                            description: this.name
                                                        }); else
                                                        items.push({
                                                            id: this.id,
                                                            description: this.name
                                                        });
                                                    });
                                                    args.response.success({
                                                        data: items
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    name: {
                                        label: 'label.cluster.name',
                                        docID: 'helpClusterName',
                                        validation: {
                                            required: true
                                        }
                                    },
                                    
                                    isDedicated: {
                                        label: 'label.dedicate',
                                        isBoolean: true,
                                        isChecked: false,
                                        docID: 'helpDedicateResource'
                                    },
                                    
                                    domainId: {
                                        label: 'label.domain',
                                        isHidden: true,
                                        validation: {
                                            required: true
                                        },
                                        dependsOn: 'isDedicated',
                                        select: function (args) {
                                            $.ajax({
                                                url: createURL("listDomains&listAll=true"),
                                                dataType: "json",
                                                async: false,
                                                success: function (json) {
                                                    var domainObjs = json.listdomainsresponse.domain;
                                                    var items =[];
                                                    
                                                    $(domainObjs).each(function () {
                                                        items.push({
                                                            id: this.id,
                                                            description: this.name
                                                        });
                                                    });
                                                    
                                                    args.response.success({
                                                        data: items
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    
                                    accountId: {
                                        label: 'label.account',
                                        isHidden: true,
                                        dependsOn: 'isDedicated',
                                        docID: 'helpAccountForDedication',
                                        validation: {
                                            required: false
                                        }
                                    },
                                    
                                    //hypervisor==VMWare begins here
                                    vCenterHost: {
                                        label: 'label.vcenter.host',
                                        isHidden: true,
                                        docID: 'helpClustervCenterHost',
                                        validation: {
                                            required: false
                                        }
                                        //legacy zone - validation not required for new VMware dc model
                                    },
                                    vCenterUsername: {
                                        label: 'label.vcenter.username',
                                        isHidden: true,
                                        docID: 'helpClustervCenterUsername'
                                    },
                                    vCenterPassword: {
                                        label: 'label.vcenter.password',
                                        isHidden: true,
                                        docID: 'helpClustervCenterPassword',
                                        isPassword: true
                                    },
                                    vCenterDatacenter: {
                                        label: 'label.vcenter.datacenter',
                                        isHidden: true,
                                        docID: 'helpClustervCenterDatacenter',
                                        validation: {
                                            required: false
                                        }
                                        //legacy zone - validation not required for new VMware dc model
                                    },
                                    
                                    overridepublictraffic: {
                                        label: 'label.override.public.traffic',
                                        isBoolean: true,
                                        isHidden: true,
                                        isChecked: false,
                                        docID: 'helpOverridePublicNetwork'
                                    },
                                    
                                    
                                    vSwitchPublicType: {
                                        label: 'label.public.traffic.vswitch.type',
                                        select: function (args) {
                                            var useNexusDvs = false;
                                            var items =[]
                                            $.ajax({
                                                url: createURL('listConfigurations'),
                                                data: {
                                                    name: 'vmware.use.nexus.vswitch'
                                                },
                                                async: false,
                                                success: function (json) {
                                                    if (json.listconfigurationsresponse.configuration[0].value == 'true') {
                                                        useNexusDvs = true;
                                                    }
                                                }
                                            });
                                            
                                            if (useNexusDvs) {
                                                items.push({
                                                    id: "nexusdvs",
                                                    description: "Cisco Nexus 1000v Distributed Virtual Switch"
                                                });
                                                items.push({
                                                    id: "vmwaresvs",
                                                    description: "VMware vNetwork Standard Virtual Switch"
                                                });
                                                items.push({
                                                    id: "vmwaredvs",
                                                    description: "VMware vNetwork Distributed Virtual Switch"
                                                });
                                            } else {
                                                items.push({
                                                    id: "vmwaredvs",
                                                    description: "VMware vNetwork Distributed Virtual Switch"
                                                });
                                                items.push({
                                                    id: "vmwaresvs",
                                                    description: "VMware vNetwork Standard Virtual Switch"
                                                });
                                                items.push({
                                                    id: "nexusdvs",
                                                    description: "Cisco Nexus 1000v Distributed Virtual Switch"
                                                });
                                            }
                                            
                                            args.response.success({
                                                data: items
                                            });
                                        },
                                        isHidden: true
                                    },
                                    
                                    vSwitchPublicName: {
                                        label: 'label.public.traffic.vswitch.name',
                                        isHidden: true
                                    },
                                    
                                    overrideguesttraffic: {
                                        label: 'label.override.guest.traffic',
                                        isBoolean: true,
                                        isHidden: true,
                                        isChecked: false,
                                        docID: 'helpOverrideGuestNetwork'
                                    },
                                    
                                    vSwitchGuestType: {
                                        label: 'label.guest.traffic.vswitch.type',
                                        select: function (args) {
                                            var items =[]
                                            
                                            var useNexusDvs = false;
                                            $.ajax({
                                                url: createURL('listConfigurations'),
                                                data: {
                                                    name: 'vmware.use.nexus.vswitch'
                                                },
                                                async: false,
                                                success: function (json) {
                                                    if (json.listconfigurationsresponse.configuration[0].value == 'true') {
                                                        useNexusDvs = true;
                                                    }
                                                }
                                            });
                                            
                                            
                                            if (useNexusDvs) {
                                                items.push({
                                                    id: "nexusdvs",
                                                    description: "Cisco Nexus 1000v Distributed Virtual Switch"
                                                });
                                                items.push({
                                                    id: "vmwaresvs",
                                                    description: "VMware vNetwork Standard Virtual Switch"
                                                });
                                                items.push({
                                                    id: "vmwaredvs",
                                                    description: "VMware vNetwork Distributed Virtual Switch"
                                                });
                                            } else {
                                                items.push({
                                                    id: "vmwaredvs",
                                                    description: "VMware vNetwork Distributed Virtual Switch"
                                                });
                                                items.push({
                                                    id: "vmwaresvs",
                                                    description: "VMware vNetwork Standard Virtual Switch"
                                                });
                                                items.push({
                                                    id: "nexusdvs",
                                                    description: "Cisco Nexus 1000v Distributed Virtual Switch"
                                                });
                                            }
                                            
                                            args.response.success({
                                                data: items
                                            });
                                        },
                                        isHidden: true
                                    },
                                    
                                    vSwitchGuestName: {
                                        label: ' label.guest.traffic.vswitch.name',
                                        isHidden: true
                                    },
                                    
                                    
                                    vsmipaddress: {
                                        label: 'label.cisco.nexus1000v.ip.address',
                                        validation: {
                                            required: false
                                        },
                                        isHidden: true
                                    },
                                    vsmipaddress_req: {
                                        label: 'label.cisco.nexus1000v.ip.address',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    vsmusername: {
                                        label: 'label.cisco.nexus1000v.username',
                                        validation: {
                                            required: false
                                        },
                                        isHidden: true
                                    },
                                    vsmusername_req: {
                                        label: 'label.cisco.nexus1000v.username',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    vsmpassword: {
                                        label: 'label.cisco.nexus1000v.password',
                                        validation: {
                                            required: false
                                        },
                                        isPassword: true,
                                        isHidden: true
                                    },
                                    vsmpassword_req: {
                                        label: 'label.cisco.nexus1000v.password',
                                        validation: {
                                            required: true
                                        },
                                        isPassword: true,
                                        isHidden: true
                                    }
                                    //hypervisor==VMWare ends here
                                }
                            },
                            
                            action: function (args) {
                                var array1 =[];
                                array1.push("&zoneId=" + args.data.zoneid);
                                array1.push("&hypervisor=" + args.data.hypervisor);
                                
                                var clusterType;
                                if (args.data.hypervisor == "VMware")
                                clusterType = "ExternalManaged"; else
                                clusterType = "CloudManaged";
                                array1.push("&clustertype=" + clusterType);
                                
                                array1.push("&podId=" + args.data.podId);
                                
                                var clusterName = args.data.name;
                                
                                if (args.data.hypervisor == "VMware") {
                                    array1.push("&username=" + todb(args.data.vCenterUsername));
                                    array1.push("&password=" + todb(args.data.vCenterPassword));
                                    
                                    //vSwitch Public Type
                                    if (args.$form.find('.form-item[rel=vSwitchPublicType]').css('display') != 'none' && args.data.vSwitchPublicType != "") {
                                        array1.push("&publicvswitchtype=" + args.data.vSwitchPublicType);
                                    }
                                    if (args.$form.find('.form-item[rel=vSwitchPublicName]').css('display') != 'none' && args.data.vSwitchPublicName != "") {
                                        array1.push("&publicvswitchname=" + args.data.vSwitchPublicName);
                                    }
                                    
                                    //vSwitch Guest Type
                                    if (args.$form.find('.form-item[rel=vSwitchGuestType]').css('display') != 'none' && args.data.vSwitchGuestType != "") {
                                        array1.push("&guestvswitchtype=" + args.data.vSwitchGuestType);
                                    }
                                    if (args.$form.find('.form-item[rel=vSwitchGuestName]').css('display') != 'none' && args.data.vSwitchGuestName != "") {
                                        array1.push("&guestvswitchname=" + args.data.vSwitchGuestName);
                                    }
                                    
                                    //Nexus VSM fields
                                    if (args.$form.find('.form-item[rel=vsmipaddress]').css('display') != 'none' && args.data.vsmipaddress != null && args.data.vsmipaddress.length > 0) {
                                        array1.push('&vsmipaddress=' + args.data.vsmipaddress);
                                    }
                                    if (args.$form.find('.form-item[rel=vsmipaddress_req]').css('display') != 'none' && args.data.vsmipaddress_req != null && args.data.vsmipaddress_req.length > 0) {
                                        array1.push('&vsmipaddress=' + args.data.vsmipaddress_req);
                                    }
                                    
                                    if (args.$form.find('.form-item[rel=vsmusername]').css('display') != 'none' && args.data.vsmusername != null && args.data.vsmusername.length > 0) {
                                        array1.push('&vsmusername=' + args.data.vsmusername);
                                    }
                                    if (args.$form.find('.form-item[rel=vsmusername_req]').css('display') != 'none' && args.data.vsmusername_req != null && args.data.vsmusername_req.length > 0) {
                                        array1.push('&vsmusername=' + args.data.vsmusername_req);
                                    }
                                    
                                    if (args.$form.find('.form-item[rel=vsmpassword]').css('display') != 'none' && args.data.vsmpassword != null && args.data.vsmpassword.length > 0) {
                                        array1.push('&vsmpassword=' + args.data.vsmpassword);
                                    }
                                    if (args.$form.find('.form-item[rel=vsmpassword_req]').css('display') != 'none' && args.data.vsmpassword_req != null && args.data.vsmpassword_req.length > 0) {
                                        array1.push('&vsmpassword=' + args.data.vsmpassword_req);
                                    }
                                    
                                    
                                    var hostname = args.data.vCenterHost;
                                    var dcName = args.data.vCenterDatacenter;
                                    
                                    if (hostname.length == 0 && dcName.length == 0) {
                                        $.ajax({
                                            url: createURL('listVmwareDcs'),
                                            data: {
                                                zoneid: args.data.zoneid
                                            },
                                            async: false,
                                            success: function (json) {
                                                //e.g. json == { "listvmwaredcsresponse" { "count":1 ,"VMwareDC" [ {"id":"c3c2562d-65e9-4fc7-92e2-773c2efe8f37","zoneid":1,"name":"datacenter","vcenter":"10.10.20.20"} ] } }
                                                var vmwaredcs = json.listvmwaredcsresponse.VMwareDC;
                                                if (vmwaredcs != null) {
                                                    hostname = vmwaredcs[0].vcenter;
                                                    dcName = vmwaredcs[0].name;
                                                }
                                            }
                                        });
                                    }
                                    
                                    var url;
                                    if (hostname.indexOf("http://") == -1)
                                    url = "http://" + hostname; else
                                    url = hostname;
                                    url += "/" + dcName + "/" + clusterName;
                                    array1.push("&url=" + todb(url));
                                    
                                    clusterName = hostname + "/" + dcName + "/" + clusterName; //override clusterName
                                }
                                array1.push("&clustername=" + todb(clusterName));
                                var clusterId = null;
                                $.ajax({
                                    url: createURL("addCluster" + array1.join("")),
                                    dataType: "json",
                                    type: "POST",
                                    success: function (json) {
                                        var item = json.addclusterresponse.cluster[0];
                                        clusterId = json.addclusterresponse.cluster[0].id;
                                        
                                        //EXPLICIT DEDICATION
                                        var array2 =[];
                                        if (args.$form.find('.form-item[rel=isDedicated]').find('input[type=checkbox]').is(':Checked') == true) {
                                            if (args.data.accountId != "")
                                            array2.push("&account=" + todb(args.data.accountId));
                                            
                                            if (clusterId != null) {
                                                $.ajax({
                                                    url: createURL("dedicateCluster&clusterId=" + clusterId + "&domainId=" + args.data.domainId + array2.join("")),
                                                    dataType: "json",
                                                    success: function (json) {
                                                        var jid = json.dedicateclusterresponse.jobid;
                                                        args.response.success({
                                                            _custom: {
                                                                jobId: jid
                                                            },
                                                            notification: {
                                                                poll: pollAsyncJobResult,
                                                                interval: 4500,
                                                                desc: "Dedicate Cluster"
                                                            },
                                                            
                                                            data: $.extend(item, {
                                                                state: 'Enabled'
                                                            })
                                                        });
                                                    },
                                                    error: function (json) {
                                                        args.response.error(parseXMLHttpResponse(XMLHttpResponse));
                                                    }
                                                });
                                            }
                                        }
                                        args.response.success({
                                            data: item,
                                            actionFilter: clusterActionfilter
                                        });
                                    },
                                    error: function (XMLHttpResponse) {
                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                        args.response.error(errorMsg);
                                    }
                                });
                            }
                        }
                    },
                    
                    detailView: {
                        viewAll: {
                            path: '_zone.hosts',
                            label: 'label.hosts'
                        },
                        isMaximized: true,
                        tabFilter: function (args) {
                            var vSwichConfigEnabled, vSwitchPresentOnCluster;
                            $.ajax({
                                url: createURL('listConfigurations'),
                                data: {
                                    name: 'vmware.use.nexus.vswitch'
                                },
                                async: false,
                                success: function (json) {
                                    vSwichConfigEnabled = json.listconfigurationsresponse.configuration[0].value;
                                }
                            });
                            
                            var hypervisorType = args.context.clusters[0].hypervisortype;
                            if (vSwichConfigEnabled != "true" || hypervisorType != 'VMware') {
                                return[ 'nexusVswitch'];
                            }
                            return[];
                        },
                        
                        actions: {
                            
                            edit: {
                                label: 'label.edit',
                                action: function (args) {
                                    var array1 =[];
                                    
                                    $.ajax({
                                        url: createURL("updateCluster&id=" + args.context.clusters[0].id + array1.join("")),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.updateclusterresponse.cluster;
                                            addExtraPropertiesToClusterObject(item);
                                            args.response.success({
                                                actionFilter: clusterActionfilter,
                                                data: item
                                            });
                                        }
                                    });
                                }
                            },
                            
                            enable: {
                                label: 'label.action.enable.cluster',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.enable.cluster';
                                    },
                                    notification: function (args) {
                                        return 'label.action.enable.cluster';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&allocationstate=Enabled"),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.updateclusterresponse.cluster;
                                            args.context.clusters[0].state = item.allocationstate;
                                            addExtraPropertiesToClusterObject(item);
                                            args.response.success({
                                                actionFilter: clusterActionfilter,
                                                data: item
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: function (args) {
                                        args.complete();
                                    }
                                }
                            },
                            
                            disable: {
                                label: 'label.action.disable.cluster',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.disable.cluster';
                                    },
                                    notification: function (args) {
                                        return 'label.action.disable.cluster';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&allocationstate=Disabled"),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.updateclusterresponse.cluster;
                                            args.context.clusters[0].state = item.allocationstate;
                                            addExtraPropertiesToClusterObject(item);
                                            args.response.success({
                                                actionFilter: clusterActionfilter,
                                                data: item
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: function (args) {
                                        args.complete();
                                    }
                                }
                            },
                            
                            dedicate: {
                                label: 'label.dedicate.cluster',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.dedicate.cluster.domain.account';
                                    },
                                    notification: function (args) {
                                        return 'message.cluster.dedicated';
                                    }
                                },
                                createForm: {
                                    title: 'label.dedicate.cluster',
                                    fields: {
                                        domainId: {
                                            label: 'label.domain',
                                            validation: {
                                                required: true
                                            },
                                            select: function (args) {
                                                $.ajax({
                                                    url: createURL("listDomains&listAll=true"),
                                                    dataType: "json",
                                                    async: false,
                                                    success: function (json) {
                                                        var domainObjs = json.listdomainsresponse.domain;
                                                        var items =[];
                                                        
                                                        $(domainObjs).each(function () {
                                                            items.push({
                                                                id: this.id,
                                                                description: this.name
                                                            });
                                                        });
                                                        
                                                        args.response.success({
                                                            data: items
                                                        });
                                                    }
                                                });
                                            }
                                        },
                                        accountId: {
                                            label: 'label.account',
                                            docID: 'helpAccountForDedication',
                                            validation: {
                                                required: false
                                            }
                                        }
                                    }
                                },
                                action: function (args) {
                                    //EXPLICIT DEDICATION
                                    var array2 =[];
                                    if (args.data.accountId != "")
                                    array2.push("&account=" + todb(args.data.accountId));
                                    $.ajax({
                                        url: createURL("dedicateCluster&clusterId=" +
                                        args.context.clusters[0].id +
                                        "&domainId=" + args.data.domainId + array2.join("")),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.dedicateclusterresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getActionFilter: function () {
                                                        return clusterActionfilter;
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            release: {
                                label: 'label.release.dedicated.cluster',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.release.dedicated.cluster';
                                    },
                                    notification: function (args) {
                                        return 'message.cluster.dedication.released';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("releaseDedicatedCluster&clusterid=" + args.context.clusters[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.releasededicatedclusterresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getActionFilter: function () {
                                                        return clusterActionfilter;
                                                    }
                                                }
                                            });
                                        },
                                        error: function (json) {
                                            args.response.error(parseXMLHttpResponse(json));
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            
                            
                            manage: {
                                label: 'label.action.manage.cluster',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.manage.cluster';
                                    },
                                    notification: function (args) {
                                        return 'label.action.manage.cluster';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&managedstate=Managed"),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.updateclusterresponse.cluster;
                                            addExtraPropertiesToClusterObject(item);
                                            args.response.success({
                                                actionFilter: clusterActionfilter,
                                                data: item
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: function (args) {
                                        args.complete();
                                    }
                                }
                            },
                            
                            unmanage: {
                                label: 'label.action.unmanage.cluster',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.unmanage.cluster';
                                    },
                                    notification: function (args) {
                                        return 'label.action.unmanage.cluster';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("updateCluster&id=" + args.context.clusters[0].id + "&managedstate=Unmanaged"),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.updateclusterresponse.cluster;
                                            addExtraPropertiesToClusterObject(item);
                                            args.response.success({
                                                actionFilter: clusterActionfilter,
                                                data: item
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: function (args) {
                                        args.complete();
                                    }
                                }
                            },
                            
                            'remove': {
                                label: 'label.action.delete.cluster',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.delete.cluster';
                                    },
                                    notification: function (args) {
                                        return 'label.action.delete.cluster';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("deleteCluster&id=" + args.context.clusters[0].id),
                                        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'
                                    },
                                    zonename: {
                                        label: 'label.zone'
                                    },
                                    podname: {
                                        label: 'label.pod'
                                    },
                                    hypervisortype: {
                                        label: 'label.hypervisor'
                                    },
                                    clustertype: {
                                        label: 'label.cluster.type'
                                    },
                                    //allocationstate: { label: 'label.allocation.state' },
                                    //managedstate: { label: 'Managed State' },
                                    state: {
                                        label: 'label.state'
                                    }
                                }, {
                                    isdedicated: {
                                        label: 'label.dedicated'
                                    },
                                    domainid: {
                                        label: 'label.domain.id'
                                    }
                                }],
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listClusters&id=" + args.context.clusters[0].id),
                                        dataType: "json",
                                        success: function (json) {
                                            var item = json.listclustersresponse.cluster[0];
                                            addExtraPropertiesToClusterObject(item);
                                            $.ajax({
                                                url: createURL("listDedicatedClusters&clusterid=" + args.context.clusters[0].id),
                                                dataType: "json",
                                                async: false,
                                                success: function (json) {
                                                    if (json.listdedicatedclustersresponse.dedicatedcluster != undefined) {
                                                        var clusterItem = json.listdedicatedclustersresponse.dedicatedcluster[0];
                                                        if (clusterItem.domainid != null) {
                                                            $.extend(item, clusterItem, {
                                                                isdedicated: 'label.yes'
                                                            });
                                                        }
                                                    } else
                                                    $.extend(item, {
                                                        isdedicated: 'label.no'
                                                    })
                                                },
                                                error: function (json) {
                                                    args.response.error(parseXMLHttpResponse(XMLHttpResponse));
                                                }
                                            });
                                            args.response.success({
                                                actionFilter: clusterActionfilter,
                                                data: item
                                            });
                                        },
                                        
                                        error: function (json) {
                                            args.response.error(parseXMLHttpResponse(XMLHttpResponse));
                                        }
                                    });
                                }
                            },
                            nexusVswitch: {
                                title: 'label.nexusVswitch',
                                listView: {
                                    id: 'vSwitches',
                                    fields: {
                                        vsmdeviceid: {
                                            label: 'label.name'
                                        },
                                        vsmdevicestate: {
                                            label: 'label.state',
                                            indicator: {
                                                'Enabled': 'on'
                                            }
                                        }
                                    },
                                    detailView: {
                                        actions: {
                                            enable: {
                                                label: 'label.action.enable.nexusVswitch',
                                                messages: {
                                                    confirm: function (args) {
                                                        return 'message.action.enable.nexusVswitch';
                                                    },
                                                    notification: function (args) {
                                                        return 'label.action.enable.nexusVswitch';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL("enableCiscoNexusVSM&id=" + args.context.vSwitches[0].vsmdeviceid),
                                                        dataType: "json",
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.enablecisconexusvsmresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid
                                                                }
                                                            });
                                                            //args.context.vSwitches[0].vsmdevicestate = item.allocationstate;
                                                            //addExtraPropertiesToClusterObject(item);
                                                            args.response.success({
                                                                actionFilter: nexusActionfilter,
                                                                data: item
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: function (args) {
                                                        args.complete();
                                                    }
                                                }
                                            },
                                            
                                            disable: {
                                                label: 'label.action.disable.nexusVswitch',
                                                messages: {
                                                    confirm: function (args) {
                                                        return 'message.action.disable.nexusVswitch';
                                                    },
                                                    notification: function (args) {
                                                        return 'label.action.disable.nexusVswitch';
                                                    }
                                                },
                                                action: function (args) {
                                                    $.ajax({
                                                        url: createURL("disableCiscoNexusVSM&id=" + args.context.vSwitches[0].vsmdeviceid),
                                                        dataType: "json",
                                                        async: true,
                                                        success: function (json) {
                                                            var jid = json.disablecisconexusvsmresponse.jobid;
                                                            args.response.success({
                                                                _custom: {
                                                                    jobId: jid
                                                                }
                                                            });
                                                            //args.context.vSwitches[0].vsmdevicestate = item.allocationstate;
                                                            //addExtraPropertiesToClusterObject(item);
                                                            args.response.success({
                                                                actionFilter: nexusActionfilter,
                                                                data: item
                                                            });
                                                        }
                                                    });
                                                },
                                                notification: {
                                                    poll: function (args) {
                                                        args.complete();
                                                    }
                                                }
                                            }
                                            
                                            /*   'remove': {
                                            label: 'label.action.delete.nexusVswitch' ,
                                            messages: {
                                            confirm: function(args) {
                                            return 'message.action.delete.nexusVswitch';
                                            },
                                            notification: function(args) {
                                            return 'label.action.delete.nexusVswitch';
                                            }
                                            },
                                            action: function(args) {
                                            $.ajax({
                                            url: createURL("deleteCiscoNexusVSM&id=" + args.context.vSwitches[0].vsmdeviceid),
                                            dataType: "json",
                                            async: true,
                                            success: function(json) {
                                            args.response.success({data:{}});
                                            }
                                            });
                                            },
                                            notification: {
                                            poll: function(args) { args.complete(); }
                                            }
                                            }*/
                                        },
                                        
                                        tabs: {
                                            details: {
                                                title: 'label.details',
                                                fields: {
                                                    vsmdeviceid: {
                                                        label: 'label.name'
                                                    },
                                                    ipaddress: {
                                                        label: 'label.ipaddress'
                                                    },
                                                    vsmctrlvlanid: {
                                                        label: 'label.vsmctrlvlanid'
                                                    },
                                                    vsmpktvlanid: {
                                                        label: 'label.vsmpktvlanid'
                                                    },
                                                    vsmstoragevlanid: {
                                                        label: 'label.vsmstoragevlanid'
                                                    },
                                                    vsmdevicestate: {
                                                        label: 'label.state',
                                                        indicator: {
                                                            'Enabled': 'on'
                                                        }
                                                    }
                                                },
                                                
                                                dataProvider: function (args) {
                                                    $.ajax({
                                                        url: createURL("listCiscoNexusVSMs&clusterid=" + args.context.clusters[0].id),
                                                        dataType: "json",
                                                        success: function (json) {
                                                            var item = json.listcisconexusvsmscmdresponse.cisconexusvsm[0];
                                                            addExtraPropertiesToClusterObject(item);
                                                            args.response.success({
                                                                actionFilter: nexusActionfilter,
                                                                data: item
                                                            });
                                                        },
                                                        error: function (json) {
                                                            args.response.error(parseXMLHttpResponse(json));
                                                        }
                                                    });
                                                }
                                            }
                                        }
                                    },
                                    
                                    dataProvider: function (args) {
                                        $.ajax({
                                            url: createURL("listCiscoNexusVSMs&clusterid=" + args.context.clusters[0].id),
                                            dataType: "json",
                                            success: function (json) {
                                                var item = json.listcisconexusvsmscmdresponse.cisconexusvsm;
                                                args.response.success({
                                                    actionFilter: nexusActionfilter,
                                                    data: item
                                                });
                                            },
                                            error: function (json) {
                                                // Not generally a real error; means vSwitch still needs setup
                                                args.response.success({
                                                    data:[]
                                                });
                                            }
                                        });
                                    }
                                }
                            },
                            
                            // Granular settings for cluster
                            settings: {
                                title: 'label.settings',
                                custom: cloudStack.uiCustom.granularSettings({
                                    dataProvider: function (args) {
                                        $.ajax({
                                            url: createURL('listConfigurations&clusterid=' + args.context.clusters[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 updateClusterLevelParameters
                                            
                                            var data = {
                                                name: args.data.jsonObj.name,
                                                value: args.data.value
                                            };
                                            
                                            $.ajax({
                                                url: createURL('updateConfiguration&clusterid=' + args.context.clusters[0].id),
                                                data: data,
                                                success: function (json) {
                                                    var item = json.updateconfigurationresponse.configuration;
                                                    
                                                    if (args.data.jsonObj.name == 'cpu.overprovisioning.factor' || args.data.jsonObj.name == 'mem.overprovisioning.factor') {
                                                        cloudStack.dialog.notice({
                                                            message: 'Please note - if you are changing the over provisioning factor for a cluster with vms running, please refer to the admin guide to understand the capacity calculation.'
                                                        });
                                                    }
                                                    
                                                    args.response.success({
                                                        data: item
                                                    });
                                                },
                                                
                                                error: function (json) {
                                                    args.response.error(parseXMLHttpResponse(json));
                                                }
                                            });
                                        }
                                    }
                                })
                            }
                        }
                    }
                }
            },
            hosts: {
                title: 'label.hosts',
                id: 'hosts',
                listView: {
                    section: 'hosts',
                    id: 'hosts',
                    fields: {
                        name: {
                            label: 'label.name'
                        },
                        zonename: {
                            label: 'label.zone'
                        },
                        podname: {
                            label: 'label.pod'
                        },
                        clustername: {
                            label: 'label.cluster'
                        },
                        state: {
                            label: 'label.state',
                            indicator: {
                                'Up': 'on',
                                'Down': 'off',
                                'Disconnected': 'off',
                                'Alert': 'off',
                                'Error': 'off'
                            }
                        }
                    },
                    
                    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;
                                }
                            }
                        }
                        
                        if (! args.context.instances) {
                            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);
                        } else {
                            //Instances menu > Instance detailView > View Hosts
                            array1.push("&id=" + args.context.instances[0].hostid);
                        }
                        
                        $.ajax({
                            url: createURL("listHosts&type=Routing" + array1.join("") + "&page=" + args.page + "&pagesize=" + pageSize),
                            dataType: "json",
                            async: true,
                            success: function (json) {
                                var items = json.listhostsresponse.host;
                                args.response.success({
                                    actionFilter: hostActionfilter,
                                    data: items
                                });
                            }
                        });
                    },
                    
                    actions: {
                        add: {
                            label: 'label.add.host',
                            
                            createForm: {
                                title: 'label.add.host',
                                fields: {
                                    zoneid: {
                                        docID: 'helpHostZone',
                                        label: 'label.zone',
                                        validation: {
                                            required: true
                                        },
                                        select: function (args) {
                                            var data = args.context.zones ? {
                                                id: args.context.zones[0].id
                                            }: {
                                                listAll: true
                                            };
                                            
                                            $.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
                                                            };
                                                        })
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    
                                    //always appear (begin)
                                    podId: {
                                        label: 'label.pod',
                                        docID: 'helpHostPod',
                                        validation: {
                                            required: true
                                        },
                                        dependsOn: 'zoneid',
                                        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 () {
                                                        if (("pods" in args.context) && (this.id == args.context.pods[0].id))
                                                        items.unshift({
                                                            id: this.id,
                                                            description: this.name
                                                        }); else
                                                        items.push({
                                                            id: this.id,
                                                            description: this.name
                                                        });
                                                    });
                                                    args.response.success({
                                                        data: items
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    
                                    clusterId: {
                                        label: 'label.cluster',
                                        docID: 'helpHostCluster',
                                        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 () {
                                                        if (("clusters" in args.context) && (this.id == args.context.clusters[0].id))
                                                        items.unshift({
                                                            id: this.id,
                                                            description: this.name
                                                        }); else
                                                        items.push({
                                                            id: this.id,
                                                            description: this.name
                                                        });
                                                    });
                                                    args.response.success({
                                                        data: items
                                                    });
                                                }
                                            });
                                            
                                            args.$select.change(function () {
                                                var $form = $(this).closest('form');
                                                
                                                var clusterId = $(this).val();
                                                if (clusterId == null)
                                                return;
                                                
                                                var items =[];
                                                $(clusterObjs).each(function () {
                                                    if (this.id == clusterId) {
                                                        selectedClusterObj = this;
                                                        return false; //break the $.each() loop
                                                    }
                                                });
                                                if (selectedClusterObj == null)
                                                return;
                                                
                                                if (selectedClusterObj.hypervisortype == "VMware") {
                                                    //$('li[input_group="general"]', $dialogAddHost).hide();
                                                    $form.find('.form-item[rel=hostname]').hide();
                                                    $form.find('.form-item[rel=username]').hide();
                                                    $form.find('.form-item[rel=password]').hide();
                                                    
                                                    //$('li[input_group="vmware"]', $dialogAddHost).show();
                                                    $form.find('.form-item[rel=vcenterHost]').css('display', 'inline-block');
                                                    
                                                    //$('li[input_group="baremetal"]', $dialogAddHost).hide();
                                                    $form.find('.form-item[rel=baremetalCpuCores]').hide();
                                                    $form.find('.form-item[rel=baremetalCpu]').hide();
                                                    $form.find('.form-item[rel=baremetalMemory]').hide();
                                                    $form.find('.form-item[rel=baremetalMAC]').hide();
                                                    
                                                    //$('li[input_group="Ovm"]', $dialogAddHost).hide();
                                                    $form.find('.form-item[rel=agentUsername]').hide();
                                                    $form.find('.form-item[rel=agentPassword]').hide();
                                                } else if (selectedClusterObj.hypervisortype == "BareMetal") {
                                                    //$('li[input_group="general"]', $dialogAddHost).show();
                                                    $form.find('.form-item[rel=hostname]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=username]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=password]').css('display', 'inline-block');
                                                    
                                                    //$('li[input_group="baremetal"]', $dialogAddHost).show();
                                                    $form.find('.form-item[rel=baremetalCpuCores]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=baremetalCpu]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=baremetalMemory]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=baremetalMAC]').css('display', 'inline-block');
                                                    
                                                    //$('li[input_group="vmware"]', $dialogAddHost).hide();
                                                    $form.find('.form-item[rel=vcenterHost]').hide();
                                                    
                                                    //$('li[input_group="Ovm"]', $dialogAddHost).hide();
                                                    $form.find('.form-item[rel=agentUsername]').hide();
                                                    $form.find('.form-item[rel=agentPassword]').hide();
                                                } else if (selectedClusterObj.hypervisortype == "Ovm") {
                                                    //$('li[input_group="general"]', $dialogAddHost).show();
                                                    $form.find('.form-item[rel=hostname]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=username]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=password]').css('display', 'inline-block');
                                                    
                                                    //$('li[input_group="vmware"]', $dialogAddHost).hide();
                                                    $form.find('.form-item[rel=vcenterHost]').hide();
                                                    
                                                    //$('li[input_group="baremetal"]', $dialogAddHost).hide();
                                                    $form.find('.form-item[rel=baremetalCpuCores]').hide();
                                                    $form.find('.form-item[rel=baremetalCpu]').hide();
                                                    $form.find('.form-item[rel=baremetalMemory]').hide();
                                                    $form.find('.form-item[rel=baremetalMAC]').hide();
                                                    
                                                    //$('li[input_group="Ovm"]', $dialogAddHost).show();
                                                    $form.find('.form-item[rel=agentUsername]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=agentUsername]').find('input').val("oracle");
                                                    $form.find('.form-item[rel=agentPassword]').css('display', 'inline-block');
                                                } else {
                                                    //$('li[input_group="general"]', $dialogAddHost).show();
                                                    $form.find('.form-item[rel=hostname]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=username]').css('display', 'inline-block');
                                                    $form.find('.form-item[rel=password]').css('display', 'inline-block');
                                                    
                                                    //$('li[input_group="vmware"]', $dialogAddHost).hide();
                                                    $form.find('.form-item[rel=vcenterHost]').hide();
                                                    
                                                    //$('li[input_group="baremetal"]', $dialogAddHost).hide();
                                                    $form.find('.form-item[rel=baremetalCpuCores]').hide();
                                                    $form.find('.form-item[rel=baremetalCpu]').hide();
                                                    $form.find('.form-item[rel=baremetalMemory]').hide();
                                                    $form.find('.form-item[rel=baremetalMAC]').hide();
                                                    
                                                    //$('li[input_group="Ovm"]', $dialogAddHost).hide();
                                                    $form.find('.form-item[rel=agentUsername]').hide();
                                                    $form.find('.form-item[rel=agentPassword]').hide();
                                                }
                                            });
                                            
                                            args.$select.trigger("change");
                                        }
                                    },
                                    //always appear (end)
                                    
                                    //input_group="general" starts here
                                    hostname: {
                                        label: 'label.host.name',
                                        docID: 'helpHostName',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    
                                    username: {
                                        label: 'label.username',
                                        docID: 'helpHostUsername',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    
                                    password: {
                                        label: 'label.password',
                                        docID: 'helpHostPassword',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true,
                                        isPassword: true
                                    },
                                    
                                    isDedicated: {
                                        label: 'label.dedicate',
                                        isBoolean: true,
                                        isChecked: false,
                                        docID: 'helpDedicateResource'
                                    },
                                    
                                    domainId: {
                                        label: 'label.domain',
                                        isHidden: true,
                                        validation: {
                                            required: true
                                        },
                                        dependsOn: 'isDedicated',
                                        select: function (args) {
                                            $.ajax({
                                                url: createURL("listDomains&listAll=true"),
                                                dataType: "json",
                                                success: function (json) {
                                                    var domainObjs = json.listdomainsresponse.domain;
                                                    var items =[];
                                                    
                                                    $(domainObjs).each(function () {
                                                        items.push({
                                                            id: this.id,
                                                            description: this.name
                                                        });
                                                    });
                                                    
                                                    args.response.success({
                                                        data: items
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    
                                    accountId: {
                                        label: 'label.account',
                                        isHidden: true,
                                        dependsOn: 'isDedicated',
                                        docID: 'helpAccountForDedication',
                                        validation: {
                                            required: false
                                        }
                                    },
                                    
                                    //input_group="general" ends here
                                    
                                    //input_group="VMWare" starts here
                                    vcenterHost: {
                                        label: 'label.esx.host',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    //input_group="VMWare" ends here
                                    
                                    //input_group="BareMetal" starts here
                                    baremetalCpuCores: {
                                        label: 'label.num.cpu.cores',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    baremetalCpu: {
                                        label: 'label.cpu.mhz',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    baremetalMemory: {
                                        label: 'label.memory.mb',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    baremetalMAC: {
                                        label: 'label.host.MAC',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true
                                    },
                                    //input_group="BareMetal" ends here
                                    
                                    //input_group="OVM" starts here
                                    agentUsername: {
                                        label: 'label.agent.username',
                                        validation: {
                                            required: false
                                        },
                                        isHidden: true
                                    },
                                    agentPassword: {
                                        label: 'label.agent.password',
                                        validation: {
                                            required: true
                                        },
                                        isHidden: true,
                                        isPassword: true
                                    },
                                    //input_group="OVM" ends here
                                    
                                    //always appear (begin)
                                    hosttags: {
                                        label: 'label.host.tags',
                                        isTokenInput: true,
                                        docID: 'helpHostTags',
                                        validation: {
                                            required: false
                                        },
                                        dataProvider: function(args) {
                                            $.ajax({
                                                url: createURL("listHostTags"),
                                                dataType: "json",
                                                success: function(json) {
                                                    var item = json.listhosttagsresponse.hosttag;
                                                    var tags = [];

                                                    if (item != null)
                                                    {
                                                        tags = $.map(item, function(tag) {
                                                            return {
                                                                       id: tag.name,
                                                                       name: tag.name
                                                                   };
                                                        });
                                                    }

                                                    args.response.success({
                                                        data: tags,
                                                        hintText: "Type in part of a host tag",
                                                        noResultsText: "No host tags found"
                                                    });
                                                },
                                                error: function(XMLHttpResponse) {
                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);

                                                    args.response.error(errorMsg);
                                                }
                                            });
                                        }
                                    }
                                    //always appear (end)
                                }
                            },
                            
                            action: function (args) {
                                var data = {
                                    zoneid: args.data.zoneid,
                                    podid: args.data.podId,
                                    clusterid: args.data.clusterId,
                                    hypervisor: selectedClusterObj.hypervisortype,
                                    clustertype: selectedClusterObj.clustertype,
                                    hosttags: args.data.hosttags
                                };
                                
                                if (selectedClusterObj.hypervisortype == "VMware") {
                                    $.extend(data, {
                                        username: '',
                                        password: ''
                                    });
                                    
                                    var hostname = args.data.vcenterHost;
                                    var url;
                                    if (hostname.indexOf("http://") == -1)
                                    url = "http://" + hostname; else
                                    url = hostname;
                                    
                                    $.extend(data, {
                                        url: url
                                    });
                                } else {
                                    $.extend(data, {
                                        username: args.data.username,
                                        password: args.data.password
                                    });
                                    
                                    var hostname = args.data.hostname;
                                    var url;
                                    if (hostname.indexOf("http://") == -1)
                                    url = "http://" + hostname; else
                                    url = hostname;
                                    
                                    $.extend(data, {
                                        url: url
                                    });
                                    
                                    if (selectedClusterObj.hypervisortype == "BareMetal") {
                                        $.extend(data, {
                                            cpunumber: args.data.baremetalCpuCores,
                                            cpuspeed: args.data.baremetalCpu,
                                            memory: args.data.baremetalMemory,
                                            hostmac: args.data.baremetalMAC
                                        });
                                    } else if (selectedClusterObj.hypervisortype == "Ovm") {
                                        $.extend(data, {
                                            agentusername: args.data.agentUsername,
                                            agentpassword: args.data.agentPassword
                                        });
                                    }
                                }
                                
                                var hostId = null;
                                $.ajax({
                                    url: createURL("addHost"),
                                    type: "POST",
                                    data: data,
                                    success: function (json) {
                                        var item = json.addhostresponse.host[0];
                                        
                                        hostId = json.addhostresponse.host[0].id;
                                        
                                        //EXPLICIT DEDICATION
                                        var array2 =[];
                                        
                                        if (args.$form.find('.form-item[rel=isDedicated]').find('input[type=checkbox]').is(':Checked') == true) {
                                            if (args.data.accountId != "")
                                            array2.push("&account=" + todb(args.data.accountId));
                                            
                                            
                                            if (hostId != null) {
                                                $.ajax({
                                                    url: createURL("dedicateHost&hostId=" + hostId + "&domainId=" + args.data.domainId + array2.join("")),
                                                    dataType: "json",
                                                    success: function (json) {
                                                        var jid = json.dedicatehostresponse.jobid;
                                                        args.response.success({
                                                            _custom: {
                                                                jobId: jid
                                                            },
                                                            notification: {
                                                                poll: pollAsyncJobResult,
                                                                interval: 4500,
                                                                desc: "Dedicate Host"
                                                            },
                                                            
                                                            data: item
                                                        });
                                                    },
                                                    
                                                    error: function (json) {
                                                        args.response.error(parseXMLHttpResponse(XMLHttpResponse));
                                                    }
                                                });
                                            }
                                        }
                                        args.response.success({
                                            data: item
                                        });
                                    },
                                    
                                    error: function (XMLHttpResponse) {
                                        var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                        args.response.error(errorMsg);
                                    }
                                });
                            },
                            
                            notification: {
                                poll: function (args) {
                                    args.complete({
                                        actionFilter: hostActionfilter
                                    });
                                }
                            },
                            
                            messages: {
                                notification: function (args) {
                                    return 'label.add.host';
                                }
                            }
                        }
                    },
                    detailView: {
                        name: "Host details",
                        viewAll: {
                            label: 'label.instances',
                            path: 'instances'
                        },
                        actions: {
                            edit: {
                                label: 'label.edit',
                                action: function (args) {
                                    var array1 =[];
                                    array1.push("&hosttags=" + todb(args.data.hosttags));
                                    
                                    if (args.data.oscategoryid != null && args.data.oscategoryid.length > 0)
                                    array1.push("&osCategoryId=" + args.data.oscategoryid);
                                    
                                    $.ajax({
                                        url: createURL("updateHost&id=" + args.context.hosts[0].id + array1.join("")),
                                        dataType: "json",
                                        success: function (json) {
                                            var item = json.updatehostresponse.host;
                                            args.response.success({
                                                actionFilter: hostActionfilter,
                                                data: item
                                            });
                                        }
                                    });
                                }
                            },
                            
                            dedicate: {
                                label: 'label.dedicate.host',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.dedicate.host.domain.account';
                                    },
                                    notification: function (args) {
                                        return 'message.host.dedicated';
                                    }
                                },
                                createForm: {
                                    title: 'label.dedicate.host',
                                    fields: {
                                        domainId: {
                                            label: 'label.domain',
                                            validation: {
                                                required: true
                                            },
                                            select: function (args) {
                                                $.ajax({
                                                    url: createURL("listDomains&listAll=true"),
                                                    dataType: "json",
                                                    async: false,
                                                    success: function (json) {
                                                        var domainObjs = json.listdomainsresponse.domain;
                                                        var items =[];
                                                        
                                                        $(domainObjs).each(function () {
                                                            items.push({
                                                                id: this.id,
                                                                description: this.name
                                                            });
                                                        });
                                                        
                                                        args.response.success({
                                                            data: items
                                                        });
                                                    }
                                                });
                                            }
                                        },
                                        accountId: {
                                            label: 'label.account',
                                            docID: 'helpAccountForDedication',
                                            validation: {
                                                required: false
                                            }
                                        }
                                    }
                                },
                                action: function (args) {
                                    //EXPLICIT DEDICATION
                                    var array2 =[];
                                    if (args.data.accountId != "")
                                    array2.push("&account=" + todb(args.data.accountId));
                                    
                                    $.ajax({
                                        url: createURL("dedicateHost&hostId=" +
                                        args.context.hosts[0].id +
                                        "&domainId=" + args.data.domainId + array2.join("")),
                                        dataType: "json",
                                        success: function (json) {
                                            var jid = json.dedicatehostresponse.jobid;
                                            
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getActionFilter: function () {
                                                        return hostActionfilter;
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            release: {
                                label: 'label.release.dedicated.host',
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.release.dedicated.host';
                                    },
                                    notification: function (args) {
                                        return 'message.host.dedication.released';
                                    }
                                },
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("releaseDedicatedHost&hostid=" + args.context.hosts[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.releasededicatedhostresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getActionFilter: function () {
                                                        return hostActionfilter;
                                                    }
                                                }
                                            });
                                        },
                                        error: function (json) {
                                            args.response.error(parseXMLHttpResponse(json));
                                        }
                                    });
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            
                            
                            enableMaintenanceMode: {
                                label: 'label.action.enable.maintenance.mode',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("prepareHostForMaintenance&id=" + args.context.hosts[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.preparehostformaintenanceresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        return json.queryasyncjobresultresponse.jobresult.host;
                                                    },
                                                    getActionFilter: function () {
                                                        return hostActionfilter;
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.host.enable.maintenance.mode';
                                    },
                                    notification: function (args) {
                                        return 'label.action.enable.maintenance.mode';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            
                            cancelMaintenanceMode: {
                                label: 'label.action.cancel.maintenance.mode',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("cancelHostMaintenance&id=" + args.context.hosts[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.cancelhostmaintenanceresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        return json.queryasyncjobresultresponse.jobresult.host;
                                                    },
                                                    getActionFilter: function () {
                                                        return hostActionfilter;
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.action.cancel.maintenance.mode';
                                    },
                                    notification: function (args) {
                                        return 'label.action.cancel.maintenance.mode';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            
                            forceReconnect: {
                                label: 'label.action.force.reconnect',
                                action: function (args) {
                                    $.ajax({
                                        url: createURL("reconnectHost&id=" + args.context.hosts[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jid = json.reconnecthostresponse.jobid;
                                            args.response.success({
                                                _custom: {
                                                    jobId: jid,
                                                    getUpdatedItem: function (json) {
                                                        return json.queryasyncjobresultresponse.jobresult.host;
                                                    },
                                                    getActionFilter: function () {
                                                        return hostActionfilter;
                                                    }
                                                }
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.action.force.reconnect';
                                    },
                                    notification: function (args) {
                                        return 'label.action.force.reconnect';
                                    }
                                },
                                notification: {
                                    poll: pollAsyncJobResult
                                }
                            },
                            
                            enable: {
                                label: 'label.enable.host',
                                action: function (args) {
                                	var data = {
                                     	id: args.context.hosts[0].id,
                                     	allocationstate: "Enable"
                                    };   
                                    $.ajax({
                                        url: createURL("updateHost"),
                                        data: data,
                                        success: function (json) {
                                            var item = json.updatehostresponse.host;
                                            args.response.success({
                                                actionFilter: hostActionfilter,
                                                data: item
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.enable.host';
                                    },
                                    notification: function (args) {
                                        return 'label.enable.host';
                                    }
                                },
                                notification: {
                                    poll: function (args) {
                                        args.complete();
                                    }
                                }
                            },

                            disable: {
                                label: 'label.disable.host',
                                action: function (args) {
                                	var data = {
                                     	id: args.context.hosts[0].id,
                                     	allocationstate: "Disable"
                                    };     
                                    $.ajax({
                                        url: createURL("updateHost"),
                                        data: data,
                                        success: function (json) {
                                            var item = json.updatehostresponse.host;
                                            args.response.success({
                                                actionFilter: hostActionfilter,
                                                data: item
                                            });
                                        }
                                    });
                                },
                                messages: {
                                    confirm: function (args) {
                                        return 'message.confirm.disable.host';
                                    },
                                    notification: function (args) {
                                        return 'label.disable.host';
                                    }
                                },
                                notification: {
                                    poll: function (args) {
                                        args.complete();
                                    }
                                }
                            },
                           
                            'remove': {
                                label: 'label.action.remove.host',
                                messages: {
                                    notification: function (args) {
                                        return 'label.action.remove.host';
                                    }
                                },
                                createForm: {
                                    title: 'label.action.remove.host',
                                    desc: 'message.action.remove.host',
                                    preFilter: function(args) { //bug to fix: preFilter is not picked up from here
                                        if (!isAdmin()) {
                                            args.$form.find('.form-item[rel=isForced]').hide();
                                        }
                                    },
                                    fields: {
                                        isForced: {
                                            label: 'force.remove',
                                            isBoolean: true,
                                            isHidden: false
                                        }
                                    }
                                },
                                action: function (args) {
                                    var data = {
                                    	id: args.context.hosts[0].id
                                    };                                    
                                    if(args.$form.find('.form-item[rel=isForced]').css("display") != "none") {
                                    	$.extend(data, {
                                    		forced: (args.data.isForced == "on")
                                    	});                                    	
                                    }
                                    
                                    $.ajax({
                                        url: createURL("deleteHost"),
                                        data: data,
                                        success: function (json) {
                                            //{ "deletehostresponse" : { "success" : "true"}  }
                                            args.response.success({
                                                data: {
                                                }
                                            });
                                            
                                            if (args.context.hosts[0].hypervisor == "XenServer"){
                                            	cloudStack.dialog.notice({ message: _s("The host has been deleted. Please eject the host from XenServer Pool") })
                                            }                                            
                                        }
                                    });
                                },
                                notification: {
                                    poll: function (args) {
                                        args.complete();
                                    }
                                }
                            }
                        },
                        tabFilter: function (args) {
                            var hiddenTabs =[];
                            if (args.context.hosts[0].gpugroup == null) {
                                hiddenTabs.push("gpu");
                            }
                            return hiddenTabs;
                        },
                        tabs: {
                            details: {
                                title: 'label.details',
                                
                                preFilter: function (args) {
                                    var hiddenFields =[];
                                    $.ajax({
                                        url: createURL('listConfigurations&name=ha.tag'),
                                        dataType: 'json',
                                        async: false,
                                        success: function (json) {
                                            if (json.listconfigurationsresponse.configuration == null || json.listconfigurationsresponse.configuration[0].value == null || json.listconfigurationsresponse.configuration[0].value.length == 0) {
                                                hiddenFields.push('hahost');
                                            }
                                        }
                                    });
                                    return hiddenFields;
                                },
                                
                                fields:[ {
                                    name: {
                                        label: 'label.name'
                                    }
                                },
                                {
                                    id: {
                                        label: 'label.id'
                                    },
                                    resourcestate: {
                                        label: 'label.resource.state'
                                    },
                                    state: {
                                        label: 'label.state'
                                    },
                                    type: {
                                        label: 'label.type'
                                    },
                                    hypervisor: {
                                        label: 'label.hypervisor'
                                    },
                                    hypervisorversion: {
                                        label: 'label.hypervisor.version'
                                    },
                                    hosttags: {
                                        label: 'label.host.tags',
                                        isEditable: true,
                                        isTokenInput: true,
                                        dataProvider: function(args) {
                                            $.ajax({
                                                url: createURL("listHostTags"),
                                                dataType: "json",
                                                success: function(json) {
                                                    var item = json.listhosttagsresponse.hosttag;
                                                    var tags = [];

                                                    if (item != null)
                                                    {
                                                        tags = $.map(item, function(tag) {
                                                            return {
                                                                       id: tag.name,
                                                                       name: tag.name
                                                                   };
                                                        });
                                                    }

                                                    args.response.success({
                                                        data: tags,
                                                        hintText: "Type in part of a host tag",
                                                        noResultsText: "No host tags found"
                                                    });
                                                },
                                                error: function(XMLHttpResponse) {
                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);

                                                    args.response.error(errorMsg);
                                                }
                                            });
                                        }
                                    },
                                    hahost: {
                                        label: 'label.ha.enabled',
                                        converter: cloudStack.converters.toBooleanText
                                    },
                                    oscategoryid: {
                                        label: 'label.os.preference',
                                        isEditable: true,
                                        select: function (args) {
                                            $.ajax({
                                                url: createURL("listOsCategories"),
                                                dataType: "json",
                                                async: true,
                                                success: function (json) {
                                                    var oscategoryObjs = json.listoscategoriesresponse.oscategory;
                                                    var items =[ {
                                                        id: '',
                                                        description: _l('')
                                                    }];
                                                    $(oscategoryObjs).each(function () {
                                                        items.push({
                                                            id: this.id,
                                                            description: this.name
                                                        });
                                                    });
                                                    args.response.success({
                                                        data: items
                                                    });
                                                }
                                            });
                                        }
                                    },
                                    zonename: {
                                        label: 'label.zone'
                                    },
                                    podname: {
                                        label: 'label.pod'
                                    },
                                    clustername: {
                                        label: 'label.cluster'
                                    },
                                    ipaddress: {
                                        label: 'label.ip.address'
                                    },
                                    disconnected: {
                                        label: 'label.last.disconnected'
                                        },
                                        cpusockets: {
                                        	label: 'label.number.of.cpu.sockets'
                                    }
                                }, {
                                    
                                    isdedicated: {
                                        label: 'label.dedicated'
                                    },
                                    domainid: {
                                        label: 'label.domain.id'
                                    }
                                }],
                                
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listHosts&id=" + args.context.hosts[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var item = json.listhostsresponse.host[0];
                                            $.ajax({
                                                url: createURL("listDedicatedHosts&hostid=" + args.context.hosts[0].id),
                                                dataType: "json",
                                                async: false,
                                                success: function (json) {
                                                    if (json.listdedicatedhostsresponse.dedicatedhost != undefined) {
                                                        var hostItem = json.listdedicatedhostsresponse.dedicatedhost[0];
                                                        if (hostItem.domainid != null) {
                                                            $.extend(item, hostItem, {
                                                                isdedicated: _l('label.yes')
                                                            });
                                                        }
                                                    } else
                                                    $.extend(item, {
                                                        isdedicated: _l('label.no')
                                                    })
                                                },
                                                error: function (json) {
                                                    args.response.error(parseXMLHttpResponse(XMLHttpResponse));
                                                }
                                            });
                                            args.response.success({
                                                actionFilter: hostActionfilter,
                                                data: item
                                            });
                                        }
                                    });
                                }
                            },
                            
                            stats: {
                                title: 'label.statistics',
                                fields: {
                                    totalCPU: {
                                        label: 'label.total.cpu'
                                    },
                                    cpuused: {
                                        label: 'label.cpu.utilized'
                                    },
                                    cpuallocated: {
                                        label: 'label.cpu.allocated.for.VMs'
                                    },
                                    memorytotal: {
                                        label: 'label.memory.total'
                                    },
                                    memoryallocated: {
                                        label: 'label.memory.allocated'
                                    },
                                    memoryused: {
                                        label: 'label.memory.used'
                                    },
                                    networkkbsread: {
                                        label: 'label.network.read'
                                    },
                                    networkkbswrite: {
                                        label: 'label.network.write'
                                    }
                                },
                                dataProvider: function (args) {
                                    $.ajax({
                                        url: createURL("listHosts&id=" + args.context.hosts[0].id),
                                        dataType: "json",
                                        async: true,
                                        success: function (json) {
                                            var jsonObj = json.listhostsresponse.host[0];
                                            args.response.success({
                                                data: {
                                                    totalCPU: jsonObj.cpunumber + " x " + cloudStack.converters.convertHz(jsonObj.cpuspeed),
                                                    cpuused: jsonObj.cpuused,
                                                    cpuallocated: (jsonObj.cpuallocated == null || jsonObj.cpuallocated == 0) ? "N/A": jsonObj.cpuallocated,
                                                    memorytotal: (jsonObj.memorytotal == null || jsonObj.memorytotal == 0) ? "N/A": cloudStack.converters.convertBytes(jsonObj.memorytotal),
                                                    memoryallocated: (jsonObj.memoryallocated == null || jsonObj.memoryallocated == 0) ? "N/A": cloudStack.converters.convertBytes(jsonObj.memoryallocated),
                                                    memoryused: (jsonObj.memoryused == null || jsonObj.memoryused == 0) ? "N/A": cloudStack.converters.convertBytes(jsonObj.memoryused),
                                                    networkkbsread: (jsonObj.networkkbsread == null) ? "N/A": cloudStack.converters.convertBytes(jsonObj.networkkbsread * 1024),
                                                    networkkbswrite: (jsonObj.networkkbswrite == null) ? "N/A": cloudStack.converters.convertBytes(jsonObj.networkkbswrite * 1024)
                                                }
                                            });
                                        }
                                    });
                                }
                            },
                            gpu: {
                                title: 'label.gpu',
                                custom: function (args) {
                                    var gpugroups = null;
                                    $.ajax({
                                        url: createURL("listHosts&id=" + args.context.hosts[0].id),
                                        dataType: "json",
                                        async: false,
                                        success: function (json) {
                                            var item = json.listhostsresponse.host[0];
                                            if (item != null && item.gpugroup != null)
                                                gpugroups = item.gpugroup;
                                        }
                                    });

                                    var $tabcontent = $('<div>').addClass('gpugroups');

                                    $(gpugroups).each(function() {
                                        var gpugroupObj = this;

                                        var $groupcontainer = $('<div>').addClass('gpugroup-container');

                                        //group name
                                        $groupcontainer.append($('<div>').addClass('title')
                                                            .append($('<span>').html(gpugroupObj.gpugroupname)));
                                        //vgpu details
                                        var $groupdetails = $('<div>').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 = gpugroupObj.vgpu.sort(function(a, b) {
                                                        return a.maxvgpuperpgpu >= b.maxvgpuperpgpu;
                                                    });
                                                    $(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
                        },
                        clustername: {
                            label: 'label.cluster',
                            truncate: true
                        },
                        scope: {
                            label: 'label.scope'
                        }
                    },
                    
                    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
                                            }: {
                                                listAll: true
                                            };
                                            
                                            $.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"
                                                });
                                                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
                                                });
                                            } 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',
                                        docID: 'helpPrimaryStorageZone',
                                        validation: {
                                            required: true
                                        },
                                        select: function (args) {
                                            var data = args.context.providers ?
                                                { id: args.context.providers[0].id } :
                                                { listAll: true };

                                            $.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: '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: "Type in part of a storage tag",
                                                        noResultsText: "No storage tags found"
                                                    });
                                                },
                                                error: function(XMLHttpResponse) {
                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);

                                                    args.response.error(errorMsg);
                                                }
                                            });
                                        }
                                    }
                                    //always appear (end)
                                }
                            },
                            
                            /******************************/
                            action: function (args) {
                                var array1 =[];
                                array1.push("&scope=" + todb(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=" + todb(args.data.name));

                                array1.push("&provider=" + todb(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=" + todb(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=" + todb(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=" + todb(args.data.url));
                                    }
                                }

                                if (args.data.storageTags != null && args.data.storageTags.length > 0)
                                {
                                    array1.push("&tags=" + todb(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';
                                }
                            }
                        }
                    },
                    
                    detailView: {
                        name: "Primary storage details",
                        isMaximized: true,
                        actions: {
                            edit: {
                                label: 'label.edit',
                                action: function (args) {
                                    var array1 =[];
                                    array1.push("&tags=" + todb(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: "Type in part of a storage tag",
                                                        noResultsText: "No storage tags found"
                                                    });
                                                },
                                                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;
                                        }
                                    }
                                }],
                                
                                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) {
                                                        //for testing only (begin)
                                                        /*
                                                        json = {
                                                        "refreshucsbladesresponse": {
                                                        "count": 7,
                                                        "ucsblade": [
                                                        {
                                                        "id": "6c6a2d2c-575e-41ac-9782-eee51b0b80f8",
                                                        "ucsmanagerid": "9a34c186-12fa-4bbc-af04-5f1a2bf7ae4a",
                                                        "bladedn": "sys/chassis-1/blade-5"
                                                        },
                                                        {
                                                        "id": "d371d470-a51f-489c-aded-54a63dfd76c7",
                                                        "ucsmanagerid": "9a34c186-12fa-4bbc-af04-5f1a2bf7ae4a",
                                                        "bladedn": "sys/chassis-1/blade-6"
                                                        },
                                                        {
                                                        "id": "c0f64591-4a80-4083-bb7b-576220b436a2",
                                                        "ucsmanagerid": "9a34c186-12fa-4bbc-af04-5f1a2bf7ae4a",
                                                        "bladedn": "sys/chassis-1/blade-7"
                                                        },
                                                        {
                                                        "id": "74b9b69a-cb16-42f5-aad6-06391ebdd759",
                                                        "ucsmanagerid": "9a34c186-12fa-4bbc-af04-5f1a2bf7ae4a",
                                                        "bladedn": "sys/chassis-1/blade-1"
                                                        },
                                                        {
                                                        "id": "713a5adb-0136-484f-9acb-d9203af497be",
                                                        "ucsmanagerid": "9a34c186-12fa-4bbc-af04-5f1a2bf7ae4a",
                                                        "bladedn": "sys/chassis-1/blade-2"
                                                        },
                                                        {
                                                        "id": "da633578-21cb-4678-9eb4-981a53198b41",
                                                        "ucsmanagerid": "9a34c186-12fa-4bbc-af04-5f1a2bf7ae4a",
                                                        "bladedn": "sys/chassis-1/blade-4"
                                                        },
                                                        {
                                                        "id": "3d491c6e-f0b6-40b0-bf6e-f89efdd73c30",
                                                        "ucsmanagerid": "9a34c186-12fa-4bbc-af04-5f1a2bf7ae4a",
                                                        "bladedn": "sys/chassis-1/blade-3"
                                                        }
                                                        ]
                                                        }
                                                        };
                                                         */
                                                        //for testing only (end)
                                                        
                                                        /*
                                                        var item = json.refreshucsbladesresponse.ucsblade[0];
                                                        addExtraPropertiesToUcsBladeObject(item);
                                                        args.response.success({
                                                        data: item
                                                        });
                                                         */
                                                        $(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'
                                },
                                protocol: {
                                    label: 'label.protocol'
                                }
                            },
                            
                            
                            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 (e.g. Provider "NetApp" is not 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();
                                                        } 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();
                                                        } 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();
                                                        } 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');
                                                        }
                                                    });
                                                    
                                                    args.$select.change();
                                                }
                                            },
                                            
                                            
                                            //NFS, SMB (begin)
                                            zoneid: {
                                                label: 'label.zone',
                                                docID: 'helpSecondaryStorageZone',
                                                validation: {
                                                    required: true
                                                },
                                                select: function (args) {
                                                    $.ajax({
                                                        url: createURL('listZones'),
                                                        data: {
                                                            listAll: true
                                                        },
                                                        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: {
                                                            listAll: true
                                                        },
                                                        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'
                                            },
                                            username: {
                                                label: 'label.username'
                                            },
                                            key: {
                                                label: 'label.key'
                                            }
                                            //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++;
                                            }
                                            $.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'
                                            },
                                            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("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 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();
                                    }
                                    }
                                    })
                                    } */
                                }
                            }
                        }
                    },
                    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: {
                                                            listAll: true
                                                        },
                                                        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'
                        }
                    },
                    
                    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;
                            }
                        }
                    });
                }
            });
        }
    }
    
    function addExternalLoadBalancer(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
        var array1 =[];
        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
        array1.push("&username=" + todb(args.data.username));
        array1.push("&password=" + todb(args.data.password));
        array1.push("&networkdevicetype=" + todb(args.data.networkdevicetype));
        
        if (apiCmd == "addNetscalerLoadBalancer") {
            array1.push("&gslbprovider=" + (args.data.gslbprovider == "on"));
            array1.push("&gslbproviderpublicip=" + todb(args.data.gslbproviderpublicip));
            array1.push("&gslbproviderprivateip=" + todb(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=" + todb(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);
        array1.push("&username=" + todb(args.data.username));
        array1.push("&password=" + todb(args.data.password));
        array1.push("&networkdevicetype=" + todb(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=" + todb(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);
        array1.push("&username=" + todb(args.data.username));
        array1.push("&password=" + todb(args.data.password));
        array1.push("&hostname=" + todb(args.data.host));
        array1.push("&transportzoneuuid=" + todb(args.data.transportzoneuuid));
        
        var l3GatewayServiceUuid = args.data.l3gatewayserviceuuid;
        if (l3GatewayServiceUuid != null && l3GatewayServiceUuid.length > 0) {
            array1.push("&l3gatewayserviceuuid=" + todb(args.data.l3gatewayserviceuuid));
        }
        
        $.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);
        array1.push("&username=" + todb(args.data.username));
        array1.push("&password=" + todb(args.data.password));
        array1.push("&hostname=" + todb(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);
        array1.push("&username=" + todb(args.data.username));
        array1.push("&password=" + todb(args.data.password));
        array1.push("&url=" + todb(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 addBigSwitchVnsDevice(args, physicalNetworkObj, apiCmd, apiCmdRes, apiCmdObj) {
        var array1 =[];
        array1.push("&physicalnetworkid=" + physicalNetworkObj.id);
        array1.push("&hostname=" + todb(args.data.host));
        
        $.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=" + todb(args.data.hostname));
        array1.push("&username=" + todb(args.data.username));
        array1.push("&password=" + todb(args.data.password));
        array1.push("&port=" + todb(args.data.port));
        array1.push("&apiversion=" + todb(args.data.apiversion));
        array1.push("&retrycount=" + todb(args.data.retrycount));
        array1.push("&retryinterval=" + todb(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);
        array1.push("&username=" + todb(args.data.username));
        array1.push("&password=" + todb(args.data.password));
        array1.push("&url=" + todb(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) {
                                                                                                                                        //create pod
                                                                                                                                        var array3 =[];
                                                                                                                                        array3.push("&zoneId=" + newZoneObj.id);
                                                                                                                                        array3.push("&name=" + todb(args.data.podName));
                                                                                                                                        array3.push("&gateway=" + todb(args.data.podGateway));
                                                                                                                                        array3.push("&netmask=" + todb(args.data.podNetmask));
                                                                                                                                        array3.push("&startIp=" + todb(args.data.podStartIp));
                                                                                                                                        
                                                                                                                                        var endip = args.data.podEndIp; //optional
                                                                                                                                        if (endip != null && endip.length > 0)
                                                                                                                                        array3.push("&endIp=" + todb(endip));
                                                                                                                                        
                                                                                                                                        $.ajax({
                                                                                                                                            url: createURL("createPod" + array3.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) {
                                                                                                            //create pod
                                                                                                            var array3 =[];
                                                                                                            array3.push("&zoneId=" + newZoneObj.id);
                                                                                                            array3.push("&name=" + todb(args.data.podName));
                                                                                                            array3.push("&gateway=" + todb(args.data.podGateway));
                                                                                                            array3.push("&netmask=" + todb(args.data.podNetmask));
                                                                                                            array3.push("&startIp=" + todb(args.data.podStartIp));
                                                                                                            
                                                                                                            var endip = args.data.podEndIp; //optional
                                                                                                            if (endip != null && endip.length > 0)
                                                                                                            array3.push("&endIp=" + todb(endip));
                                                                                                            
                                                                                                            $.ajax({
                                                                                                                url: createURL("createPod" + array3.join("")),
                                                                                                                dataType: "json",
                                                                                                                async: false,
                                                                                                                success: function (json) {
                                                                                                                },
                                                                                                                error: function (XMLHttpResponse) {
                                                                                                                    var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
                                                                                                                    alert("createPod failed. Error: " + errorMsg);
                                                                                                                }
                                                                                                            });
                                                                                                        }
                                                                                                    });
                                                                                                }
                                                                                            } else {
                                                                                                //Advanced zone
                                                                                                //create pod
                                                                                                var array3 =[];
                                                                                                array3.push("&zoneId=" + newZoneObj.id);
                                                                                                array3.push("&name=" + todb(args.data.podName));
                                                                                                array3.push("&gateway=" + todb(args.data.podGateway));
                                                                                                array3.push("&netmask=" + todb(args.data.podNetmask));
                                                                                                array3.push("&startIp=" + todb(args.data.podStartIp));
                                                                                                
                                                                                                var endip = args.data.podEndIp; //optional
                                                                                                if (endip != null && endip.length > 0)
                                                                                                array3.push("&endIp=" + todb(endip));
                                                                                                
                                                                                                $.ajax({
                                                                                                    url: createURL("createPod" + array3.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 = 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");
        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");
        
        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");
        } 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");
        }
        
        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 XenServer, VMware support scaleUp(change service offering)
            if (jsonObj.hypervisor == 'XenServer' || jsonObj.hypervisor == "VMware") {
                allowedActions.push("scaleUp");
            }                         
            
            allowedActions.push("restart");
            
            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 XenServer, VMware support scaleUp(change service offering)
            if (jsonObj.hypervisor == 'XenServer' ||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 (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 "MidoNet":
                            nspMap[ "midoNet"] = 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 "BigSwitchVns":
                            nspMap[ "bigswitchVns"] = 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;
                        }
                    }
                }
            }
        });
        
        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: 'bigswitchVns',
            name: 'BigSwitch Vns',
            state: nspMap.bigswitchVns ? nspMap.bigswitchVns.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: 'midoNet',
                name: 'MidoNet',
                state: nspMap.midoNet ? nspMap.midoNet.state: 'Disabled'
            });

            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'
            });
            
            //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);
