').addClass('main-desc').append(
                        $('
').html(_l('message.select.affinity.groups'))
                      )
                    );
                    $step.find('.select-container').append(
                      makeSelects(
                        'affinity-groups', 
                        args.data.affinityGroups, 
                        {
                          name: 'name',
                          desc: 'description',
                          id: 'id'
                        }, 
                        {
                          type: 'checkbox',
                          'wizard-field': 'affinity-groups'
                        },
                        args.data.selectedObj
                      )
                    ); 
                  } else {
                    $step.find('.select-container').append($('
').html(_l('message.no.affinity.groups')));
                  }
                }
              }
            };
          },
          'network': function($step, formData) {
            var showAddNetwork = true;
            var checkShowAddNetwork = function($newNetwork) {
              if (!showAddNetwork) {
                $newNetwork.hide();
              } else {
                $newNetwork.show();
              }
            };
            var originalValues = function(formData) {
              // Default networks
              $step.find('input[type=radio]').filter(function() {
                return $(this).val() == formData['defaultNetwork'];
              }).click();
              // Optional networks
              var selectedOptionalNetworks = [];
              if ($.isArray(formData['shared-networks']) != -1) {
                $(formData['shared-networks']).each(function() {
                  selectedOptionalNetworks.push(this);
                });
              } else {
                selectedOptionalNetworks.push(formData['shared-networks']);
              }
              var $checkboxes = $step.find('input[name=shared-networks]');
              $(selectedOptionalNetworks).each(function() {
                var networkID = this;
                $checkboxes.filter(function() {
                  return $(this).val() == networkID;
                }).attr('checked', 'checked');
              });
            };
            var $newNetwork = $step.find('.new-network');
            var $newNetworkCheckbox = $newNetwork.find('input[type=checkbox]');
            // Setup new network field
            $newNetworkCheckbox.unbind('click');
            $newNetworkCheckbox.click(function() {
              $newNetwork.toggleClass('unselected');
              // Select another default if hiding field
              if ($newNetwork.hasClass('unselected')) {
                $step.find('input[type=radio]:visible:first').click();
              } else {
                $newNetwork.find('input[type=radio]').click();
              }
            });
            setTimeout(function() {
              var $checkbox = $step.find('.new-network input[type=checkbox]');
              var $newNetwork = $checkbox.closest('.new-network');
              if ($step.find('.select.my-networks .select-container .select:visible').size()) {
                $checkbox.attr('checked', false);
                $newNetwork.addClass('unselected');
              } else {
                $newNetwork.find('input[name=defaultNetwork]').filter('[value=new-network]').click();
              }
              $checkbox.change();
            });
            // Show relevant conditional sub-step if present
            $step.find('.wizard-step-conditional').hide();
            if ($.isFunction(args.showAddNetwork)) {
              showAddNetwork = args.showAddNetwork({
                data: formData,
                context: context
              });
            }
            // Filter network list by VPC ID
            var filterNetworkList = function(vpcID) {
              var $selects = $step.find('.my-networks .select-container .select');
              var $visibleSelects = $($.grep($selects, function(select) {
                var $select = $(select);
                
                return args.vpcFilter($select.data('json-obj'), vpcID);
              }));
              var $addNetworkForm = $step.find('.select.new-network');
              var $addNewNetworkCheck = $addNetworkForm.find('input[name=new-network]');
              // VPC networks cannot be created via instance wizard
              if (vpcID != -1) {
                $step.find('.my-networks .select-container').addClass('single-select');
                $addNetworkForm.hide();
                if ($addNewNetworkCheck.is(':checked')) {
                  $addNewNetworkCheck.click();
                  $addNewNetworkCheck.attr('checked', false);
                }
              } else {
                $step.find('.my-networks .select-container').removeClass('single-select');
                $addNetworkForm.show();
                checkShowAddNetwork($addNetworkForm);
              }
              
              $selects.find('input[type=checkbox]').attr('checked', false);
              $selects.hide();
              $visibleSelects.show();
              // Select first visible item by default
              $visibleSelects.filter(':first')
                .find('input[type=radio]')
                .click();
              cloudStack.evenOdd($visibleSelects, 'div.select', {
                even: function($elem) {
                  $elem.removeClass('odd');
                  $elem.addClass('even');
                },
                odd: function($elem) {
                  $elem.removeClass('even');
                  $elem.addClass('odd');
                }
              });
            };
            var $vpcSelect = $step.find('select[name=vpc-filter]');
            $vpcSelect.unbind('change');
            $vpcSelect.change(function() {
              filterNetworkList($vpcSelect.val());
            });
            return {
              response: {
                success: function(args) {
                  var vpcs = args.data.vpcs;
                  var addClass = args.addClass;
                  var removeClass = args.removeClass;
                  // Populate VPC drop-down
                  $vpcSelect.html('');
                  $(vpcs).map(function(index, vpc) {
                    var $option = $('');
                    var id = vpc.id;
                    var description = vpc.name;
                    $option.attr('value', id);
                    $option.html(description);
                    $option.appendTo($vpcSelect);
                  });
                  // 'No VPC' option
                  $(' ').attr('value', '-1').html(_l('ui.listView.filters.all')).prependTo($vpcSelect);
                  $vpcSelect.val(-1);
                  
                  // Populate network offering drop-down
                  $(args.data.networkOfferings).each(function() {
                    $(' ')
                      .val(this.id)
                      .html(this.name)
                      .appendTo($newNetwork.find('select'));
                  });
                  if (args.type) {
                    $step.find('.wizard-step-conditional').filter(function() {
                      return $(this).hasClass(args.type);
                    }).show();
                  } else {
                    $step.find('.select-network').show();
                  }
                  // My networks
                  $step.find('.my-networks .select-container').append(
                    makeSelects('my-networks', args.data.networkObjs, {
                      name: 'name',
                      desc: 'type',
                      id: 'id'
                    }, {
                      type: 'checkbox',
                      'wizard-field': 'my-networks',
                      secondary: {
                        desc: 'Default',
                        name: 'defaultNetwork',
                        type: 'radio',
                        'wizard-field': 'default-network'
                      }
                    })
                  );
                  // Show non-VPC networks by default
                  filterNetworkList(-1);
                  // Security groups (alt. page)
                  $step.find('.security-groups .select-container').append(
                    makeSelects('security-groups', args.data.securityGroups, {
                      name: 'name',
                      desc: 'description',
                      id: 'id'
                    }, {
                      type: 'checkbox',
                      'wizard-field': 'security-groups'
                    })
                  );
                  originalValues(formData);
                  checkShowAddNetwork($newNetwork);
                }
              }
            };
          },
          'review': function($step, formData) {
            $step.find('[wizard-field]').each(function() {
              var field = $(this).attr('wizard-field');
              var fieldName;
              var $input = $wizard.find('[wizard-field=' + field + ']').filter(function() {
                return ($(this).is(':selected') ||
                        $(this).is(':checked') ||
                        $(this).attr('type') == 'hidden') &&
                  $(this).is(':not(:disabled)');
              });
              if ($input.is('option')) {
                fieldName = $input.html();
              } else if ($input.is('input[type=radio]')) {
                // Choosen New network as default
                if ($input.parents('div.new-network').size()) {
                  fieldName = $input.closest('div.new-network').find('input[name="new-network-name"]').val();
                  // Choosen Network from existed
                } else if ($input.parents('div.my-networks').size()) {
                  fieldName = $input.closest('div.select').find('.select-desc .name').html();
                } else {
                  fieldName = $input.parent().find('.select-desc .name').html();
                }
              } else if ($input.eq(0).is('input[type=checkbox]')) {
                fieldName = '';
                $input.each(function(index) {
                  if (index != 0) fieldName += '