

// uses mootools 1.11 as used by the version of slimbox

// define the product stock which gets populated on the listings pages
var productStocks = [];

function multiCheckStock (productId) {

	var formElement = document.forms['prod' + productId];
	formElement = $(formElement);

	var productStock = productStocks[productId];
	if (!productStock || !formElement) {
		return true;
	}

	// put all the product attributes into the local scope
	var sl_validOptionIds = productStock.validOptionIds;
	var sl_validAssignIds = productStock.validAssignIds;
	var sl_stockInfo = productStock.stockInfo;
	var sl_useStock = productStock.useStock;
	var sl_allowOutOfStock = productStock.allowOutOfStock;
	var sl_showStockLevel = productStock.showStockLevel;
	var sl_appendCode = productStock.appendChar;
	var sl_appendChar = productStock.appendChar;
	var sl_prodCode = productStock.prodCode;
	var sl_langInStock = productStock.langInStock;
	var sl_langOutOfStock = productStock.langOutOfStock;
	var sl_langVariantOutOfStock = productStock.langVariantOutOfStock;
	var sl_langVariantNotAvail = productStock.langVariantNotAvail
	var sl_langOutOfStockAlert = productStock.langOutOfStockAlert;
	var sl_langNotAvailAlert = productStock.langNotAvailAlert;
	var sl_totalStock = productStock.totalStock;
	var sl_elements = productStock.elements;

	var elements = [];
	var index = 0;

	var els = [];
	els.merge(formElement.getElementsByTagName('input'));
	els.merge(formElement.getElementsByTagName('select'));

	elements[index] = [];
	els.each(function (el) {
		if ($(el).getProperty('name') == 'productOptions[]') {
			elements[index].push(el);
		}
	});
	index++;

	for (var i = 0; i < productStock.validOptionIds.length; i++) {
		option_id = sl_validOptionIds[i];

		elements[index] = [];
		els.each(function (el) {
			if ($(el).getProperty('name') == 'productOptions_'+option_id) {
				elements[index].push(el);
			}
		});
		index++;

		elements[index] = [];
		els.each(function (el) {
			if ($(el).getProperty('name') == 'productOptions_'+option_id+'[]') {
				elements[index].push(el);
			}
		});
		index++;

		elements[index] = [];
		els.each(function (el) {
			if ($(el).getProperty('name') == 'productOptions['+option_id+']') {
				elements[index].push(el);
			}
		});
		index++;
	}

	var sl_elements = elements;

	var a = gv(sl_elements);
	var index = multipleGetIndex(a, sl_validAssignIds);

	if (typeof sl_stockInfo[index] != 'undefined') {
		stockLevel = sl_stockInfo[index][0];
	} else if (index == '') {
		stockLevel = sl_totalStock;
	}

	if (typeof stockLevel != 'undefined') {
		if (stockLevel > 0) {
			// in stock
			return true;
		} else if (stockLevel <= 0 && !sl_useStock) {
			// this product ignores stock levels entirely (except for 'never available' variants)
			return true;
		} else if (stockLevel <= 0 && sl_allowOutOfStock) {
			// out of stock, out of stock purchases ARE permitted
			return true;
		} else if (stockLevel <= 0 && !sl_allowOutOfStock) {
			// out of stock, out of stock purchases NOT permitted
			alert(sl_langOutOfStockAlert);
			return false;
		}
	} else {
		// this size/colour/etc marked as "never available"
		alert(sl_langNotAvailAlert);
		return false;
	}
}

function multiUpdateStockLevel (productId) {

	var formElement = document.forms['prod' + productId];
	formElement = $(formElement);

	var productStock = productStocks[productId];
	if (!productStock || !formElement) {
		return true;
	}

	// put all the product attributes into the local scope
	var sl_validOptionIds = productStock.validOptionIds;
	var sl_validAssignIds = productStock.validAssignIds;
	var sl_stockInfo = productStock.stockInfo;
	var sl_useStock = productStock.useStock;
	var sl_allowOutOfStock = productStock.allowOutOfStock;
	var sl_showStockLevel = productStock.showStockLevel;
	var sl_appendCode = productStock.appendChar;
	var sl_appendChar = productStock.appendChar;
	var sl_prodCode = productStock.prodCode;
	var sl_langInStock = productStock.langInStock;
	var sl_langOutOfStock = productStock.langOutOfStock;
	var sl_langVariantOutOfStock = productStock.langVariantOutOfStock;
	var sl_langVariantNotAvail = productStock.langVariantNotAvail
	var sl_langOutOfStockAlert = productStock.langOutOfStockAlert;
	var sl_langNotAvailAlert = productStock.langNotAvailAlert;
	var sl_totalStock = productStock.totalStock;
	var sl_elements = productStock.elements;

	var elements = [];
	var index = 0;

	var els = [];
	els.merge(formElement.getElementsByTagName('input'));
	els.merge(formElement.getElementsByTagName('select'));

	elements[index] = [];
	els.each(function (el) {
		if ($(el).getProperty('name') == 'productOptions[]') {
			elements[index].push(el);
		}
	});
	index++;

	for (var i = 0; i < productStock.validOptionIds.length; i++) {
		option_id = sl_validOptionIds[i];

		elements[index] = [];
		els.each(function (el) {
			if ($(el).getProperty('name') == 'productOptions_'+option_id) {
				elements[index].push(el);
			}
		});
		index++;

		elements[index] = [];
		els.each(function (el) {
			if ($(el).getProperty('name') == 'productOptions_'+option_id+'[]') {
				elements[index].push(el);
			}
		});
		index++;

		elements[index] = [];
		els.each(function (el) {
			if ($(el).getProperty('name') == 'productOptions['+option_id+']') {
				elements[index].push(el);
			}
		});
		index++;
	}

	var sl_elements = elements;

	var assignIds = [];
	var stockString = '';
	var outStockString = '';
	var prodCode = '';
	var a = gv(elements);
	var incompleteSelection = false;

	for (var i=0; i<a.length; ++i) {
		// compatibility with "Force Selection of Product Options"
		if (a[i].charAt(0)=='0') {
			a.length = 0;
			incompleteSelection = true;
		}
	}

	var index = multipleGetIndex(a, sl_validAssignIds);

	if (typeof sl_stockInfo[index] != 'undefined') {
		prodCode   = sl_stockInfo[index][1];
		var stockLevel = sl_stockInfo[index][0];
	} else if (index == '') {
		var stockLevel = sl_totalStock;
	}

	if (sl_useStock && typeof stockLevel != 'undefined') {
		if (incompleteSelection) {
			// compatibility with "Force Selection of Product Options"
			stockString = outStockString = '';
		} else if (stockLevel > 0) {
			// this product variant is in stock
			stockString = sl_langInStock;
			if (sl_showStockLevel) stockString += ': ' + stockLevel;
			outStockString = '';
		} else if (sl_totalStock <= 0) {
			// product entirely sold out
			stockString = '';
			outStockString = sl_langOutOfStock;
		} else {
			// this product variant is sold out
			stockString = '';
			outStockString = sl_langVariantOutOfStock;
		}
	} else if (sl_useStock) {
		// this product variant is not available
		stockString = '';
		outStockString = sl_langVariantNotAvail;
	}

	var inStockSpans = getElementsByClassName(formElement, 'span', 'inStock');
	var outOfStockSpans = getElementsByClassName(formElement, 'span', 'outOfStock');
	var prodCodeSpans = getElementsByClassName(formElement, 'span', 'prodCode');

	var inStockSpan = inStockSpans[0];
	var outOfStockSpan = outOfStockSpans[0];
	var prodCodeSpan = prodCodeSpans[0];

	if (sl_useStock) {
		sh(inStockSpan, stockString);
		sh(outOfStockSpan, outStockString);
	}

	if (prodCode != '' && sl_appendCode) {
		st(prodCodeSpan, sl_prodCode+sl_appendChar+prodCode);
	} else if (prodCode != '' && !sl_appendCode) {
		st(prodCodeSpan, prodCode);
	} else {
		st(prodCodeSpan, sl_prodCode);
	}
}

function multipleGetIndex (assignIds, sl_validAssignIds) {
	var index = '';
	for (var i=0; i<sl_validAssignIds.length; ++i) {
		for (var j=0; j<assignIds.length; ++j) {
			if (sl_validAssignIds[i] == assignIds[j]) {
				if (index.length > 0) index += ',';
				index += sl_validAssignIds[i];
			}
		}
	}
	return index;
}

function getParentElement (node, tag) {
	tag = tag.toUpperCase();
	while (node) {
		if (node.nodeName == tag) {
			return node;
		}
		node = node.parentNode;
	}
	return null;
}

function getElementsByClassName(oElm, strTagName, strClassName){
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all :
		oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	strClassName = strClassName.replace(/\-/g, "\\-");
	var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	var oElement;
	for(var i=0; i<arrElements.length; i++){
		oElement = arrElements[i];
		if(oRegExp.test(oElement.className)){
			arrReturnElements.push(oElement);
		}
	}
	return (arrReturnElements)
}