function AllSKUs() {
	this.SKUs = new Array();
	this.OptionsSelected = new Array();
	this.AccessoryOptions = "";
	this.AddSKU = AddSKU;
	this.BuildAccessoryList_old = BuildAccessoryList_old;
	this.DisplayAccessories = DisplayAccessories;
	this.SetDefaultItems = SetDefaultItems;
	this.FindOptionId = FindOptionId;
	this.SetOptionSelected = SetOptionSelected; 
	this.UnsetOptionSelected = UnsetOptionSelected; 
	this.ResetOptions = ResetOptions;
	this.IsSKUSelected = IsSKUSelected;
	this.FindSKUId = FindSKUId;
	this.SetAccessoryOptions = SetAccessoryOptions;
}

function AddSKU(SKU) {
	this.SKUs[this.SKUs.length] = SKU;
}

function FindOptionId(OptionName) {
	skupos = 0;
	Found = false;
	OptionId = "";
	while ( skupos < this.SKUs.length && Found == false ) {
		SKU = this.SKUs[skupos];
		accpos = 0;
		while ( accpos < SKU.Accessory.length && Found == false ) {
			//document.write("Comparing " + SKU.Accessory[accpos].OptionName.toUpperCase() + " to " + OptionName.toUpperCase());
			if ( SKU.Accessory[accpos].OptionName.toUpperCase() == OptionName.toUpperCase() ) {
				OptionId = SKU.Accessory[accpos].OptionId;
				Found = true;
			}
			accpos++;
		}
		skupos++;
	}
	return OptionId;
}

function SetAccessoryOptions(AO) {
	this.AccessoryOptions = AO;
}

function BuildAccessoryList_old() {
	// First gather the accessory list
	this.AccessoryOptions = new Array();

	for(var skupos = 0; skupos < this.SKUs.length; skupos++) {
		SKU = this.SKUs[skupos];
		for(var accpos = 0; accpos < SKU.Accessory.length; accpos++) {
			AccessoryOptionName = SKU.Accessory[accpos].OptionName;
			AccessoryOptionValue = SKU.Accessory[accpos].OptionValue;
			SortOrder = SKU.Accessory[accpos].SortOrder;
			this.AccessoryOptions = AddItemToAssociativeArray(this.AccessoryOptions, AccessoryOptionName, AccessoryOptionValue);
		}
	}
	
	// Now dump all the values for each Accessory Option Identified
	for(AccessoryOptionName in this.AccessoryOptions) {
		this.AccessoryOptions[AccessoryOptionName] = MakeUnique(this.AccessoryOptions[AccessoryOptionName]);
		//DumpArrayAsAlert(this.AccessoryOptions[AccessoryOptionName]);
		//alert('AccessoryOptionName = ' + AccessoryOptionName);
		this.AccessoryOptions[AccessoryOptionName].sort();
	}
}

function DisplayAccessories(DefaultItems) {
	// Setup for the default item SKU
	if ( DefaultItems.length ) {
		DefaultSKU = this.FindSKUId(DefaultItems[0]);
	}
	else {
		DefaultSKU = "";
	}
	// DefaultSKU.AlertSKU();
	DefaultAccessories = new Array();
	// Now dump all the values for each Accessory Option Identified
	for(AccessoryOptionName in this.AccessoryOptions) {
		OptionId = this.FindOptionId(AccessoryOptionName);
		document.write("<span class='AccessoryTitle'>" + AccessoryOptionName + "</span><BR>\n");		
		// this.AccessoryOptions[AccessoryOptionName] = MakeUnique(this.AccessoryOptions[AccessoryOptionName]);
		// this.AccessoryOptions[AccessoryOptionName].sort();
		this.OptionsSelected[AccessoryOptionName] = "";
		for(var pos = 0; pos < this.AccessoryOptions[AccessoryOptionName].length; pos++) {
			FormItem = OptionId + pos;
			document.write("<input type='checkbox' name='" + FormItem + "' value=\"" + escape(this.AccessoryOptions[AccessoryOptionName][pos]) + "\" " + "onClick='javascript:disableIt(document.forms[\"Products\"]." + FormItem + ", \"" + AccessoryOptionName + "\")'>" + '<span class="AvailableAccessoryItem" id="' + OptionId + pos + '">' + this.AccessoryOptions[AccessoryOptionName][pos] + "</span><BR>\n");
			// alert("Checking " + AccessoryOptionName + " --- " + this.AccessoryOptions[AccessoryOptionName][pos]);
			if ( DefaultSKU != "" ) {
				if ( DefaultSKU.AccessoryExists(AccessoryOptionName, this.AccessoryOptions[AccessoryOptionName][pos]) ) {
					//alert("Check " + this.AccessoryOptions[AccessoryOptionName][pos]);
					//alert("FormItem = " + FormItem + "\n" + "Accessory Option Name = " + AccessoryOptionName);
					DefaultAccessories[FormItem] = AccessoryOptionName;
				}
			}
		}
		document.write("<img src='/images/white_dot.gif' height='5' width='1'><BR>\n");
	}
	
	for(AccessoryId in DefaultAccessories) {
		// alert("Items selected = " + AccessoryId + " --- " + DefaultAccessories[AccessoryId]);
		checkItem(document.forms['Products'].elements[AccessoryId], DefaultAccessories[AccessoryId]);
	}
}

function SetDefaultItems(DefaultItems) {
	SKU = this.SKUs[skupos];
	for(var accpos = 0; accpos < SKU.Accessory.length; accpos++) {
		AccessoryOptionName = SKU.Accessory[accpos].OptionName;
		AccessoryOptionValue = SKU.Accessory[accpos].OptionValue;
		this.AccessoryOptions = AddItemToAssociativeArray(this.AccessoryOptions, AccessoryOptionName, AccessoryOptionValue);

		if ( DefaultItems[OptionId] == this.AccessoryOptions[AccessoryOptionName][pos] ) {
			FormItem = OptionId + pos;
			checkItem(document.forms['Products'].elements[FormItem], AccessoryOptionName);
		}

	}	
	
	if ( 1 == 2 ) {
	for(AccessoryOptionName in this.AccessoryOptions) {
		OptionId = this.FindOptionId(AccessoryOptionName);
		alert("Accessory Option Name = " + AccessoryOptionName);
		for(var pos = 0; pos < this.AccessoryOptions[AccessoryOptionName].length; pos++) {
			//alert("Comparing " + DefaultItems[OptionId] + " to " + this.AccessoryOptions[AccessoryOptionName][pos]);
			if ( DefaultItems[OptionId] == this.AccessoryOptions[AccessoryOptionName][pos] ) {
				FormItem = OptionId + pos;
				checkItem(document.forms['Products'].elements[FormItem], AccessoryOptionName);
			}
		}
	}
	}
	
}

function SetOptionSelected(AccessoryOptionName, AccessoryOptionValue) {
	this.OptionsSelected[AccessoryOptionName] = AccessoryOptionValue;
	this.ResetOptions(AccessoryOptionName);
	ValidateAccessorySelection();
	// alert("Setting " + AccessoryOptionName + " = " + AccessoryOptionValue);
}

function UnsetOptionSelected(AccessoryOptionName, AccessoryOptionValue) {
	this.OptionsSelected[AccessoryOptionName] = "";
	this.ResetOptions(AccessoryOptionName);
	ValidateAccessorySelection();
	// alert("Unsetting " + AccessoryOptionName);
}

function ResetOptions(AccessoryOptionName) {
	//DumpArrayAsAlert(this.OptionsSelected);
	var AccessoryItems = document.forms['Products'].elements;
	OptionId = this.FindOptionId(AccessoryOptionName);
	
	// Now build an array of valid items remaining that aren't checked
	ItemsFoundStillGood = new Array();
	for(var skupos = 0; skupos < this.SKUs.length; skupos++) {
		SKU = this.SKUs[skupos];
		ItemsFound = new Array();
		Found = true;
		for(AccessoryOptionName in this.OptionsSelected) {
			accpos = 0;
			AccessoryValue = SKU.GetAccessoryValueByName(AccessoryOptionName);
			//alert("Comparing " + escape(SKU.Accessory[accpos].OptionValue) + " to " + this.OptionsSelected[AccessoryOptionName]);
			if ( this.OptionsSelected[AccessoryOptionName] == "" ) {
				if ( AccessoryValue != "" ) {
					ItemsFound = AddItemToAssociativeArray(ItemsFound, AccessoryOptionName, escape(AccessoryValue));
				}
			}
			else if ( this.OptionsSelected[AccessoryOptionName] == escape(AccessoryValue) ) {
				ItemsFound = AddItemToAssociativeArray(ItemsFound, AccessoryOptionName, escape(AccessoryValue));
			}
			else {
				Found = false;
				break;
			}
		}
		// DumpArrayAsAlert(ItemsFound);
		
		// If available items are still found, then add them to the list of what has already been found
		if ( Found == true ) {
			for(AccessoryOptionName in ItemsFound) {
				if ( typeof(ItemsFoundStillGood[AccessoryOptionName]) != "object" ) {
					ItemsFoundStillGood[AccessoryOptionName] = new Array();
				}
				ItemsFoundStillGood[AccessoryOptionName] = ItemsFoundStillGood[AccessoryOptionName].concat(ItemsFound[AccessoryOptionName]);
			}
		}
	}
	

	// Add the currently selected items to the list of "options still viable"
	// DumpArrayAsAlert(this.OptionsSelected);
	for(AccessoryOptionName in this.OptionsSelected) {
		ItemsFoundStillGood = AddItemToAssociativeArray(ItemsFoundStillGood, AccessoryOptionName, this.OptionsSelected[AccessoryOptionName]);
	}
	// DumpArrayAsAlert(ItemsFoundStillGood);
	
	// Now cycle thru the items found and disable any of the options no longer viable to be selected
	for(AccessoryOptionName in this.AccessoryOptions) {
		OptionId = this.FindOptionId(AccessoryOptionName);
		for(var pos = 0; pos < this.AccessoryOptions[AccessoryOptionName].length; pos++) {
			ItemName = OptionId + pos;
			identity = document.getElementById(ItemName);

			// alert("Comparing " + escape(this.AccessoryOptions[AccessoryOptionName][pos]) + " to " + this.OptionsSelected[AccessoryOptionName]);
			if ( ValueInArray(ItemsFoundStillGood[AccessoryOptionName], escape(this.AccessoryOptions[AccessoryOptionName][pos])) ) {
				//alert("Trying to disable " + ItemName);
				AccessoryItems[ItemName].disabled = false;
				identity.className = "AvailableAccessoryItem";
				// alert("disabling " + this.AccessoryOptions[AccessoryOptionName][pos]);
			}
			else {
				AccessoryItems[ItemName].disabled = true;
				identity.className = "UnavailableAccessoryItem";
				// alert("enabling " + this.AccessoryOptions[AccessoryOptionName][pos]);
			}
		}
	}
	// DumpArrayAsAlert(ItemsFoundStillGood);
}

function IsSKUSelected() {
	// Now cycle thru the items found and disable any of the options no longer viable to be selected
	Found = false;
	SKUId = new Array();
	for(var skupos = 0; skupos < this.SKUs.length; skupos++) {
		SKU = this.SKUs[skupos];
	
		if ( SKU.AreOptionsSelected(this.OptionsSelected) ) {
			SKUId[SKU.SKU] = SKU.Price;
			Found = true;
			break;
		}
	}
	
	return SKUId;
}

function FindSKUId(SKUId) {
	skupos = 0;
	Found = false;
	SKU = "";
	while ( skupos < this.SKUs.length && Found == false ) {
		SKU = this.SKUs[skupos];
		if ( SKUId == SKU.SKU ) {
			Found = true;
		}
		else {
			skupos++;
		}
	}
	return SKU;

}
