// enumerate types
var a_product,
	s_type,	s_size,
	a_prodTree = [],
	a_typesList = [],
	a_name2size = [];

for (var i = 0; i < a_prodList.length; i++) {
	a_product = a_prodList[i];
	s_type = a_product['f'] = urldecode(a_product['f']);
	s_size  = urldecode(a_product['s']);
	a_product['s'] = s_size.replace(/\sOuter/i, '<br />Outer');
	
	a_name2size[s_type] = s_size.match(/Inner Envelope ([x\d\s\/]+) Outer/i) ? RegExp.$1 : s_size;
	
	if (!a_prodTree[s_type]) {
		a_prodTree[s_type] = [a_product];
		a_typesList[a_typesList.length] = s_type;
	}
	else {
		a_prodTree[s_type][a_prodTree[s_type].length] = a_product;
	}
}
a_prodList = null;
a_product = null;
s_type = null;

// enumerate colors
var a_type;
var a_colorsList = [],
	a_colorsIndex = [];

for (i = 0; i < a_typesList.length; i++) {
	a_type = a_prodTree[a_typesList[i]];

	for (j = 0; j < a_type.length; j++) {
		s_color = a_type[j]['cl'];
		if (!s_color) continue;
		a_prodTree[a_typesList[i]][j]['a'] = s_color;
		
		if (!a_colorsIndex[s_color]) {
			a_colorsIndex[s_color] = {};
			a_colorsList[a_colorsList.length] = s_color;
		}
		a_colorsIndex[s_color][a_type[j]['f']] = a_type[j];
	}
}
a_type = null;
s_color = null;

var n_selectedType  = String(document.cookie).match(/lastType=(\d+)/)  ? parseInt(RegExp.$1) : 0;
var n_selectedColor = String(document.cookie).match(/lastColor=(\d+)/) ? parseInt(RegExp.$1) : 0;
var a_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_colorsList[n_color == null ? n_selectedColor : n_color];
	var a_product = a_colorsIndex[s_color][a_typesList[n_selectedType]];

	if (a_product == null)
		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_mclickColor (n_color) {
	if (n_selectedType == null || n_selectedColor == null || !a_colorsIndex[a_colorsList[n_color]][a_typesList[n_selectedType]])
		return;
	f_selectColorFiltered(n_color);
}

function f_saveTypeAndColor (b_delete, b_productType) {

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

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

	document.cookie = 'lastColor=' + n_selectedColor + ';;expires=' + d_exp.toGMTString();
	document.cookie = 'lastType='  + n_selectedType  + ';;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_selectedType == null || n_selectedColor == null)
		return;

	var s_color = a_colorsList[n_color == null ? n_selectedColor : n_color];
	var a_product = a_colorsIndex[s_color][a_typesList[n_selectedType]];

	if (!a_product)
		return;

	window.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
	var e_largeImageLink = document.getElementById('largeImageLink');
	if (a_product['ni'] && e_largeImageLink)
		e_largeImageLink.style.display = 'none';
	else {
		if (e_largeImageLink)
			e_largeImageLink.style.display = 'block';
		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 type and display only available colors
function f_selectTypeFiltered (n_type, b_skipProduct) {
	if (n_type == null)
		n_type = n_selectedType;

	// pick first valid color selection
	var a_product;
	while (true) {
		if (a_product = a_colorsIndex[a_colorsList[n_selectedColor]][a_typesList[n_type]])
			break;
		n_selectedColor = ++n_selectedColor % a_colorsList.length;
	}
	n_selectedType = n_type;
	
	// set drop down
	var e_select = document.getElementById('typeSelector');
	e_select.selectedIndex = n_type;

	// update color drop down and swatch
	var e_img, e_select = document.getElementById('colorSelector');
	e_select.options.length = 0;
	for (i = 0; i < a_colorsList.length; i++) {
		e_img = document.getElementById('colorSwatch' + i);
		if (a_colorsIndex[a_colorsList[i]][a_typesList[n_type]]) {
			e_select.options[e_select.options.length] = new Option (a_colorsList[i], i);
			if (i == n_selectedColor)
				e_select.selectedIndex = e_select.options.length - 1;
			e_img.style.display = '';
			e_img.className = (i == n_selectedColor ? 'colorSwatchSelected' : 'colorSwatch');
		}
		else {
			e_img.style.display = 'none';
		}
	}
	
	if (b_skipProduct) return;

	// update product info
	f_updateProduct();
	f_saveTypeAndColor();

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

function f_selectColorFiltered (n_color, b_skipProduct) {

	if (n_selectedType == null)
		return;

	if (n_color == null)
		n_color = n_selectedColor;

	// pick first valid selection
	var a_product;
	while (true) {
		if (a_colorsIndex[a_colorsList[n_color]][a_typesList[n_selectedType]])
			break;
		n_color = ++n_color % a_colorsList.length;
	}

	n_selectedColor = n_color;
	
	// move swatch highlight
	var e_elem;
	for (var i = 0; i < a_colorsList.length; i++) {
		e_elem = document.getElementById('colorSwatch' + i);
		e_elem.className = (i == n_color ? 'colorSwatchSelected' : 'colorSwatch');
	}
	
	// set drop down
	var e_select = document.getElementById('colorSelector');
	for (i = 0; i < e_select.options.length; i++) {
		if (e_select.options[i].value == n_color) {
			e_select.selectedIndex = i;
			break;
		}
	}

	if (b_skipProduct) return;

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

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 () {
	var a_product, n_itemCount = 1;
	document.write('<table id="samplesTable"><tr><th>&nbsp;</th>');
	for (var i = 0; i < a_typesList.length; i++)
		document.write('<th>' + a_typesList[i] + '</th>')
	document.write('</tr>');
	for (var i = 0; i < a_colorsList.length; i++) {
		document.write('<tr><th class="colors"><img src="/catalog/graphics/prods/swatches/swatch-', a_colorsList[i].replace(/\s+/g, '-'),
		'.gif"  alt="', a_colorsList[i], '"  class="colorSwatch"  />' + a_colorsList[i] + '</th>');
		for (var t = 0; t < a_typesList.length; t++) {
			a_product = a_colorsIndex[a_colorsList[i]][a_typesList[t]];
			if (a_product && a_product['sp']) {
				document.write('<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++;
			}
			else
				document.write('<td>&nbsp;</td>');
		}
		document.write('</tr>');
	}
	document.write('</table>');
}

function f_showSamplesTable() {

	f_hideEnvelopeSizes();

	var 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 (!e_container.innerHTML) {
		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;
}
