//array holding json product options for suffix key
var jsonForSuffixKey = new Array();

function getSkuOptions() {
	
	return getSkuOptionsWithSuffix('');
}

//returns an array of choice name
//("color", "size", "width", "height")
function getSkuOptionsWithSuffix(suffixKey) {
	var skuOptions = new Array();
	var skuOptionsSelect = $('.skuOptions' + suffixKey);
	var skuOptionsArray = jQuery.makeArray(skuOptionsSelect);
	for(a = 0; a < skuOptionsArray.length; a++) {
		skuOptions[a] = skuOptionsArray[a].id.replace(/_select(.*)/, '');
	}
	return skuOptions;
}

function sort_sku_options(a,b){
	inta = parseInt(a);
	intb = parseInt(b);
	if (inta < intb) return -1;
	if (inta > intb) return 1;
	return 0 ;
}

//render all the product options select dropdown on cart page and
//attach listener when select dropdown option change
function populateAllProductOptions(json_page, product_id, suffixKey) {
	
	var suffixKey = escapedSuffixKey(suffixKey);
	
	/* Grab the latest state of infomation for the skus as a JSON string */
 $.getJSON(json_page, {product_id : product_id}, function(data) {
	   
	   json_sku_info = data;
	   jsonForSuffixKey[suffixKey] = data;
	   
	   //selected values
	   var selectedFieldValue = new Array();
	   var fields = getSkuOptionsWithSuffix(suffixKey);

	   //remember the selected value and remove all options
	   for(k = 0; k < fields.length; k++) {
		   selectedFieldValue[fields[k]] = $('#' + fields[k] + '_select_' + suffixKey + ' :selected').val();
		   $('#' + fields[k] + '_select_' + suffixKey).find('option').remove().end();
	   }
	   
	   //populate all product options
	   handlePopulateAllProductOptions(json_sku_info, suffixKey)
	   
	   for(j = 0; j < fields.length; j++) {
		   $('#' + fields[j] + '_select_' + suffixKey).find("option[value='" + selectedFieldValue[fields[j]] + "']").attr("selected","selected");
	   }
	   
	   //add listener to update option onchange
	   for(h = 0; h < fields.length; h++) {
		   $('#' + fields[h] + '_select_' + suffixKey).change(function(){handleProductOptionChangeForSuffixKey(suffixKey)});   
	   }
	   
 });
	
}

//when rendering the product options for the first time on the cart page, 
//show all options allow customer to choose.
function handlePopulateAllProductOptions(json_string, suffixKey) {
	
	var fields = getSkuOptionsWithSuffix(suffixKey);
	
	//key = field::field_id
	var optionsRendered = new Array();
	var dropDownHolder = new Array();
	for(k = 0; k < fields.length; k++) {
		dropDownHolder[fields[k]] = new Array();
	}
	
	for(var x = 0; x < json_string.length; x++){

		var jsonEntry = json_string[x];
		
		if(jsonEntry['INSTOCK']) {
			
			for(i = 0; i < fields.length; i++) {
				
				var fieldValue = jsonEntry[fields[i] + "_ID"];
				var fieldText = jsonEntry[fields[i]];
				var fieldPriority = jsonEntry[fields[i] + "_PRIORITY"];
				
				if(optionsRendered[fields[i] + '::' + fieldValue] != '1') {
					dropDownHolder[fields[i]][dropDownHolder[fields[i]].length] = new Array(2);
					dropDownHolder[fields[i]][dropDownHolder[fields[i]].length - 1][0] = fieldPriority;
					dropDownHolder[fields[i]][dropDownHolder[fields[i]].length - 1][1] = '<option value="' + fieldValue + '">' + fieldText + '</option>';
					optionsRendered[fields[i] + '::' + fieldValue] = 1;
				}
				
			}
			
		}// if inStock
		
	}//for
	
	for(q = 0; q < fields.length; q++) {
		dropDownHolder[fields[q]].sort(sort_sku_options);
	
		$('#' + fields[q] + '_select_' + suffixKey).append('<option value="select">' + fields[q].toLowerCase().charAt(0).toUpperCase() + fields[q].toLowerCase().substring(1) + '</option>');
		for(var a = 0; a < dropDownHolder[fields[q]].length; a++){
			$('#' + fields[q] + '_select_' + suffixKey).append(dropDownHolder[fields[q]][a][1]);
		}
	}
}

function handleProductOptionChangeForSuffixKey(suffixKey) {
	
	handleProductOptionChange(jsonForSuffixKey[suffixKey], suffixKey)
}

function handleProductOptionChange(json_string, suffixKey) {
	
	//get a list of sku options (color, size, height, width)
	var fields = getSkuOptionsWithSuffix(suffixKey);
	
	if(suffixKey.length > 0) {
		suffixKey = '_' + suffixKey;
	}

	//key = field::field_id
	//array keeping track of sku options value already included to be rendered in select dropdown
	var optionsRendered = new Array();
	
	//array initialized to hold possible sku option value for each sku option(s)
	var dropDownHolder = new Array();
	for(k = 0; k < fields.length; k++) {
		dropDownHolder[fields[k]] = new Array();
	}
	
	var overallInstockColors = new Array();
	for(var z = 0; z < json_string.length; z++){
		var jsonEntry = json_string[z];
		if(jsonEntry['INSTOCK'] == 'true' || 
				jsonEntry['ONLINE_PARTNER_INVENTORY'] == 'true' ||
				jsonEntry['NEAR_STOCK'] == 'true') {
			overallInstockColors[jsonEntry['COLOR_VALUE_REF']] = 1;
		}
	}
	
	//parse json to determine available sku option values
	for(var x = 0; x < json_string.length; x++){
		
		var jsonEntry = json_string[x];
		for(i = 0; i < fields.length; i++) {
			
			var fieldValue = jsonEntry[fields[i] + "_ID"];
			var fieldText = jsonEntry[fields[i]];
			var fieldPriority = jsonEntry[fields[i] + "_PRIORITY"];
			var fieldValueRef = jsonEntry[fields[i] + "_VALUE_REF"];
			
			//if we have this field option in the dropdown list, skip
			if(optionsRendered[fields[i] + '::' + fieldValue] != '1') {
				
				//check to see if this sku option value is available option based on already selected values or if no option value is select for sku option.
				for(f = 0; f < fields.length; f++) {
					
					if((fields[f] == fields[i] 
					        || $('#' + fields[f] + '_select' + suffixKey).attr("selectedIndex") <= 0) 
							|| (jsonEntry[fields[f] + "_ID"] == $('#' + fields[f] + '_select' + suffixKey + ' :selected').val())) {
						
						if(f == fields.length -1) {
							
							if(fields[i]=='COLOR' || jsonEntry['INSTOCK'] == 'true' || 
								jsonEntry['ONLINE_PARTNER_INVENTORY'] == 'true' ||
								jsonEntry['NEAR_STOCK'] == 'true') {
								
								var displayFieldText = fieldText;
								if (fields[i]=='COLOR' && overallInstockColors[fieldValueRef] != 1){
									displayFieldText += ' (Check Stores)';
								}
								
								dropDownHolder[fields[i]][dropDownHolder[fields[i]].length] = new Array(2);
								dropDownHolder[fields[i]][dropDownHolder[fields[i]].length - 1][0] = fieldPriority;
								dropDownHolder[fields[i]][dropDownHolder[fields[i]].length - 1][1] = '<option value="' + fieldValue + '" label="' + fieldValueRef + '">' + displayFieldText + '</option>';
								
								optionsRendered[fields[i] + '::' + fieldValue] = 1;
							}
							
						}
						
					} else {
						break;
					}
					
				}
			}
		}
		
	}
	
	//update select dropdown values for each sku options
	for(q = 0; q < fields.length; q++) {
		
		//remember select field value
		var selectedOption = $('#' + fields[q] + '_select' + suffixKey + ' :selected');
		
		//remove all option value(s) for sku option
		$('#' + fields[q] + '_select' + suffixKey).find('option').remove().end();
		$('#' + fields[q] + '_select' + suffixKey).append('<option value="0">' + fields[q].toLowerCase().charAt(0).toUpperCase() + fields[q].toLowerCase().replace("_", " ").substring(1) + '</option>');
		
		//get possible option value(s) for sku option
		dropDownHolder[fields[q]].sort(sort_sku_options);
		
		//populate options value(s) for sku option
		for(var a = 0; a < dropDownHolder[fields[q]].length; a++){
			$('#' + fields[q] + '_select' + suffixKey).append(dropDownHolder[fields[q]][a][1]);
		}
		
		//highlight user selected option value for sku option
		$('#' + fields[q] + '_select' + suffixKey).find("option[value='" + selectedOption.val() + "']").attr("selected","selected");
		if (selectedOption.val()){
			var firstOption = $('#' + fields[q] + '_select' + suffixKey).find("option[value='0']");
			firstOption.attr('label', selectedOption.attr('label'));
			firstOption.val(selectedOption.val());
			firstOption.text(selectedOption.text());
		}
		//for given field, if all option are disabled, disable the select dropdown
		
		
	}
	
}

//escape key for special characters used by jquery
function escapedSuffixKey(suffixKey) {
	var escapedString = suffixKey.replace(/:/g, '\\:');
	return escapedString;
}

function getSkuIDFromSkuOptionsForSuffixKey(suffixKey) {
	
	suffixKey = escapedSuffixKey(suffixKey);
	return getSkuIDFromSkuOptions(jsonForSuffixKey[suffixKey], suffixKey);
}
function getSkuIDFromSkuOptions(json_sku_info, suffixKey) {
	
	var fields = getSkuOptionsWithSuffix(suffixKey);
	
	if(suffixKey.length > 0) {
		suffixKey = '_' + suffixKey;
	}
	
	var selected_sku_id = '';
	
    for(var x = 0; x < json_sku_info.length; x++) {
            var jsonElement = json_sku_info[x];

            for(n = 0; n < fields.length; n++) {

                if(jsonElement[fields[n]]) {
                        
                	if(jsonElement[fields[n] + '_ID'] != $('#' + fields[n] + '_select' + suffixKey + ' :selected').val()) {
                		break;
                	}

                	if((n == (fields.length -1))) {
                		selected_sku_id = jsonElement['SKU_ID'];
                	}
                }
            }
    }
	return selected_sku_id;

}

function isSkuInStock(json_sku_info, skuID) {

	var in_stock = false;
	
	for(var x = 0; x < json_sku_info.length; x++) {
		var jsonElement = json_sku_info[x];

		if(jsonElement['SKU_ID'] == skuID && jsonElement['INSTOCK'] == 'true') {
			in_stock = true;
			break;
		}
        
	}

	return in_stock;
}
