// build hierarchy based on format-color-brand
var a_product,
	s_format, s_color, s_brand,
	a_prodTree = {'formatList' : []},
	a_allColorsIndex = {}, a_allColorsList = [],
	a_allBrandsIndex = {}, a_allBrandsList = [];

for (var i = 0; i < a_prodList.length; i++) {
	a_product = a_prodList[i];
	s_format  = a_product['f'];
	s_brand   = a_product['b'] = urldecode(a_product['b']);
	a_product['s'] = urldecode(a_product['s']);
	s_color   = a_product['cl'];
	if (!s_color)
		alert("Brand color for product '" + a_product['c'] + "' is not set");
	
	if (a_allColorsIndex[s_color] == null) {
		a_allColorsIndex[s_color] = a_allColorsList.length;
		a_allColorsList[a_allColorsList.length] = s_color;
	}

	if (a_allBrandsIndex[s_brand] == null) {
		a_allBrandsIndex[s_brand] = a_allBrandsList.length;
		a_allBrandsList[a_allBrandsList.length] = s_brand;
	}
	
	if (!a_prodTree[s_format]) {
		a_prodTree[s_format] = {'colorList': [], 'brandList': [], 'brandIndex': {}};
		a_prodTree['formatList'][a_prodTree['formatList'].length] = s_format;
	}

	if (!a_prodTree[s_format][s_color]) {
		a_prodTree[s_format][s_color] = {'brandList' : []};
		a_prodTree[s_format]['colorList'][a_prodTree[s_format]['colorList'].length] = s_color;
	}

	// list brands within size
	if (!a_prodTree[s_format]['brandIndex'][s_brand]) {
		a_prodTree[s_format]['brandIndex'][s_brand] = true;
		a_prodTree[s_format]['brandList'][a_prodTree[s_format]['brandList'].length] = s_brand;
	}

	// list brands within the color
	if (!a_prodTree[s_format][s_color][s_brand]) {
		a_prodTree[s_format][s_color][s_brand] = a_product;
		a_prodTree[s_format][s_color]['brandList'][a_prodTree[s_format][s_color]['brandList'].length] = s_brand;
	}
}
a_prodList = s_format = s_color = s_brand = a_product = null;

// global scope selections
var n_selectedFormat, s_selectedFormat,
	n_selectedColor,  s_selectedColor,
	s_selectedBrand, s_selectedProduct,
	s_matchingSize;


function f_moutColor () {
	window.e_colorTimer = setTimeout('f_updateProduct()', 300);
}
function f_moverColor (n_color) {

	if (window.e_colorTimer) {
		clearTimeout(window.e_colorTimer);
		window.e_colorTimer = null;
	}

	var s_color   = a_allColorsList[n_color == null ? n_selectedColor : n_color];
	var a_product = a_prodTree[s_selectedFormat][s_color][s_selectedBrand ? s_selectedBrand : a_prodTree[s_selectedFormat][s_color]['brandList'][0]];
	if (!a_product) return;

	// update color name
	var e_elem = document.getElementById('colorName');
	var n_prodName = urldecode(a_product['n']);
	n_prodName = n_prodName.replace(a_product['cl'], '<br />' + a_product['cl']);
	e_elem.innerHTML = n_prodName;

	e_elem = document.getElementById('prodSize');
	e_elem.innerHTML = a_product['s'];
}

function f_saveSelections (b_delete, b_productType) {

	var d_exp = new Date();
	d_exp.setTime(d_exp.getTime() + (b_delete ? -3600 : 24 * 3600));


	if (n_selectedFormat != null)
		document.cookie = 'lastFormat='  + n_selectedFormat  + ';;expires=' + d_exp.toGMTString();

	if (n_selectedColor != null)
		document.cookie = 'lastColor=' + n_selectedColor + ';;expires=' + d_exp.toGMTString();

	if (s_selectedBrand)
		document.cookie = 'lastBrand=' + s_selectedBrand + ';;expires=' + d_exp.toGMTString();

	if (b_productType == 'card') {
		document.cookie = 'cartQty=' + document.forms['addToCart'].elements['Quantity'].value + ';;expires=' + d_exp.toGMTString();
		document.cookie = 'cartName='  + a_selectedProduct['n']  + ';;expires=' + d_exp.toGMTString();
	}
	else if (b_productType == 'envelope') {
		document.cookie = 'cartQty=' + document.forms['addToCartEnv'].elements['Quantity'].value + ';;expires=' + d_exp.toGMTString();
		document.cookie = 'cartName='  + escape(a_selectedEnvelope['name'])  + ';;expires=' + d_exp.toGMTString();
	}
}

function f_toggle (s_id, e_caller) {
	var e_element = document.getElementById(s_id);
	if (!e_element) return;
	e_element.style.display = e_element.style.display == 'none' ? 'block' : 'none';
	if (e_caller)
		e_caller.blur();
}

function f_updateProduct (n_color) {

	if (n_selectedFormat == null || n_selectedColor == null)
		return;

	var a_product = a_prodTree[s_selectedFormat][s_selectedColor][s_selectedBrand ? s_selectedBrand : a_prodTree[s_selectedFormat][s_selectedColor]['brandList'][0]];
	if (!a_product) return;

	a_selectedProduct = a_product;
	
	// update product info
	e_elem = document.getElementById('att_pcode');
	e_elem.innerHTML = a_product['c'];
	e_elem = document.getElementById('att_weight');
	e_elem.innerHTML = urldecode(a_product['w']);
	e_elem = document.getElementById('att_printing');
	e_elem.innerHTML = urldecode(a_product['p']);
	
	// update color name
	var e_elem = document.getElementById('colorName');
	var n_prodName = urldecode(a_product['n']);
	n_prodName = n_prodName.replace(a_product['cl'], '<br />' + a_product['cl']);
	e_elem.innerHTML = n_prodName;

	// update Size	
	e_elem = document.getElementById('prodSize');
	e_elem.innerHTML = a_product['s'];

	// update price
	e_elem = document.getElementById('price');
	e_elem.innerHTML =  a_product ? a_product['r'] + '<span>per ' + a_product['u'] + '</span>' : '-';

	// update volume price
	e_elem = document.getElementById('volpriceSide');
	if (a_product['vp']) {
		var s_html = '<table id="volPriceTable"><tr><th>Packs</th><th>Price / Pack</th></tr>';
		for (var i = 0; i < a_product['vp'].length; i+= 2)
			s_html += '<tr><td>' + a_product['vp'][i] + '</td><td>' + a_product['vp'][i + 1] + '</td></tr>';
		s_html += '</table>';
		e_elem.innerHTML = s_html;
	}
	else
		e_elem.innerHTML = '&nbsp;';

	// update description
	e_elem = document.getElementById('prodDescrText');
	e_elem.innerHTML =  a_product ? urldecode(a_product['d']) : '';

	// swap large image
	e_elem = document.getElementById('prodImage');
	e_elem.src = 'http://www.lcipaper.com/catalog/graphics/prods/' + a_product['c'] + 'med.jpg'

	// change product name in shipping cart
	var e_input = document.forms['addToCart'].elements['Product_Code'];
	if (e_input)
		e_input.value = a_product['c'];
}

// select format and display only available colors and brands
function f_selectFormat (n_format, b_skipProduct) {

	if (n_format == null)
		n_format = String(document.cookie).match(/lastFormat=(\d+)/) ? parseInt(RegExp.$1) : 0;
	
	n_selectedFormat = n_format;
	s_selectedFormat = a_prodTree['formatList'][n_format];

	// set drop down
	var e_select = document.getElementById('formatSelector');
		e_select.selectedIndex = n_format;

	// update brands drop down
	e_select = document.getElementById('brandSelector');
	e_select.options.length = 0;
	var a_brandList = a_prodTree[s_selectedFormat]['brandList'];
	if (a_brandList.length > 1)
		e_select.options[0] = new Option ("All Brands", '');
	for (i = 0; i < a_brandList.length; i++)
		e_select.options[e_select.options.length] = new Option (a_brandList[i], a_brandList[i]);

	// reset brand
	s_selectedBrand = null;

	// reset color if needed
	f_selectColor(null, true);

	// update envelopes header if this section is present
	var e_elem = document.getElementById('matchingEnvelopes');
	if (e_elem) {
		var e_elem2 = document.getElementById('sidebarEnv');
		var a_product = a_prodTree[s_selectedFormat][s_selectedColor ? s_selectedColor : a_prodTree[s_selectedFormat]['colorList'][0]][s_selectedBrand ? s_selectedBrand : a_prodTree[s_selectedFormat][s_selectedColor]['brandList'][0]];
		s_matchingSize = a_envelopeSizes[a_product['s']];
		e_elem2.style.display = e_elem.style.display = (s_matchingSize ? 'block' : 'none');
		
		e_elem = document.getElementById('envelopesNote');
		e_elem.innerHTML = 'You have selected <b>' + a_product['s'] + '</b>' + (a_envelopeSizes[a_product['s']]
			? ', the matching envelope for this size is <b>' + a_envelopeSizes[a_product['s']] + '</b>. Below please select the brand of the envelope from the list of available options for that envelope size. <b>Change card size above to see other envelopes choices.</b>'
			: '. This blank card type does not require envelope. <b>Change card size above to see envelopes choices.</b>');
	
	}

	if (b_skipProduct) return;

	// update product info
	f_updateProduct();
	f_updateBrandsEnv();
	f_saveSelections();

	// hide cart message
	e_elem = document.getElementById('cartMessage');
	if (e_elem)	e_elem.style.display = 'none';
}

// select color within selected format and display all available brands
function f_selectColor (n_color, b_skipProduct) {

	if (n_color == null)
		n_color = n_selectedColor == null
			? (String(document.cookie).match(/lastColor=(\d+)/)
				? parseInt(RegExp.$1)
				: 0)
			: n_selectedColor;

	// check if color exists for selected format
	var s_color = a_allColorsList[n_color];
	if ((!s_selectedBrand && !a_prodTree[s_selectedFormat][s_color])
		|| (s_selectedBrand && !a_prodTree[s_selectedFormat][s_color][s_selectedBrand])) {

		for (n_color = 0; n_color < a_allColorsList.length; n_color++) {
			s_color = a_allColorsList[n_color];
			if (a_prodTree[s_selectedFormat][s_color] && (!s_selectedBrand || a_prodTree[s_selectedFormat][s_color][s_selectedBrand]))
				break;
		}
	}
	
	n_selectedColor = n_color;
	s_selectedColor = a_allColorsList[n_color];

	// update swatch and drop down	
	var e_swatchImg, e_select = document.getElementById('colorSelector');
	e_select.options.length = 0;

	for (i = 0; i < a_allColorsList.length; i++) {
		s_color = a_allColorsList[i];
		e_swatchImg = document.getElementById('colorSwatch' + i);

		if (a_prodTree[s_selectedFormat][s_color] && (!s_selectedBrand
			|| a_prodTree[s_selectedFormat][s_color][s_selectedBrand])) {

			e_swatchImg.style.display = 'inline';
			e_select.options[e_select.options.length] = new Option (a_allColorsList[i], i);
			if (s_selectedColor == s_color) {
				e_swatchImg.className = 'colorSwatchSelected';
				e_select.selectedIndex = e_select.options.length - 1;
			}
			else
				s_selectedColor == 'colorSwatch';
		}
		else
			e_swatchImg.style.display = 'none';
	}

	if (b_skipProduct) return;

	// move swatch highlight
	var e_elem;
	for (var i = 0; i < a_allColorsList.length; i++) {
		e_elem = document.getElementById('colorSwatch' + i);
		e_elem.className = (i == n_color ? 'colorSwatchSelected' : 'colorSwatch');
	}

	// update product info
	f_updateProduct();
	f_saveSelections();
	
	// hide cart message
	var e_elem = document.getElementById('cartMessage');
	if (e_elem)	e_elem.style.display = 'none';
}

function f_selectBrand (s_brand, b_skipProduct) {

	if (s_brand == '')
		s_brand == null
	s_selectedBrand = s_brand;

	var e_select = document.getElementById('brandSelector');
	for (var i = 0; i < e_select.options.length; i++)
		if (e_select.options[i].value == s_brand) {
			e_select.selectedIndex = i;
			break;
		}
	
	// update swatch and color select
	f_selectColor();
}

function f_loadBrand () {
	if (!String(document.cookie).match(/lastBrand=([\d\w]+)/))
		return;
	s_brand = RegExp.$1;
	if (a_prodTree[s_selectedFormat][s_selectedColor][s_brand])
		 f_selectBrand(s_brand);
}

function f_updateBrandsEnv() {

	var e_select = document.getElementById('envelopeBrands');
	e_select.options.length = 0;
	e_select.options[0] = new Option (' Loading ... ');
	e_select.disabled = true;

	window.o_http = f_getHTTPObject();
	window.o_http.onreadystatechange = f_updateBrandsEnvHandler;
	window.o_http.open("GET",
		(String(window.location).indexOf('http:') == 0 ? 'http' : 'https')
		+ '://www.lcipaper.com/php/matching-envelopes.php?s=' + escape(a_selectedProduct['s']) + '&b=' + escape(a_selectedProduct['b']), true);
	window.o_http.send(null);
}

function f_updateBrandsEnvHandler() {
	if (!window.o_http)
		return;

	if (window.o_http.readyState != 4) return;
	if (window.o_http.status != 200 && o_http.status != 304)
		throw 'AJAX response error';

	var e_xml = window.o_http.responseXML;
	
	var e_select = document.getElementById('envelopeBrands');
	e_select.options.length = 0;

	var e_block = e_xml.getElementsByTagName("envelopes");
	if (!e_block || e_block.length == 0) return false;
	if (e_block.length) e_block = e_block[0];

	if (e_block.childNodes[0].tagName == 'error') {
		e_select.options[0] = new Option (e_block.childNodes[0].firstChild.nodeValue);
		e_select.disabled = true;
		return;
	}
	
	var e_itemXML, s_brand, n_count, i;
	for (i = 0; i < e_block.childNodes.length; i++) {
		e_itemXML = e_block.childNodes[i];
		if (e_itemXML.tagName != 'brand')
			continue;

		s_brand = e_itemXML.firstChild.nodeValue;
		n_count = parseInt(e_itemXML.getAttribute('count'));
		e_select.options[e_select.options.length] = new Option (s_brand + ' (' + n_count + ')', s_brand);
		if (e_itemXML.getAttribute('selected'))
			e_select.selectedIndex = e_select.options.length - 1;
	}
	e_select.disabled = false;
	f_updateEnvelopesHandler(null, e_xml);
}

var a_envelopeColorsList,
	a_envelopeColorsIndex,
	n_selectedEnvelopeColor,
	n_selectedEnvelopeBrand,
	a_selectedEnvelope;


function f_updateEnvelopesHandler (e_event, e_xml) {

	if (e_xml == null) {
		if (!window.o_http)
			return;
	
		if (window.o_http.readyState != 4) return;
		if (window.o_http.status != 200 && o_http.status != 304)
			throw 'AJAX response error';
	
		e_xml = window.o_http.responseXML;
	}

	a_envelopeColorsList = [];
	a_envelopeColorsIndex = [];
	var e_block = e_xml.getElementsByTagName("envelopes");
	if (!e_block || e_block.length == 0) return false;
	if (e_block.length) e_block = e_block[0];

	var s_code, s_name, s_color, s_weight, s_printing, s_volprice,
		a_volprice, s_descr, a_volPriceTokens, n_color, s_swatchHTML = '', i, p;
	
	for (i = 0; i < e_block.childNodes.length; i++) {
		e_itemXML = e_block.childNodes[i];
		if (e_itemXML.tagName != 'product')
			continue;

			s_code = e_itemXML.getAttribute('code');
			s_name = e_itemXML.getAttribute('name');
			s_color = String(e_itemXML.getAttribute('color')).split(',')[0];
			n_price = '$' + e_itemXML.getAttribute('price');
			s_weight = e_itemXML.getAttribute('weight');
			s_printing = e_itemXML.getAttribute('printing');
			s_boxcount = e_itemXML.getAttribute('boxcount');
			s_volPrice = e_itemXML.getAttribute('volprice');
			s_descr = e_itemXML.firstChild ? e_itemXML.firstChild.nodeValue : 'no description';

			if (!a_envelopeColorsIndex[s_color]) {
				n_color = a_envelopeColorsList.length;
				a_envelopeColorsList[n_color] = s_color;
				a_envelopeColorsIndex[s_color] = [];
			}
			
			a_envelopeColorsIndex[s_color][a_envelopeColorsIndex[s_color].length] = {
				'code': s_code,
				'name': s_name,
				'color': s_color,
				'price': n_price,
				'boxcount': s_boxcount,
				'weight': s_weight,
				'printing': s_printing,
				'volprice': s_volPrice,
				'descr' : s_descr
			};
			
			s_swatchHTML += '<img src="/catalog/graphics/prods/swatches/swatch-' + s_color.replace(/\s+/g, '-') +
				'.gif" onmouseover="f_moverColorEnv('+ n_color + ')" onmouseout="f_moutColorEnv()" alt="' + s_color +
				'" onmousedown="f_mclickColorEnv(' + n_color + ');" id="colorSwatchEnv' + n_color + '" />';
	}

	if (!a_envelopeColorsList.length)
		return;
	
	// show matching envelopes
	n_selectedEnvelopeColor = 0;
	var s_cardColor = s_selectedColor;

	// update colors list
	var e_elem = document.getElementById('envelopeColors');
	e_elem.options.length = 0;
	for (i = 0; i < a_envelopeColorsList.length; i++) {
		s_color = a_envelopeColorsList[i];
		e_elem.options[i] = new Option (s_color, s_color);
		if (s_color == s_cardColor)
			n_selectedEnvelopeColor = i;
	}

	// update swatch
	e_elem = document.getElementById('swatchEnv');
	e_elem.innerHTML = s_swatchHTML;

	f_updateEnvelope();
}

function f_moutColorEnv () {
	window.e_colorTimer = setTimeout('f_resetColorEnv()', 300);
}
function f_moverColorEnv (n_color) {

	if (window.e_colorTimer) {
		clearTimeout(window.e_colorTimer);
		window.e_colorTimer = null;
	}

	// update product name
	var a_envelope = a_envelopeColorsIndex[a_envelopeColorsList[n_color]][0];
	e_elem = document.getElementById('prodNameEnv');
	var n_prodName = urldecode(a_envelope['name']);
	n_prodName = n_prodName.replace(a_envelope['color'], '<br />' + a_envelope['color']);
	e_elem.innerHTML = n_prodName;
}
function f_resetColorEnv () {
	window.e_colorTimer = null;

	// update product name
	e_elem = document.getElementById('prodNameEnv');
	var n_prodName = urldecode(a_selectedEnvelope['name']);
	n_prodName = n_prodName.replace(a_selectedEnvelope['color'], '<br />' + a_selectedEnvelope['color']);
	e_elem.innerHTML = n_prodName;
}

function f_mclickColorEnv (n_color) {
	f_updateEnvelope (n_color);
}

function f_loadEnvelopes (s_brand) {

	var e_elem = document.getElementById('prodNameEnv');
	e_elem.innerHTML = 'Loading...';
	
	window.o_http = f_getHTTPObject();
	window.o_http.onreadystatechange = f_updateEnvelopesHandler;

	window.o_http.open("GET",
		(String(window.location).indexOf('http:') == 0 ? 'http:' : 'https')
		+ '//www.lcipaper.com/php/matching-envelopes.php?s=' + escape(a_selectedProduct['s']) + '&b=' + escape(s_brand), true);
	window.o_http.send(null);
}

function f_updateEnvelope (n_color) {

	if (n_color == null)
		n_color = n_selectedEnvelopeColor == null ? 0 : n_selectedEnvelopeColor;
	n_selectedEnvelopeColor = n_color;

	// move swatch highlight
	var e_elem;
	for (var i = 0; i < a_envelopeColorsList.length; i++) {
		e_elem = document.getElementById('colorSwatchEnv' + i);
		e_elem.className = (i == n_color ? 'colorSwatchSelectedEnv' : 'colorSwatchEnv');
	}

	// set drop down
	var e_select = document.getElementById('envelopeColors');
	e_select.selectedIndex = n_color;

	// update envelope info
	a_selectedEnvelope = a_envelopeColorsIndex[a_envelopeColorsList[n_color]][0];

	// update product info
	e_elem = document.getElementById('att_pcodeEnv');
	e_elem.innerHTML = a_selectedEnvelope['code'];
	document.forms['addToCartEnv'].elements['Product_Code'].value = a_selectedEnvelope['code'];

	e_elem = document.getElementById('att_weightEnv');
	e_elem.innerHTML = urldecode(a_selectedEnvelope['weight']);
	e_elem = document.getElementById('att_printingEnv');
	e_elem.innerHTML = urldecode(a_selectedEnvelope['printing']);
	
	// update product name
	e_elem = document.getElementById('prodNameEnv');
	var n_prodName = urldecode(a_selectedEnvelope['name']);
	n_prodName = n_prodName.replace(a_selectedEnvelope['color'], '<br />' + a_selectedEnvelope['color']);
	e_elem.innerHTML = n_prodName;
	
	// update price
	e_elem = document.getElementById('priceEnv');
	e_elem.innerHTML =  a_selectedEnvelope['price'] + '<span>per ' + a_selectedEnvelope['boxcount'] + '</span>';

	// update volume price
	e_elem = document.getElementById('volpriceEnv');
	var s_volPriceHTML = '', s_volPrice, a_volPrice;
	if (s_volPrice = a_selectedEnvelope['volprice']) {
		a_volPrice = String(s_volPrice).split('|');
		s_volPriceHTML = '<table id="volPriceTable"><tr><th>Packs</th><th>Price / Pack</th></tr>';
		for (p = 0; p < a_volPrice.length; p += 2)
			s_volPriceHTML += '<tr><td>' + a_volPrice[p] + '</td><td>$' + a_volPrice[p + 1] + '</td></tr>';
		s_volPriceHTML += '</table>';
	}
	else
		s_volPriceHTML = '&nbsp;';
	e_elem.innerHTML = s_volPriceHTML;


	// swap large image
	e_elem = document.getElementById('prodImageEnv');
	e_elem.src = 'http://www.lcipaper.com/catalog/graphics/prods/' + a_selectedEnvelope['code'] + 'med.jpg'

	// update description
	e_elem = document.getElementById('descriptionEnv');
	e_elem.innerHTML =  a_selectedEnvelope['descr'];
}

function f_getHTTPObject() {
	var xmlhttp;
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
		try {xmlhttp = new XMLHttpRequest();} catch (e) {xmlhttp = false;}
	}
		if(!xmlhttp && typeof ActiveXObject != "undefined"){
		try{ xmlhttp=new ActiveXObject("MSXML2.XMLHTTP"); }catch(e){xmlhttp=false;}
		if(!xmlhttp)try{ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){xmlhttp=false;}
	}
	return xmlhttp;
}

function f_displayCartMessage () {
	var e_elem = document.getElementById('cartMessage');

	var n_cartQty = String(document.cookie).match(/cartQty\=(\d+)/) ? parseInt(RegExp.$1) : null;
	var n_cartName = String(document.cookie).match(/cartName\=([\w\d\%\-\+]+)/) ? RegExp.$1 : null;

	var b_single = false;
	if (n_cartQty != null)
		b_single = (n_cartQty % 10 == 1) && (n_cartQty % 100 != 11);

	e_elem.innerHTML = (n_cartQty != null && n_cartName != null
		? n_cartQty + ' pack' + (b_single ? '' : 's') + ' of <b>' + urldecode(n_cartName) + '</b> ' + (b_single ? 'has' : 'have') + ' been added to <a href="specialty.paper?Screen=BASK&Store_Code=LPC">Your Cart</a>.'
		: 'Selected items have been added to <a href="specialty.paper?Screen=BASK&Store_Code=LPC">Your Cart</a>.')
		+ (s_categoryCode == 'double-wedding-envelopes' || s_categoryCode == 'inner-wedding-envelopes'
			? '<br /><a href="/response-envelopes.html">Click here</a> to select matching response envelopes.'
			: '');
	e_elem.style.display = 'block';
}

function f_samplesTable (s_brand) {

	f_hideEnvelopeSizes();

	var a_product, n_itemCount = 1, s_rowHTML, n_rowCount,
		s_html = '<table id="samplesTable"><tr><th>&nbsp;</th>';
	for (var i = 0; i < a_prodTree['formatList'].length; i++)
		s_html += '<th>' + a_prodTree['formatList'][i] + '</th>';
	s_html += '</tr>';
	for (var i = 0; i < a_allColorsList.length; i++) {
		s_rowHTML = '<tr><th class="colors"><img src="/catalog/graphics/prods/swatches/swatch-' + a_allColorsList[i].replace(/\s+/g, '-') +
		'.gif" alt="' + a_allColorsList[i] + '"  class="colorSwatch"  />' + a_allColorsList[i] + '</th>';
		n_rowCount = 0;
		for (var t = 0; t < a_prodTree['formatList'].length; t++) {
			a_product = a_prodTree[a_prodTree['formatList'][t]][a_allColorsList[i]];

			if (a_product && s_brand && a_product[s_brand])
				a_product = a_product[s_brand];
			else if (a_product && s_brand && !a_product[s_brand])
				a_product = null;
			else if (a_product && !s_brand)
				a_product = a_product[a_product['brandList'][0]];
	
			if (a_product && a_product['sp']) {
				s_rowHTML += '<td><input type="hidden" name="product_code' +
					n_itemCount  + '" value="' + a_product['c'] + '_s" /><input type="Checkbox"  name="quantity' +
					n_itemCount + '" value="1" /> ('+ a_product['sp'] + ')</td>';
				n_itemCount++;
				n_rowCount++;
			}
			else
				s_rowHTML += '<td>&nbsp;</td>';
		}
		s_rowHTML += '</tr>';
		if (n_rowCount)
			s_html += s_rowHTML;
	}
	s_html += '</table>';

	var e_elem = document.getElementById('brandSelectorSamples');
	if (!s_brand)
		e_elem.selectedIndex = 0;
	
	e_elem = document.getElementById('samplesTableContainer');
	e_elem.innerHTML = s_html;

	e_elem = document.getElementById('sampleSelector');
	var e_table = document.getElementById('samplesTable');
	var e_iframe = document.getElementById('samplesSelectFix');
	if (!e_elem || !e_table) return;
	e_table.style.display = b_ie6 || b_ie7 || b_ie8 ? 'block' : 'table';

	var n_width  = e_elem.offsetWidth;
	var n_height = e_elem.offsetHeight;
	var n_left   = (f_clientWidth() - n_width) / 2;
	if (n_left < 10) n_left = 10;
	var n_top = (f_clientHeight() - n_height) / 2;
	if (n_top < 10) n_top = 10;
	
	e_elem.style.left = n_left + 'px';
	e_elem.style.top  = n_top  + 'px';
	e_elem.style.visibility = 'visible';

	if (e_iframe) {
		e_iframe.style.display = "block";
		e_iframe.width = n_width;
		e_iframe.height = n_height;
		e_iframe.style.top = n_top  + 'px';
		e_iframe.style.left = n_left + 'px';
	}
	
	var e_shade = document.getElementById('sampleSelectorShade');
	if (!e_shade) return;
	f_customShade(e_shade, n_width, n_height, n_left, n_top);
	e_shade.style.visibility = 'visible';
}
function f_hideSamplesTable() {
	var e_elem = document.getElementById('sampleSelector');
	if (e_elem)
		e_elem.style.visibility = 'hidden';
	var e_iframe = document.getElementById('samplesSelectFix');
	if (e_iframe)
		e_iframe.style.display = "none";

	var e_shade = document.getElementById('sampleSelectorShade');
	if (e_shade)
		e_shade.style.visibility = 'hidden';
		
	window.scrollTo(0, 0);
}

function f_envelopeSizes() {
	
	f_hideSamplesTable();
	var e_elem = document.getElementById('envelopeSizes');
	if (!e_elem) return;

	var e_elemFrame = document.getElementById('envelopeSizesFrame');
	e_elemFrame.src = 'http://www.lcipaper.com/envelope-sizes.shtml';

	var n_width  = e_elem.offsetWidth;
	var n_height = e_elem.offsetHeight;
	var n_left   = (f_clientWidth() - n_width) / 2;
	if (n_left < 10) n_left = 10;
	var n_top = (f_clientHeight() - n_height) / 2;
	if (n_top < 10) n_top = 10;
	
	e_elem.style.left = n_left + 'px';
	e_elem.style.top  = n_top  + 'px';
	e_elem.style.visibility = 'visible';

	var e_iframe = document.getElementById('samplesSelectFix');
	if (e_iframe) {
		e_iframe.style.display = "block";
		e_iframe.width = n_width;
		e_iframe.height = n_height;
		e_iframe.style.top = n_top  + 'px';
		e_iframe.style.left = n_left + 'px';
	}
	
	var e_shade = document.getElementById('sampleSelectorShade');
	if (!e_shade) return;
	f_customShade(e_shade, n_width, n_height, n_left, n_top);
	e_shade.style.visibility = 'visible';

}

function f_hideEnvelopeSizes() {
	var e_elem = document.getElementById('envelopeSizes');
	if (e_elem)
		e_elem.style.visibility = 'hidden';

	var e_iframe = document.getElementById('samplesSelectFix');
	if (e_iframe)
		e_iframe.style.display = "none";

	var e_shade = document.getElementById('sampleSelectorShade');
	if (e_shade)
		e_shade.style.visibility = 'hidden';
		
	window.scrollTo(0, 0);
}

function f_setLightbox (e_elem, b_envelope) {
	if (b_envelope) {
		if (a_selectedProduct == null) return;
		e_elem.href  = '/catalog/graphics/prods/' + a_selectedEnvelope['code']  + 'large.jpg'
		e_elem.title = a_selectedEnvelope['name'];
	}
	else {
		if (a_selectedProduct == null) return;
		e_elem.href  = '/catalog/graphics/prods/' + a_selectedProduct['c']  + 'large.jpg'
		e_elem.title = urldecode(a_selectedProduct['n']);
	}
}

var s_userAgent = navigator.userAgent.toLowerCase();

var b_mac = s_userAgent.indexOf('mac') != -1,
	b_ie5    = s_userAgent.indexOf('msie 5') != -1,
	b_ie6    = s_userAgent.indexOf('msie 6') != -1 && s_userAgent.indexOf('opera') == -1,
	b_ie7    = s_userAgent.indexOf('msie 7') != -1,
	b_ie8    = s_userAgent.indexOf('msie 8') != -1,
	b_ieMac  = b_mac && b_ie5,
	b_safari = b_mac && s_userAgent.indexOf('safari') != -1,
	b_opera6 = s_userAgent.indexOf('opera 6') != -1;

function f_clientWidth() {
	if (typeof(window.innerWidth) == 'number')
		return window.innerWidth;
	if (document.documentElement && document.documentElement.clientWidth)
		return document.documentElement.clientWidth;
	if (document.body && document.body.clientWidth)
		return document.body.clientWidth;
	return null;
}
function f_clientHeight() {
	if (typeof(window.innerHeight) == 'number')
		return window.innerHeight;
	if (document.documentElement && document.documentElement.clientHeight)
		return document.documentElement.clientHeight;
	if (document.body && document.body.clientHeight)
		return document.body.clientHeight;
	return null;
}
function f_customShade (e_container, n_width, n_height, n_left, n_top) {
	if (!e_container) return;
	if (n_width != null) e_container.style.width = (n_width + 8) + 'px';
	if (n_left != null) e_container.style.left = (n_left - 1) + 'px';
	e_container.style.top = (n_top - 1) + 'px';
	if (b_ie5 || b_ie6)
		e_container.innerHTML = '<table cellpadding="0" cellspacing="0" border="0" width="100%"><tr><td rowspan="2" colspan="2" width="6"><img src="images/pixel.gif"></td><td width="7" height="7" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'images/shade_tr.png\', sizingMethod=\'scale\');"><img src="images/pixel.gif"></td></tr><tr><td height="' + (n_height - 7) + '" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'images/shade_mr.png\', sizingMethod=\'scale\');"><img src="images/pixel.gif"></td></tr><tr><td width="7" style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'images/shade_bl.png\', sizingMethod=\'scale\');"><img src="images/pixel.gif"></td><td style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'images/shade_bm.png\', sizingMethod=\'scale\');" height="7" align="left"><img src="images/pixel.gif"></td><td style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'images/shade_br.png\', sizingMethod=\'scale\');"><img src="images/pixel.gif"></td></tr></table>';
	else
		e_container.innerHTML = '<table cellpadding="0" cellspacing="0" border="0" width="100%"><tr><td rowspan="2" width="6"><img src="images/pixel.gif"></td><td rowspan="2"><img src="images/pixel.gif"></td><td width="7" height="7"><img src="images/shade_tr.png"></td></tr><tr><td background="images/shade_mr.png" height="' + (n_height - 7) + '"><img src="images/pixel.gif"></td></tr><tr><td><img src="images/shade_bl.png"></td><td background="images/shade_bm.png" height="7" align="left"><img src="images/pixel.gif"></td><td><img src="images/shade_br.png"></td></tr></table>';
}
function urldecode(str) {
  
    var histogram = {};
    var ret = str.toString();
    
    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    // The histogram is identical to the one in urlencode.
    histogram["'"]   = '%27';
    histogram['(']   = '%28';
    histogram[')']   = '%29';
    histogram['*']   = '%2A';
    histogram['~']   = '%7E';
    histogram['!']   = '%21';
    histogram['%20'] = '+';

    for (replace in histogram) {
        search = histogram[replace]; // Switch order when decoding
        ret = replacer(search, replace, ret) // Custom replace. No regexing   
    }
    
    // End with decodeURIComponent, which most resembles PHP's encoding functions
    ret = decodeURIComponent(ret);

    return ret;
}
