
	var _galleryNodes = null;
	var _viewableNodes = null;
	var _categories = Array("rings", "earrings", "brooches", "necklaces_and_pendants", "bracelets", "cufflinks_and_tie_pins");
	var _subCategories = Array("engagement_rings", "wedding_anniversary_rings", "mens_rings", "other_rings");
	var _selectedCategory = null;
	var _itemsPerPage = null;
	var _pageCount = null;
	var _selectedPage = 1;
	var _expandedItem = null;

	function loadGallery() {
		_galleryNodes = getGalleryNodes();
		//removeThumbnailImages();
	}

function alignGallery() {return;
	if(_viewableNodes == null || _viewableNodes.length == 0)
		return;

	var contentNode = document.getElementById("content");
	var galleryLeft = getElementPosition(_viewableNodes[0]).x;
	var galleryRight = 0;

	var firstRowY = getElementPosition(_viewableNodes[0]).y;
	var i = 0;
	while(i < _viewableNodes.length && getElementPosition(_viewableNodes[i]).y == firstRowY) {
		galleryRight = getElementPosition(_viewableNodes[i]).x + _viewableNodes[i].offsetWidth + 10;
		i++;
	}
	contentNode.style.paddingLeft = (contentNode.clientWidth - galleryRight + galleryLeft) / 2 + "px";
}

	function getGalleryNodes() {
		var galleryNode = document.getElementById("gallery");
		var itemNodes = galleryNode.childNodes;
		var galleryNodes = new Array();
		for(var i = 0; i < itemNodes.length; i++) {
			if(itemNodes.item(i).tagName == "LI")
				galleryNodes.push(itemNodes.item(i));
		}
		return galleryNodes;
	}

	// function removeThumbnailImages() {
		// for(var i = 0; i < _galleryNodes.length; i++) {
			// var tumbNodes = _galleryNodes[i].getElementsByTagName("li");
			// for(var j = 0; j < tumbNodes.length; j++) {
				// tumbNodes.item(j).firstChild.src = "";
			// }
		// }
	// }

	function setThumbnailsImagePath(galleryNode) {
		var tumbNodes = galleryNode.getElementsByTagName("li");
		for(var i = 0; i < tumbNodes.length; i++) {
			if(tumbNodes.item(i).firstChild.src == "")
				tumbNodes.item(i).firstChild.src = tumbNodes.item(i).firstChild.getAttribute("image_path");
		}
	}

	function displayGallery() {
		var contentNode = document.getElementById("content");
		var galleryNode = document.getElementById("gallery");
		_itemsPerPage = null;
		_viewableNodes = new Array();
		var lastItemPos = new Vector(0, 0);
		var itemWidth = null;
		var itemHeight = null;

		for(var i = 0; i < _galleryNodes.length; i++) {
			//if(_galleryNodes[i].offsetHeight > 0)
				//_galleryNodes[i].style.display = "none";
				if(_galleryNodes[i].parentNode == galleryNode)
					galleryNode.removeChild(_galleryNodes[i]);
		}

		for(var i = 0; i < _galleryNodes.length; i++) {
			if(_selectedCategory == null || isItemInCategory(_galleryNodes[i], _selectedCategory)) {
				_viewableNodes.push(_galleryNodes[i]);

				if(itemHeight != null && lastItemPos.x + itemWidth > contentNode.clientWidth)
					lastItemPos.y += itemHeight;

				if(itemHeight != null && lastItemPos.y + itemHeight > document.body.clientHeight - 15) {
					if(_itemsPerPage == null)
						_itemsPerPage = _viewableNodes.length - 1;
				} else {
					//_galleryNodes[i].style.display = "block";
					galleryNode.appendChild(_galleryNodes[i]);
					lastItemPos = getElementPosition(_galleryNodes[i]);
					setThumbnailsImagePath(_galleryNodes[i]);
				}

				if(itemHeight == null) {
					itemWidth = _galleryNodes[i].offsetWidth + 10;
					itemHeight = _galleryNodes[i].offsetHeight + 10;
				}
			}
		}
		if(_itemsPerPage == null)
			_itemsPerPage = _viewableNodes.length;
		_pageCount = Math.ceil(_viewableNodes.length / _itemsPerPage);
		_selectedPage = 1;

		// generate page navigation
		var pageNavigationNode = document.getElementById("pageNavigation");
		if(_pageCount > 1) {
			updatePageNavigation();
			//pageNavigationNode.style.display = "";
			pageNavigationNode.style.visibility = "visible";
		} else {
			//pageNavigationNode.style.display = "none";
			pageNavigationNode.style.visibility = "hidden";
		}
	}

	function updatePageNavigation() {
		var pageNavigationNode = document.getElementById("pageNavigation");
		var pageLinkNodes = pageNavigationNode.getElementsByTagName("td");
		pageLinkNodes.item(1).innerHTML = "page " + _selectedPage + " of " + _pageCount;
		pageLinkNodes.item(0).firstChild.className = (_selectedPage == 1) ? "selected" : "";
		pageLinkNodes.item(2).firstChild.className = (_selectedPage == _pageCount) ? "selected" : "";
	}

	function showNextPage() {
		if(_selectedPage < _pageCount) {
			_selectedPage++;
			showPage(_selectedPage);
		}
	}

	function showPrevPage() {
		if(_selectedPage > 1) {
			_selectedPage--;
			showPage(_selectedPage);
		}
	}

	function showPage(pageNumber) {
		var galleryNode = document.getElementById("gallery");
		for(var i = 0; i < _viewableNodes.length; i++)
			if(_viewableNodes[i].parentNode == galleryNode)
				galleryNode.removeChild(_viewableNodes[i]);
			//_viewableNodes[i].style.display = "none";
		var i = (pageNumber - 1) * _itemsPerPage;
		while(i < _viewableNodes.length && i < (pageNumber) * _itemsPerPage) {
			//_viewableNodes[i].style.display = "block";
			galleryNode.appendChild(_viewableNodes[i]);
			setThumbnailsImagePath(_viewableNodes[i]);
			i++;
		}
		updatePageNavigation();
	}

	function isItemInCategory(galleryNode, category) {
		return isNodeInClass(galleryNode, category);
	}

	function highlightItem(itemNode) {
		if(_expandedItem != null)
			return;

		var items = document.getElementsByTagName("ul");
		for(var i = 0; i < items.length; i++) {
			if(items.item(i).className.indexOf("hover") >= 0 || items.item(i).className.indexOf("visited") >= 0)
				items.item(i).className = "thumbnails";
		}

		itemNode.className += " hover";
	}

	function unhighlightItem(itemNode) {
		if(_expandedItem != null)
			return;
		itemNode.className = "thumbnails";
	}

	function expandItem(itemNode) {
		// Cancel action if some item is already expanded
		if(_expandedItem != null)
			return;

		itemNode.className += "thumbnails visited";

		while(itemNode.tagName != "LI")
			itemNode = itemNode.parentNode;

		var newNode = itemNode.cloneNode(true);
		newNode.className = "expanded";
		newNode.id = "popup";
		itemNode.parentNode.appendChild(newNode);

		_expandedItem = itemNode;

		var bodyNode = document.getElementsByTagName("body").item(0);

		var delta = Math.min(bodyNode.clientHeight - newNode.offsetHeight - 10, bodyNode.clientWidth - newNode.offsetWidth - 10);
		if(delta < 0) {
			var imageNodes = newNode.getElementsByTagName("img");
			for(var i = 0; i < imageNodes.length; i++) {
				if(imageNodes.item(i).className == "large") {
					imageNodes.item(i).style.width = imageNodes.item(i).offsetWidth + delta;
					imageNodes.item(i).style.height = imageNodes.item(i).offsetHeight + delta;
				}
			}
		}
		
		newNode.style.left = (bodyNode.clientWidth - newNode.offsetWidth) / 2 + bodyNode.scrollLeft;
		newNode.style.top = (bodyNode.clientHeight - newNode.offsetHeight) / 2 + bodyNode.scrollTop;

		hideHeader();
		showOverlay();
	}

	function collapseItem(closeNode) {
		var itemNode = closeNode;

		// Find popup root node
		while(itemNode.className != "expanded")
			itemNode = itemNode.parentNode;
		
		// Find currently visible thumbnail
		var thumbnails = itemNode.getElementsByTagName("li");
		var curThumbIndex = 0;
		while(curThumbIndex < thumbnails.length && thumbnails.item(curThumbIndex).className != "visible")
			curThumbIndex++;
		if(curThumbIndex >= thumbnails.length)
			curThumbIndex = -1;
			
		// Clear currently visible thumbnail in corresponding gallery item
		thumbnails = _expandedItem.getElementsByTagName("li");
		for(var i = 0; i < thumbnails.length; i++)
			thumbnails.item(i).className = "";

		// Set currently visible thumbnail in corresponding gallery item to the last selected thumbnail in popup
		if(curThumbIndex >= 0)
			thumbnails.item(curThumbIndex).className = "visible";

		// Delete popup
		itemNode.parentNode.removeChild(itemNode);
		_expandedItem = null;

		hideOverlay();
		showHeader();
	}

	function alignExpandedItem() {
		if(_expandedItem == null)
			return;

		var popupNode = document.getElementById("popup");
		var bodyNode = document.getElementsByTagName("body").item(0);

		var delta = Math.min(bodyNode.clientHeight - popupNode.offsetHeight - 10, bodyNode.clientWidth - popupNode.offsetWidth - 10);

		var imageNodes = popupNode.getElementsByTagName("img");
		for(var i = 0; i < imageNodes.length; i++) {
			if(imageNodes.item(i).className == "large") {
				delta = Math.min(delta, 600 - Math.max(imageNodes.item(i).offsetWidth, imageNodes.item(i).offsetHeight));
				imageNodes.item(i).style.width = Math.max(0, imageNodes.item(i).offsetWidth + delta);
				imageNodes.item(i).style.height = Math.max(0, imageNodes.item(i).offsetHeight + delta);
			}
		}
		
		popupNode.style.left = (bodyNode.clientWidth - popupNode.offsetWidth) / 2;// + bodyNode.scrollLeft;
		popupNode.style.top = (bodyNode.clientHeight - popupNode.offsetHeight) / 2;// + bodyNode.scrollTop;

		var overlayNode = document.getElementById("overlay");
		overlayNode.style.height = (overlayNode.offsetHeight < bodyNode.scrollHeight) ? bodyNode.scrollHeight : "100%";
		overlayNode.style.width = (overlayNode.offsetWidth < bodyNode.scrollWidth) ? bodyNode.scrollWidth : "100%";
	}

	function switchItemView(thumbnailNode) {
		if(thumbnailNode.className != "visible") {
			var thumbnails = thumbnailNode.parentNode.getElementsByTagName("li");
			for(var i = 0; i < thumbnails.length; i++)
				thumbnails.item(i).className = "";
			thumbnailNode.className = "visible";
		}
		var pathToLargeImage = thumbnailNode.getAttribute("path_to_large_image");
		var largeImageNode = thumbnailNode.parentNode.parentNode.parentNode.getElementsByTagName("td").item(0).firstChild;
		largeImageNode.src = pathToLargeImage;			
	}

	function showOverlay() {
		var overlayNode = document.getElementById("overlay");
		var bodyNode = document.getElementsByTagName("body").item(0);

		if(overlayNode.offsetHeight < bodyNode.scrollHeight)
			overlayNode.style.height = bodyNode.scrollHeight;
		if(overlayNode.offsetWidth < bodyNode.scrollWidth)
			overlayNode.style.width = bodyNode.scrollWidth;

		overlayNode.style.visibility = "visible";
		overlayNode.style.display = "block";

		var scrollPosX = document.body.scrollLeft;
		var scrollPosY = document.body.scrollTop;
		document.body.style.overflow = "hidden";
		document.body.scrollLeft = scrollPosX;
		document.body.scrollTop = scrollPosY;
	}

	function hideOverlay() {
		var overlayNode = document.getElementById("overlay");
		overlayNode.style.visibility = "hidden";
		overlayNode.style.display = "none";
		document.body.style.overflow = "auto";
	}

	function hideHeader() {
		var flashNode = document.getElementById("header_flash");
		flashNode.style.visibility = "hidden";
	}

	function showHeader() {
		var flashNode = document.getElementById("header_flash");
		flashNode.style.visibility = "visible";
	}

	function getTargetNode(evt) {
		if("target" in evt)
			return evt.target; //Mozilla
		else
			return evt.srcElement; //IE
	}

	function hideAllSubMenus() {
		var menuNodes = document.getElementById("menu").getElementsByTagName("table");
		for(var i = 0; i < menuNodes.length; i++) {
			if(isNodeInClass(menuNodes.item(i), "gallery_sub_menu"))
				menuNodes.item(i).style.display = "none";
		}
	}

	function showCategory(categoryClassName) {
		document.getElementById("menu_item_" + ((_selectedCategory != null) ? _selectedCategory : "all")).className = "";
		_selectedCategory = categoryClassName;
		document.getElementById("menu_item_" + ((_selectedCategory != null) ? _selectedCategory : "all")).className = "selected";

		var menuNodes = document.getElementById("menu").getElementsByTagName("table");
		for(var i = 0; i < menuNodes.length; i++) {
			if(isNodeInClass(menuNodes.item(i), "gallery_sub_menu")) {
				if(categoryClassName != null && isNodeInClass(menuNodes.item(i), categoryClassName))
					menuNodes.item(i).style.display = "";
				else
					menuNodes.item(i).style.display = "none";
			}
		}

		displayGallery();			
		document.getElementById("noItems").style.display = (_viewableNodes.length == 0) ? "block" : "none";
	}

	function showSubCategory(categoryClassName) {
		document.getElementById("menu_item_" + ((_selectedCategory != null) ? _selectedCategory : "all")).className = "";
		_selectedCategory = categoryClassName;
		document.getElementById("menu_item_" + ((_selectedCategory != null) ? _selectedCategory : "all")).className = "selected";

		displayGallery();
		document.getElementById("noItems").style.display = (_viewableNodes.length == 0) ? "block" : "none";
	}


