text: function AccessoryManagement(opts) {
  	var options = opts;
  
  	var elements = {
  		activeId: $('#activeId'),
  		accessoryList: $('#accessoriesTable'),
  
  		addUnlimited: $('#chkUnlimitedAdd'),
  		addQuantity: $('#addQuantity'),
  		
  		editName: $('#editName'),
  		editUnlimited: $('#chkUnlimitedEdit'),
  		editQuantity: $('#editQuantity'),
  		
  		editDialog: $('#editDialog'),
  		deleteDialog: $('#deleteDialog'),
  		accessoryResourcesDialog: $('#accessoryResourcesDialog'),
  
  		addForm: $('#addForm'),
  		form: $('#editForm'),
  		deleteForm: $('#deleteForm'),
  		accessoryResourcesForm: $('#accessoryResourcesForm')
  	};
  
  	var accessories = new Object();
  
  	AccessoryManagement.prototype.init = function() {
  
  		elements.accessoryList.delegate('a.update', 'click', function(e) {
  			setActiveId($(this));
  			e.preventDefault();
  		});
  
  		elements.accessoryList.delegate('.edit', 'click', function() {
  			editAccessory();
  		});
  
  		elements.accessoryList.delegate('.delete', 'click', function() {
  			deleteAccessory();
  		});
  
  		elements.accessoryList.delegate('.resources', 'click', function() {
  			showAccessoryResources();
  		});
  
  		$(".save").click(function() {
  			$(this).closest('form').submit();
  		});
  
  		$(".cancel").click(function() {
  			$(this).closest('.dialog').dialog("close");
  		});
  
  
  		elements.accessoryResourcesDialog.delegate('.resourceCheckbox', 'click', function() {
  			handleAccessoryResourceClick($(this));
  		});
  
  		ConfigureAsyncForm(elements.addForm, getSubmitCallback(options.actions.add));
  		ConfigureAsyncForm(elements.deleteForm, getSubmitCallback(options.actions.deleteAccessory));
  		ConfigureAsyncForm(elements.form, getSubmitCallback(options.actions.edit));
  		ConfigureAsyncForm(elements.accessoryResourcesForm, defaultSubmitCallback);
  
  		WireUpUnlimited(elements.addUnlimited, elements.addQuantity);
  		WireUpUnlimited(elements.editUnlimited, elements.editQuantity);
  	};
  
  	var getSubmitCallback = function(action) {
  		return function() {
  			return options.submitUrl + "?aid=" + getActiveId() + "&action=" + action;
  		};
  	};
  
  	var defaultSubmitCallback = function (form)
  	{
  		return options.submitUrl + "?aid=" + getActiveId() + "&action=" + form.attr('ajaxAction');
  	};
  
  	function setActiveId(activeElement) {
  		var id = activeElement.closest('tr').attr('data-accessory-id');
  		elements.activeId.val(id);
  	}
  
  	function getActiveId() {
  		return elements.activeId.val();
  	}
  
  	var editAccessory = function() {
  		var accessory = getActiveAccessory();
  		elements.editName.val(accessory.name);
  		elements.editQuantity.val(accessory.quantity);
  
  		if (accessory.quantity == '')
  		{
  			elements.editUnlimited.prop('checked', true);
  		}
  		else
  		{
  			elements.editUnlimited.prop('checked', false);
  		}
  
  		elements.editUnlimited.trigger('change');
  		elements.editDialog.modal('show');
  	};
  
  	function handleAccessoryResourceClick(checkbox)
  	{
  		var quantities = checkbox.closest('div[resource-id]').find('.quantities');
  
  		if (checkbox.is(':checked'))
  		{
  			quantities.removeClass('no-show');
  		}
  		else
  		{
  			quantities.addClass('no-show');
  		}
  	}
  
  	var showAccessoryResources = function()
  	{
  		var accessory = getActiveAccessory();
  
  		$.get(opts.submitUrl + '?dr=accessoryResources&aid=' + accessory.id, function(data)
  		{
  			elements.accessoryResourcesDialog.find(':checkbox').prop('checked', false);
  			elements.accessoryResourcesDialog.find('.hidden').hide();
  
  			$.each(data, function(idx, resource){
  				var div = elements.accessoryResourcesDialog.find('[resource-id="' + resource.ResourceId + '"]');
  				var checkbox = div.find(':checkbox');
  				checkbox.prop('checked', true);
  				handleAccessoryResourceClick(checkbox);
  
  				div.find('[data-type="min-quantity"]').val(resource.MinQuantity);
  				div.find('[data-type="max-quantity"]').val(resource.MaxQuantity);
  			});
  			elements.accessoryResourcesDialog.find('.resourcesDialogLabel').val(accessory.name + ' (' + accessory.quantity + ')');
  			elements.accessoryResourcesDialog.modal('show');
  		});
  	};
  
  	var deleteAccessory = function() {
  		elements.deleteDialog.modal('show');
  	};
  
  	var getActiveAccessory = function ()
  	{
  		return accessories[getActiveId()];
  	};
  
  	var WireUpUnlimited = function(checkbox, quantity)
  	{
  		checkbox.change(function(){
  			if (checkbox.is(":checked"))
  			{
  				quantity.val('');
  				quantity.attr('disabled', 'disabled');
  			}
  			else
  			{
  				quantity.removeAttr('disabled');
  			}
  		});
  	};
  
  	AccessoryManagement.prototype.addAccessory = function(id, name, quantity)
  	{
  		accessories[id] = {id: id, name: name, quantity: quantity};
  	};
  }