// ************************************************************************
// ***                     SIZE AND POSITIONING                          **
// ************************************************************************
function getScrollXY() {
	var scrOfX = 0, scrOfY = 0;
	if( typeof( window.pageYOffset ) == 'number' ) {
		//Netscape compliant
		scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
		//DOM compliant
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
		//IE6 standards compliant mode
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	}
	foo = new Array(0);
	foo[0] = scrOfX;
	foo[1] = scrOfY;
	return [ scrOfX, scrOfY ];
}

// return the X and Y pixels of the current window
function windowSize() {
	var myWidth = 0, myHeight = 0;
	if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	}
	return [ myWidth, myHeight ];
}

var cursor = {x:0, y:0};
function getPosition(e) {
	//var cursor = {x:0, y:0};
	e = e || window.event;
	if (e.pageX || e.pageY) {
		cursor.x = e.pageX;
		cursor.y = e.pageY;
	} 
	else {
		try {
			var de = document.documentElement;
			var b = document.body;
			cursor.x = e.clientX + (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0);
			cursor.y = e.clientY + (de.scrollTop || b.scrollTop) - (de.clientTop || 0);
		} catch (e) {
			//do nothing
		}
	}
	return cursor;
}

function showSelectBoxes() {
	var strIndex = navigator.userAgent.indexOf('MSIE');
	if (strIndex != -1) {
		var version = parseFloat(navigator.userAgent.charAt(strIndex + 5));
		if (version < 7) {
			var iframes = document.getElementsByTagName('iframe');
			for (var i = (iframes.length - 1); i >= 0; i--) {
				iframes[i].parentNode.removeChild(iframes[i]);
			}
		}
	}
}

function hideSelectBoxes() {
	var strIndex = navigator.userAgent.indexOf('MSIE');
	if (strIndex != -1) {
		var version = parseFloat(navigator.userAgent.charAt(strIndex + 5));
		if (version < 7) {
			var selectBoxes = document.getElementsByTagName('select');
			for (var i = 0; i < selectBoxes.length; i++) {
				var iframeUrl = '/blank.html';
				var size = Element.getDimensions(selectBoxes[i]);
				var iframe = document.createElement("iframe");

				var selectParent = selectBoxes[i].parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
				var counterIndex = selectParent.className.indexOf('cycle_count_');
				if (counterIndex != -1 && selectParent.className.length - 1 >= counterIndex + 12) {
					var counter = parseInt(selectParent.className.charAt(counterIndex + 12), 10);
					iframeUrl = '/blank' + counter + '.html';
				}

				selectBoxes[i].parentNode.style.zIndex = 2;
				selectBoxes[i].parentNode.style.position = 'relative';

				iframe.setAttribute('src', iframeUrl);
				iframe.setAttribute('frameBorder', '0');
				iframe.setAttribute('scrolling', 'no');
				iframe.style.position = 'absolute';
				iframe.style.top = 0;
				iframe.style.left = 0;
				iframe.style.width = (size.width + 4) + 'px';
				iframe.style.height = (size.height + 4) + 'px';
				iframe.style.zIndex = 1;
				iframe.style.display = 'block';
				
				selectBoxes[i].parentNode.appendChild(iframe);
			}
		}
	}
}


// ************************************************************************
// ***                         BALLOON CHECKS                            **
// ************************************************************************
function gotoCategory (selectObj) {

	var selectedIndex = selectObj.selectedIndex;
	var destinationID = selectObj.options[selectedIndex].value;
	window.location.href = '/category.php?id=' + destinationID;
}

function gotoPage (selectObj) {

	var selectedIndex = selectObj.selectedIndex;
	var destinationURL = selectObj.options[selectedIndex].value;
	window.location.href = destinationURL;
}


// ************************************************************************
// ***                         BALLOON CHECKS                            **
// ************************************************************************
var OUT_BOUNDS = 0; //should be const, but only supported by gecko browsers
var IN_BOUNDS = 1; //should be const, but only supported by gecko browsers
var ON_MOUSEOVER = 2; //should be const, but only supported by gecko browsers
function cursorInBounds(cursorPos, mouseoverNode, balloonNode, mouseoverLoc) {
	var balloonSize = Element.getDimensions(balloonNode);
	var mouseoverSize = Element.getDimensions(mouseoverNode);
	var balloonPos = Position.cumulativeOffset(balloonNode);
	var mouseoverPos = Position.cumulativeOffset(mouseoverNode);
	
	var cursorNearMouseover = false;
	mouseoverLoc = mouseoverLoc.toUpperCase();
	
	switch (mouseoverLoc) {
		case 'BELOW':
			cursorNearMouseover = (cursorPos.y >= mouseoverPos[1]);
			break;
		case 'ABOVE':
			cursorNearMouseover = (cursorPos.y <= mouseoverPos[1] + mouseoverSize.height);
			break;
		case 'RIGHT':
			cursorNearMouseover = (cursorPos.x >= mouseoverPos[0]);
			break;
		case 'LEFT':
			cursorNearMouseover = (cursorPos.x <= mouseoverPos[0] + mouseoverSize.width);
			break;
		default:
			alert(mouseoverLoc);
	}

	if (cursorNearMouseover && (cursorPos.x < mouseoverPos[0] || cursorPos.x > mouseoverPos[0] + mouseoverSize.width || cursorPos.y < mouseoverPos[1] || cursorPos.y > mouseoverPos[1] + mouseoverSize.height)) {
		return OUT_BOUNDS;
	} else if (cursorPos.x > mouseoverPos[0] && cursorPos.x < mouseoverPos[0] + mouseoverSize.width && cursorPos.y > mouseoverPos[1] && cursorPos.y < mouseoverPos[1] + mouseoverSize.height) {
		return ON_MOUSEOVER;
	} else if (cursorPos.x > balloonPos[0] && cursorPos.x < balloonPos[0] + balloonSize.width && cursorPos.y > balloonPos[1] && cursorPos.y < balloonPos[1] + balloonSize.height) {
		return IN_BOUNDS;
	} else {
		return OUT_BOUNDS;
	}
}

function hideOtherBalloons(thisBalloonType) {
	switch (thisBalloonType) {
		case 'info':
			hidePdf(curPdfDot);
			hideCart(curCartDot);
			break;
		case 'pdf':
			hideInfo(curInfoDot);
			hideCart(curCartDot);
			break;
		case 'cart':
			hideInfo(curInfoDot);
			hidePdf(curPdfDot);
			break;
		case 'edit':
			hideDelete(curDeleteDot);
			break;
		case 'delete':
			hideEdit(curEditDot);
			break;
		case 'all':
			hideInfo(curInfoDot);
			hidePdf(curPdfDot);
			hideCart(curCartDot);
			hideEdit(curEditDot);
			hideDelete(curDeleteDot);
			break;
		default:
			hideInfo(curInfoDot);
			hidePdf(curPdfDot);
			hideCart(curCartDot);
			hideEdit(curEditDot);
			hideDelete(curDeleteDot);
			break;
	}
}


function setID(obj, id) {
	var oldObj = document.getElementById(id);
	
	while (oldObj) {
		oldObj.removeAttribute('id');
		oldObj = document.getElementById(id);
	}
	
	obj.setAttribute('id', id);
}


// ************************************************************************
// ***                           INFO DOT                                **
// ************************************************************************
var curInfoDot = null;
var curTagIdOfDescription = null;
var curTagIdOfPicture = null;
function do_showInfo(infoDotID, tagIdOfDescription, tagIdOfPicture) {
	setTimeout('showInfo("' + infoDotID + '", "' + tagIdOfDescription + '", "' + tagIdOfPicture + '")', 250)
}
function showInfo(infoDotID, tagIdOfDescription, tagIdOfPicture) {
	infoDotNode = document.getElementById(infoDotID)
	Position.prepare();

	if (curInfoDot != infoDotNode) {
		hideInfo();
	}
	curInfoDot = infoDotNode;
	curTagIdOfDescription = tagIdOfDescription;
	curTagIdOfPicture = tagIdOfPicture;

	//load the information.
	var infoBodyInnerNode = document.getElementById('info-body-inner');
	var descriptionNode = document.getElementById(tagIdOfDescription);
	var pictureNode = document.getElementById(tagIdOfPicture);

	if (descriptionNode && descriptionNode.value.length > 0) {
		var imgSrc = '';
		if (pictureNode && pictureNode.value.length > 0) {
			imgSrc = pictureNode.value
			infoBodyInnerNode.innerHTML = '<img src="/siteImages/xsmall/' + imgSrc + '" alt="" />' + unescape(descriptionNode.value);
		} else {
			infoBodyInnerNode.innerHTML = unescape(descriptionNode.value);
		}
	} else {
		return;
	}

	hideSelectBoxes();

	var infoDotPos = Position.cumulativeOffset(curInfoDot);

	var infoBoxNode = document.getElementById('balloon-info');
	var infoBoxSize = Element.getDimensions(infoBoxNode);
	var infoTabNode = document.getElementById('info-tab');
	
	var left = infoDotPos[0] - infoBoxSize.width + 3
	var top = infoDotPos[1] - 16 - 4; //subtract tab offset & 13px for tab to lineup

	var winSize = windowSize();
	var winScroll = getScrollXY();

	infoTabNode.style.top = '16px';

	if (top + infoBoxSize.height > winSize[1] + winScroll[1]) {
		var top2 = winSize[1] + winScroll[1] - infoBoxSize.height;
		var totalHeight = top - top2 + 16 + 25 + 10; //tab offset, top, bottom
		if (totalHeight > infoBoxSize.height) {
			top2 = top2 + (totalHeight - infoBoxSize.height);
		}
		infoTabNode.style.top = (top - top2 + 16) + 'px';
		top = top2;
	}

	//set visibility
	hideOtherBalloons('info');
	infoBoxNode.style.left = left + 'px';
	infoBoxNode.style.top = top + 'px';
	infoBoxNode.style.display = 'block';
	
	Event.observe(document, 'mousemove', checkInfo);
}

function checkInfo(e) {
	//var pos = getPosition(e);
	var pos = cursor;
	var infoBoxNode = document.getElementById('balloon-info');
	var boundsCheck = cursorInBounds(pos, curInfoDot, infoBoxNode, 'RIGHT');

	if (boundsCheck == OUT_BOUNDS) {
		Event.stopObserving(document, 'mousemove', checkInfo);
		hideInfo(curInfoDot);
		showSelectBoxes();
	} else if (boundsCheck == ON_MOUSEOVER && infoBoxNode.style.display != 'block') {
		showInfo(curInfoDot, curTagIdOfDescription, curTagIdOfPicture = null);
	}
}

function hideInfo(refNode) {
	infoBoxNode = document.getElementById('balloon-info');
	
	if (infoBoxNode) {
		infoBoxNode.style.display = 'none';
	}
}


// ************************************************************************
// ***                           PDF DOT                                 **
// ************************************************************************
var curPdfDot = null;
function do_showPdf(pdfDotID, tagIdOfSpecifications) {
	setTimeout('showPdf("' + pdfDotID + '", "' + tagIdOfSpecifications + '")', 250)
}
function showPdf(pdfDotID, tagIdOfSpecifications) {
	pdfDotNode = document.getElementById(pdfDotID);
	Position.prepare();

	if (curPdfDot != pdfDotNode) {
		hidePdf();
	}
	curPdfDot = pdfDotNode;

	hideSelectBoxes();

	var pdfDotPos = Position.cumulativeOffset(curPdfDot);

	var pdfBoxNode = document.getElementById('balloon-pdf');
	var pdfBoxSize = Element.getDimensions(pdfBoxNode);
	var specsNode = document.getElementById(tagIdOfSpecifications);
	var specsIconNode = document.getElementById('pdf-icon-link');
	var specsTextNode = document.getElementById('pdf-text-link');
	
	specsIconNode.setAttribute('href', specsNode.value);
	specsTextNode.setAttribute('href', specsNode.value);
	
	var left = pdfDotPos[0] - (pdfBoxSize.width / 2) + 8;
	var top = pdfDotPos[1] - pdfBoxSize.height+2; // + 10;

	var winSize = windowSize();
	var winScroll = getScrollXY();

	pdfBoxNode.style.left = left + 'px';
	pdfBoxNode.style.top = top + 'px';
	pdfBoxNode.style.display = 'block';

	hideOtherBalloons('pdf');
	Event.observe(document, 'mousemove', checkPdf);
}

function checkPdf(e) {
	//var pos = getPosition(e);
	var pos = cursor;
	var pdfBoxNode = document.getElementById('balloon-pdf');
	var boundsCheck = cursorInBounds(pos, curPdfDot, pdfBoxNode, 'BELOW');

	if (boundsCheck == OUT_BOUNDS) {
		Event.stopObserving(document, 'mousemove', checkPdf);
		hidePdf(curPdfDot);
		showSelectBoxes();
	} else if (boundsCheck == ON_MOUSEOVER && pdfBoxNode.style.display != 'block') {
		showPdf(curPdfDot);
	}
}

function hidePdf(refNode) {
	pdfBoxNode = document.getElementById('balloon-pdf');
	
	if (pdfBoxNode) {
		pdfBoxNode.style.display = 'none';
	}
}

// ************************************************************************
// ***                          CART DOT                                 **
// ************************************************************************
var curCartDot = null;
function do_showCart(cartDotID) {
	setTimeout('showCart("' + cartDotID + '")', 250)
}
function showCart(cartDotID) {
	cartDotNode = document.getElementById(cartDotID);

	//don't show the cart balloon if product state is open.
	if (currentDetailsNode && currentDetailsNode.style.display == 'block') return;

	//hide the cart before re-positioning it
	if (curCartDot != cartDotNode) {
		hideCart();
	}
	curCartDot = cartDotNode;

	//Don't display the balloon if the details table is showing.
	var cartDotId = curCartDot.getAttribute('id');
	var parts = cartDotId.split('_');
	var id = parseInt(parts[parts.length - 1], 10);
	var detailsTableNode = document.getElementById('product_details_table_' + id);
	if (detailsTableNode.style.display != 'none') return;

	Position.prepare();
	var cartDotPos = Position.cumulativeOffset(curCartDot);
	var cartDotSize = Element.getDimensions(cartDotNode);

	var cartBoxNode = document.getElementById('balloon-cart');
	var cartBoxSize = Element.getDimensions(cartBoxNode);
	
	var left = cartDotPos[0] - (cartBoxSize.width / 2) + (cartDotSize.width / 2) + 8;
	var top = cartDotPos[1] - cartBoxSize.height + 10;

	var winSize = windowSize();
	var winScroll = getScrollXY();

	cartBoxNode.style.left = left + 'px';
	cartBoxNode.style.top = top + 'px';
	cartBoxNode.style.display = 'block';

	hideOtherBalloons('cart');
	Event.observe(document, 'mousemove', checkCart);
}

function checkCart(e) {
	//var pos = getPosition(e);
	var pos = cursor;
	var cartBoxNode = document.getElementById('balloon-cart');
	var boundsCheck = cursorInBounds(pos, curCartDot, cartBoxNode, 'BELOW');

	if (boundsCheck == OUT_BOUNDS) {
		Event.stopObserving(document, 'mousemove', checkCart);
		hideCart(curCartDot);
	} else if (boundsCheck == ON_MOUSEOVER && cartBoxNode.style.display != 'block') {
		showCart(curCartDot);
	}
}

function checkCartClick(e) {
	//var pos = getPosition(e);
	var pos = cursor;
	var cartBoxNode = document.getElementById('balloon-cart');
	var boundsCheck = cursorInBounds(pos, curCartDot, cartBoxNode, 'BELOW');

	if (boundsCheck == ON_MOUSEOVER && curCartDot.parentNode.onclick) {
		var onclick = curCartDot.parentNode.onclick.toString();
		var strToFind = 'itemCartClicked(';
		var strPos = onclick.indexOf(strToFind);

		if (strPos != -1 && onclick.length > strPos) {
			var id = parseInt(onclick.substring(strPos + strToFind.length), 10);
			itemCartClicked(id);
		}
	}
}

function hideCart(refNode) {
	cartBoxNode = document.getElementById('balloon-cart');
	
	if (cartBoxNode) {
		cartBoxNode.style.display = 'none';
	}
}


// ************************************************************************
// ***                           GUIDE DOT                               **
// ************************************************************************
var curGuideDot = null;
function do_showGuide(guideDotID) {
	setTimeout('showGuide("' + guideDotID + '")', 250)
}
function showGuide(guideDotID) {
	guideDotNode = document.getElementById(guideDotID);
	Position.prepare();

	if (curGuideDot != guideDotNode) {
		hideGuide();
	}
	curGuideDot = guideDotNode;

	var guideDotPos = Position.cumulativeOffset(curGuideDot);

	var guideBoxNode = document.getElementById('balloon-guide');
	var guideBoxSize = Element.getDimensions(guideBoxNode);
	var guideTabNode = document.getElementById('guide-tab');
	
	var left = guideDotPos[0] - guideBoxSize.width + 3
	var top = guideDotPos[1] - 16 - 13; //subtract tab offset & 13px for tab to lineup

	var winSize = windowSize();
	var winScroll = getScrollXY();

	guideTabNode.style.top = 16 + 'px';

	if (top + guideBoxSize.height > winSize[1] + winScroll[1]) {
		var top2 = winSize[1] + winScroll[1] - guideBoxSize.height;
		var totalHeight = top - top2 + 16 + 25 + 45; //tab offset, top, bottom
		if (totalHeight > guideBoxSize.height) {
			top2 = top2 + (totalHeight - guideBoxSize.height);
		}
		guideTabNode.style.top = (top - top2 + 16) + 'px';
		top = top2;
	}

	guideBoxNode.style.left = left + 'px';
	guideBoxNode.style.top = top + 'px';
	guideBoxNode.style.display = 'block';

	hideOtherBalloons('guide');
	Event.observe(document, 'mousemove', checkGuide);
}

function checkGuide(e) {
	//var pos = getPosition(e);
	var pos = cursor;
	var guideBoxNode = document.getElementById('balloon-guide');
	var boundsCheck = cursorInBounds(pos, curGuideDot, guideBoxNode, 'RIGHT');

	if (boundsCheck == OUT_BOUNDS) {
		Event.stopObserving(document, 'mousemove', checkGuide);
		hideGuide(curGuideDot);
	} else if (boundsCheck == ON_MOUSEOVER && guideBoxNode.style.display != 'block') {
		showGuide(curGuideDot);
	}
}

function hideGuide(refNode) {
	guideBoxNode = document.getElementById('balloon-guide');
	
	if (guideBoxNode) {
		guideBoxNode.style.display = 'none';
	}
}


// ************************************************************************
// ***                          EDIT DOT                                 **
// ************************************************************************
var curEditDot = null;
function do_showEdit(editDotID) {
	setTimeout('showEdit("' + editDotID + '")', 250)
}
function showEdit(editDotID) {
	editDotNode = document.getElementById(editDotID);

	//hide the cart before re-positioning it
	if (curEditDot != editDotNode) {
		hideCart();
	}
	curEditDot = editDotNode;

	Position.prepare();
	var editDotPos = Position.cumulativeOffset(curEditDot);
	var editDotSize = Element.getDimensions(editDotNode);

	var editBoxNode = document.getElementById('balloon-edit');
	var editBoxSize = Element.getDimensions(editBoxNode);
	
	var left = editDotPos[0] - (editBoxSize.width / 2) + (editDotSize.width / 2) + 4;
	var top = editDotPos[1] - editBoxSize.height + 10;

	var winSize = windowSize();
	var winScroll = getScrollXY();

	editBoxNode.style.left = left + 'px';
	editBoxNode.style.top = top + 'px';
	editBoxNode.style.display = 'block';

	hideOtherBalloons('edit');
	Event.observe(document, 'mousemove', checkEdit);
}

function checkEdit(e) {
	//var pos = getPosition(e);
	var pos = cursor;
	var editBoxNode = document.getElementById('balloon-edit');
	var boundsCheck = cursorInBounds(pos, curEditDot, editBoxNode, 'BELOW');

	if (boundsCheck == OUT_BOUNDS) {
		Event.stopObserving(document, 'mousemove', checkEdit);
		hideEdit(curEditDot);
	} else if (boundsCheck == ON_MOUSEOVER && editBoxNode.style.display != 'block') {
		showEdit(curEditDot);
	}
}

function checkEditClick(e) {
	//var pos = getPosition(e);
	var pos = cursor;
	var editBoxNode = document.getElementById('balloon-edit');
	var boundsCheck = cursorInBounds(pos, curEditDot, editBoxNode, 'BELOW');

	if (boundsCheck == ON_MOUSEOVER && curEditDot) {
		var href = curEditDot.getAttribute('href');

		if (href.length > 0) {
			window.location.href = href;
		}
	}
}

function hideEdit(refNode) {
	editBoxNode = document.getElementById('balloon-edit');
	
	if (editBoxNode) {
		editBoxNode.style.display = 'none';
	}
}


// ************************************************************************
// ***                         DELETE DOT                                **
// ************************************************************************
var curDeleteDot = null;
function do_showDelete(deleteDotID) {
	setTimeout('showDelete("' + deleteDotID + '")', 250)
}
function showDelete(deleteDotID) {
	deleteDotNode = document.getElementById(deleteDotID);

	//hide the cart before re-positioning it
	if (curDeleteDot != deleteDotNode) {
		hideCart();
	}
	curDeleteDot = deleteDotNode;

	Position.prepare();
	var deleteDotPos = Position.cumulativeOffset(curDeleteDot);
	var deleteDotSize = Element.getDimensions(deleteDotNode);

	var deleteBoxNode = document.getElementById('balloon-delete');
	var deleteBoxSize = Element.getDimensions(deleteBoxNode);
	
	var left = deleteDotPos[0] - (deleteBoxSize.width / 2) + (deleteDotSize.width / 2) + 4;
	var top = deleteDotPos[1] - deleteBoxSize.height + 10;

	var winSize = windowSize();
	var winScroll = getScrollXY();

	deleteBoxNode.style.left = left + 'px';
	deleteBoxNode.style.top = top + 'px';
	deleteBoxNode.style.display = 'block';

	hideOtherBalloons('delete');
	Event.observe(document, 'mousemove', checkDelete);
}

function checkDelete(e) {
	//var pos = getPosition(e);
	var pos = cursor;
	var deleteBoxNode = document.getElementById('balloon-delete');
	var boundsCheck = cursorInBounds(pos, curDeleteDot, deleteBoxNode, 'BELOW');

	if (boundsCheck == OUT_BOUNDS) {
		Event.stopObserving(document, 'mousemove', checkDelete);
		hideDelete(curDeleteDot);
	} else if (boundsCheck == ON_MOUSEOVER && deleteBoxNode.style.display != 'block') {
		showDelete(curDeleteDot);
	}
}

function checkDeleteClick(e) {
	//var pos = getPosition(e);
	var pos = cursor;
	var deleteBoxNode = document.getElementById('balloon-delete');
	var boundsCheck = cursorInBounds(pos, curDeleteDot, deleteBoxNode, 'BELOW');

	if (boundsCheck == ON_MOUSEOVER && curDeleteDot) {
		var href = curDeleteDot.getAttribute('href');

		if (href.length > 0 && confirm('Are you sure you want to DELETE this item?')) {
			window.location.href = href;
		}
	}
	
	return false;
}

function hideDelete(refNode) {
	deleteBoxNode = document.getElementById('balloon-delete');
	
	if (deleteBoxNode) {
		deleteBoxNode.style.display = 'none';
	}
}


// ************************************************************************
// ***                         PRODUCTS TABLE                            **
// ************************************************************************

var currentProductGroupID = null;
var currentContentNode = null;
var currentDetailsNode = null;
var currentDetailsTable = null;
var currentActionsNode = null;
var currentActionsTable = null;

var previousProductGroupID = null;
var previousContentNode = null;
var previousDetailsNode = null;
var previousDetailsTable = null;
var previousActionsNode = null;
var previousActionsTable = null;

var updateActionsCounter = 0;

function balloonCartClicked() {
	var cartDotId = curCartDot.getAttribute('id');
	var parts = cartDotId.split('_');
	var id = parseInt(parts[parts.length - 1], 10);
	
	itemCartClicked(id);
}

function itemCartClicked(productGroupID) {
	var detailNode = document.getElementById('product_details_table_' + productGroupID);
	if (detailNode.style.display == 'none') {
		return showProductDetailsTable(productGroupID);
	} else {
		return addToCart(productGroupID);
	}
}

function restoreActionsTable(id) {
	var actionsCellNoCart = document.getElementById('actions_cell_nocart_' + id);
	var actionsCellCart = document.getElementById('actions_cell_cart_' + id);
	var cartDot = document.getElementById('cartDot_' + id);
	
	actionsCellNoCart.className = 'actions_cell_nocart';
	cartDot.src = '/images/icons/cart.gif';
}

function updateActionsTable() {
	var actionsCellNoCart = document.getElementById('actions_cell_nocart_' + currentProductGroupID);
	var actionsCellCart = document.getElementById('actions_cell_cart_' + currentProductGroupID);
	var cartDot = document.getElementById('cartDot_' + currentProductGroupID);
	
	actionsCellNoCart.className = 'actions_cell_nocart_expanded';
	cartDot.src = '/images/icons/cart-large.gif';
}

function setPreviousItemVars(productGroupID) {
	previousProductGroupID = productGroupID;
	previousContentNode = document.getElementById('product_content_row_' + productGroupID);
	previousDetailsNode = document.getElementById('product_details_row_' + productGroupID);
	previousDetailsTable = document.getElementById('product_details_table_' + productGroupID);
	previousActionsNode = document.getElementById('list_actions_' + productGroupID);
	previousActionsTable = document.getElementById('list_actions_table_' + productGroupID);

	previousContentNode.className = previousContentNode.className.split(' ')[0] + ' product_content_row';
	previousDetailsNode.className = previousDetailsNode.className.split(' ')[0] + ' product_details_row';
}

function setCurrentItemVars(productGroupID) {
	currentProductGroupID = productGroupID;
	currentContentNode = document.getElementById('product_content_row_' + productGroupID);
	currentDetailsNode = document.getElementById('product_details_row_' + productGroupID);
	currentDetailsTable = document.getElementById('product_details_table_' + productGroupID);
	currentActionsNode = document.getElementById('list_actions_' + productGroupID);
	currentActionsTable = document.getElementById('list_actions_table_' + productGroupID);
	
	currentContentNode.className = currentContentNode.className.split(' ')[0] + ' product_content_row_outlined';
	currentDetailsNode.className = currentDetailsNode.className.split(' ')[0] + ' product_details_row_outlined';
}

function showProductDetailsTable(productGroupID) {
	hideOtherBalloons('all');

	if (cartAddedTextNode || cartAddedLinkNode) {
		setupCartAddedMessage();
	}

	var detailNodes = document.getElementsByClassName('product_details_table');
	for (var i = 0; i < detailNodes.length; i++) {

		var parentClass = detailNodes[i].parentNode.parentNode.parentNode.className;
		var counterIndex = detailNodes[i].parentNode.parentNode.parentNode.className.indexOf('_outlined');
		if (detailNodes[i].style.display != 'none' || counterIndex != -1) {
			var parts = detailNodes[i].id.split('_');
			var id = parseInt(parts[parts.length - 1], 10);

			//if (id == productGroupID) return;
			if (id != productGroupID) {
				setPreviousItemVars(id);
				restoreActionsTable(id);
				
				if (detailNodes[i].style.display != 'none') {
					if (self.Effect) {
						Effect.SlideUp(detailNodes[i].id, {duration:0.5,queue:'end'});
					} else {
						detailNodes[i].style.display = 'none';
						detailNodes[i].parentNode.parentNode.style.height = '1px';
					}
				}
			}
		}
	}

	setCurrentItemVars(productGroupID);

	if (self.Effect) {
		Effect.SlideDown(currentDetailsNode, {duration:1.0,queue:'end',afterFinish:updateActionsTable});
	} else {
		currentDetailsTable.style.height = '';
		currentDetailsTable.style.display = 'block';
		updateActionsTable();
	}
	
	var colorSelectNode = document.getElementById('color_for_' + productGroupID);
	if (colorSelectNode) {
		updateAdhesives(productGroupID, colorSelectNode);
	}
	updateQuantityLabels(productGroupID);
}


// ************************************************************************
// ***                    SELECTION/LABEL UPDATES                        **
// ************************************************************************
function updateColors(productGroupID, adhesiveSelectNode) {
	var adhesiveID = adhesiveSelectNode.options[adhesiveSelectNode.selectedIndex].value;
	var colorSelectNode = document.getElementById('color_for_' + productGroupID);
	var adhesiveColorsNode = document.getElementById('colors_product' + productGroupID + '_adhesive' + adhesiveID);
	
	if (colorSelectNode && adhesiveColorsNode) {
		var adhesiveColors = adhesiveColorsNode.value.split(',');

		//locate and add colors
		for (var i = 0; i < adhesiveColors.length; i++) {
			var colorID = parseInt(adhesiveColors[i], 10);
			var colorFound = false;

			for (var j = 0; j < colorSelectNode.options.length; j++) {
				if (colorSelectNode.options[j].value == colorID) {
					colorFound = true;
				}
			}
			
			if (colorID != 0 && !colorFound) {
				var newOption = new Option();
				newOption.value = colorID;
				newOption.text = colors[colorID];
				colorSelectNode.options[colorSelectNode.options.length] = newOption;
			}
		}

		//locate and remove colors
		for (var i = 0; i < colorSelectNode.options.length; i++) {
			var colorID = parseInt(colorSelectNode.options[i].value, 10);
			var colorFound = false;

			for (var j = 0; j < adhesiveColors.length; j++) {
				if (colorID == adhesiveColors[j]) {
					colorFound = true;
				}
			}
			
			if (!colorFound) {
				colorSelectNode.options[i] = null;
			}
		}
	}

}

function updateAdhesives(productGroupID, colorSelectNode) {
	var colorID = colorSelectNode.options[colorSelectNode.selectedIndex].value;
	var adhesiveSelectNode = document.getElementById('adhesive_for_' + productGroupID);
	var colorAdhesivesNode = document.getElementById('adhesives_product' + productGroupID + '_color' + colorID);
	
	if (adhesiveSelectNode && colorAdhesivesNode) {
		var colorAdhesives = colorAdhesivesNode.value.split(',');
		
		//locate and add adhesives
		for (var i = 0; i < colorAdhesives.length; i++) {
			var adhesiveID = parseInt(colorAdhesives[i], 10);
			var adhesiveFound = false;

			for (var j = 0; j < adhesiveSelectNode.options.length; j++) {
				if (adhesiveSelectNode.options[j].value == adhesiveID) {
					adhesiveFound = true;
				}
			}
			
			if (adhesiveID != 0 && !adhesiveFound) {
				var newOption = new Option();
				newOption.value = adhesiveID;
				newOption.text = adhesives[adhesiveID];
				adhesiveSelectNode.options[adhesiveSelectNode.options.length] = newOption;
			}
		}

		//locate and remove adhesives
		for (var i = 0; i < adhesiveSelectNode.options.length; i++) {
			var adhesiveID = parseInt(adhesiveSelectNode.options[i].value, 10);
			var adhesiveFound = false;

			for (var j = 0; j < colorAdhesives.length; j++) {
				if (adhesiveID == colorAdhesives[j]) {
					adhesiveFound = true;
				}
			}
			
			if (!adhesiveFound) {
				adhesiveSelectNode.options[i] = null;
			}
		}
	}

}

function updateQuantityLabels(productGroupID) {
	var quantityLabel = document.getElementById('qty_label_for_' + productGroupID);
	var minOrderLabel = document.getElementById('qty_min_for_' + productGroupID);
	var colorSelectNode = document.getElementById('color_for_' + productGroupID);
	var adhesiveSelectNode = document.getElementById('adhesive_for_' + productGroupID);
	var detailsNode = document.getElementById('product_details_table_' + productGroupID);
	var inputNodes = detailsNode.getElementsByTagName('input');

	var productHash = '_product' + productGroupID;
	var partFound = false;
	
	productHash = productHash + '_adhesive';
	productHash = adhesiveSelectNode ? productHash + adhesiveSelectNode.options[adhesiveSelectNode.selectedIndex].value : productHash + '0';
	productHash = productHash + '_color';
	productHash = colorSelectNode ? productHash + colorSelectNode.options[colorSelectNode.selectedIndex].value : productHash + '0';
	productHash = productHash + '_part';
	for (var i = 0; i < inputNodes.length && !partFound; i++) {
		if (inputNodes[i].id.indexOf('product' + productGroupID) == 0 && inputNodes[i].checked) {
			productHash = productHash + inputNodes[i].value;
			partFound = true;
		}
	}
	if (!partFound) productHash = productHash + '0';
	
	var rollSizeNode = document.getElementById('rollSize' + productHash);
	var rollQuantityNode = document.getElementById('rollQuantity' + productHash);
	var minOrderNode = document.getElementById('minOrder' + productHash);
	var unitNode = document.getElementById('unit' + productHash);
	
	if (!rollSizeNode || !rollQuantityNode || !minOrderNode) {
		productHash = '_product' + productGroupID;
		rollSizeNode = document.getElementById('rollSize' + productHash);
		rollQuantityNode = document.getElementById('rollQuantity' + productHash);
		minOrderNode = document.getElementById('minOrder' + productHash);
		unitNode = document.getElementById('unit' + productHash);
	}

	var unit = '';
	if (unitNode.value != '') {
		unit = ' ' + unitNode.value;
	}

	var minOrder = parseInt(minOrderNode.value, 10);
	var rollSize = parseInt(rollSizeNode.value, 10);

	quantityLabel.innerHTML = rollSize > 1 ? 'Quantity (in multiples of ' + rollSizeNode.value + unit + ')&nbsp;&nbsp;' : 'Quantity&nbsp;&nbsp;';
	minOrderLabel.innerHTML = minOrder > 1 ? 'minimum ' + minOrder + '' + unit + '' : '';
}


// ************************************************************************
// ***                        PURCHASE ACTIONS                           **
// ************************************************************************
var cartAddedTextNode = null;
var cartAddedLinkNode = null;
var updatingCartAddedMessage = false;
function setupCartAddedMessage(textParentNode, linkParentNode) {
	var cartAddedTextParent = !cartAddedTextNode ? null : cartAddedTextNode.parentNode;
	var cartAddedLinkParent = !cartAddedLinkNode ? null : cartAddedLinkNode.parentNode;
	
	if (cartAddedTextParent && cartAddedTextParent != textParentNode) {
		cartAddedTextParent.removeChild(cartAddedTextNode);
		cartAddedTextNode = null;
	}
	if (cartAddedLinkParent && cartAddedLinkParent != linkParentNode) {
		cartAddedLinkParent.removeChild(cartAddedLinkNode);
		cartAddedLinkNode = null;
	}

	if (!updatingCartAddedMessage && textParentNode && cartAddedTextParent != textParentNode) {
		updatingCartAddedMessage = true;

		//Create cart added message
		var cartAddedNode = document.createElement("div");
		var cartAddedText = document.createTextNode('Item has been added to your shopping cart.');

		cartAddedNode.setAttribute('id', 'cart_added_message');
		cartAddedNode.className = 'cart_added_message';

		cartAddedNode.appendChild(cartAddedText);
		textParentNode.appendChild(cartAddedNode);
		
		cartAddedTextNode = cartAddedNode;
		updatingCartAddedMessage = false;
	}

	if (!updatingCartAddedMessage && linkParentNode && cartAddedLinkParent != linkParentNode) {
		updatingCartAddedMessage = true;

		//Create view cart link
		var cartViewNode = document.createElement("div");
		var cartViewText = document.createTextNode('\u00a0');

		cartViewNode.setAttribute('id', 'cart_added_link');
		cartViewNode.className = 'cart_added_link';

		cartViewNode.appendChild(cartViewText);
		linkParentNode.appendChild(cartViewNode);
		
		cartAddedLinkNode = cartViewNode;
		updatingCartAddedMessage = false;
	}

}

function addToCart(productGroupID) {
	var detailsNode = document.getElementById('product_details_row_' + productGroupID);
	var colorNode = document.getElementById('color_for_' + productGroupID);
	var adhesiveNode = document.getElementById('adhesive_for_' + productGroupID);
	var quantityNode = document.getElementById('quantity_for_' + productGroupID);
	var inputNodes = detailsNode.getElementsByTagName('input');
	
	var colorID = null;
	var adhesiveID = null;
	var quantity = parseInt(quantityNode.value, 10);

	if (colorNode && colorNode.selectedIndex >= 0) {
		colorID = colorNode.options[colorNode.selectedIndex].value;
	} else if (colorNode) {
		alert('You must choose a color!');
		return;
	} else {
		colorID = '';
	}
	
	if (adhesiveNode && adhesiveNode.selectedIndex >= 0) {
		adhesiveID = adhesiveNode.options[adhesiveNode.selectedIndex].value;
	} else if (adhesiveNode) {
		alert('You must choose an adhesive!');
		return;
	} else {
		adhesiveID = '';
	}
	
	var partsFound = new Array();
	var partsSelected = new Array();
	var partsDeclined = new Array();
	var partsFoundCount = 0;
	var partsSelectedCount = 0;
	var partsDeclinedCount = 0;
	for (var i = 0; i < inputNodes.length; i++) {
		if (inputNodes[i].id.indexOf('product' + productGroupID) == 0) {
			partsFound[partsFoundCount] = inputNodes[i].value;
			partsFoundCount++;
			if (inputNodes[i].checked) {
				partsSelected[partsSelectedCount] = inputNodes[i].value;
				partsSelectedCount++;
			} else {
				partsDeclined[partsDeclinedCount] = inputNodes[i].value;
				partsDeclinedCount++;
			}
		}
	}
	
	if (partsSelected.length == 0 && partsFound.length > 0) {
		alert('You must choose a part type!');
		return;
	}

	var question = '';
	var counter = 0;
	var declinedPartsCount = 0;
	while (partsFound.length > partsSelected.length + declinedPartsCount) {
		question = 'You have chosen ';
		for (var i = 0; i < partsSelected.length; i++) {
			if (partsSelected.length > 2 && i > 0) question = question + ', ';
			if (partsSelected.length == 2 && i > 0) question = question + ', ';
			question = question + parts[partsSelected[i]];
		}
		question = question + '.';

		if (confirm(question + ' Would you also like to purchase ' + parts[partsDeclined[counter]] + '?')) {
			var checkboxNode = document.getElementById('product' + productGroupID + '_part' + partsDeclined[counter]);
			if (checkboxNode) {
				checkboxNode.checked = true;
				partsSelected[partsSelectedCount] = checkboxNode.value;
				partsSelectedCount++;
			} else {
				declinedPartsCount++;
			}
		} else {
			declinedPartsCount++;
		}
		counter++;
	}
	
	
	var productHashStrs = new Array();
	if (partsSelected.length == 0) {
		productHashStrs[0] = '_product' + productGroupID + '_adhesive' + adhesiveID + '_color' + colorID + '_part';
	} else {
		for (var i = 0; i < partsSelected.length; i++) {
			productHashStrs[i] = '_product' + productGroupID + '_adhesive' + adhesiveID + '_color' + colorID + '_part' + partsSelected[i];
		}
	}

	var productInfoNode = null;
	var rollSizeNode = null;
	var rollQuantityNode = null;
	var minOrderNode = null;
	for (var i = 0; i < productHashStrs.length; i++) {
		productInfoNode = document.getElementById('sku' + productHashStrs[i]);
		rollSizeNode = document.getElementById('rollSize' + productHashStrs[i]);
		rollQuantityNode = document.getElementById('rollQuantity' + productHashStrs[i]);
		minOrderNode = document.getElementById('minOrder' + productHashStrs[i]);

		var rollSize = rollSizeNode ? parseInt(rollSizeNode.value, 10) : 0;
		var rollQuantity = rollQuantityNode ? parseInt(rollQuantityNode.value, 10) : 0;
		var minOrder = minOrderNode ? parseInt(minOrderNode.value, 10) : 0;

		if (!productInfoNode) {
			alert('Invalid product selection!\n' + productHashStrs[i]);
			return;
		} else if (quantity < minOrder) {
			alert('Quantity must be larger than ' + minOrder);
			return;
		} else if (rollSize > 0 && quantity % rollSize != 0) {
			alert('Quantity must be multiple of ' + rollSize);
			return;
		} else {
			do_addToCart(productInfoNode.value, quantity);
		}
	}
	
}


// ************************************************************************
// ***                        DEFAULT ACTIONS                            **
// ************************************************************************
if (self.Event && Event.observe) {
	Event.observe(document, 'mousemove', getPosition);
}



// ************************************************************************
// ***                       POPUP WINDOW                               ***
// ************************************************************************

function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}


// ************************************************************************
// ***                       TOGGLE LAYER                               ***
// ************************************************************************

function toggleObject(objectID) {
	var el = document.getElementById(objectID);
	if (!el) return;

	if ( el.style.display != 'none' ) {
		el.style.display = 'none';
	}
	else {
		el.style.display = '';
	}
}


// ************************************************************************
// ***                      IMAGE PRE-LOADER                            ***
// ************************************************************************

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}


// ************************************************************************
// ***                          SWAP IMAGES                             ***
// ************************************************************************

function MM_findObj(n, d) { //v4.0
	var p,i,x;	if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
		d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
	if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
	for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
	if(!x && document.getElementById) x=document.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
	var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
	 if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
	
function MM_swapImgRestore() { //v3.0
	var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}



// ************************************************************************
// ***                        OPEN NEW WINDOW                           ***
// ************************************************************************

function MM_openBrWindow(theURL,winName,features) { //v2.0
	window.open(theURL,winName,features);
}


