
var gCatalogPages = new Array;
var gCurrentPage = null;

var gNavInput = new Array;
var gNavPrevAnchor = new Array;
var gNavNextAnchor = new Array;
var gNavPageAnchor = new Array;
var gNavDiv = new Array;

var gSearchInput = null;
var gSearchButton = null;
var gSearchResultsDiv = null;

function CatalogInit() {
	var content = document.getElementById('pages');
	var pages = content.getElementsByTagName('div');
	var p = 1;
	
	for (var i = 0; i < pages.length; ++i) {
		var page = pages[i];
		if (page.className == 'page') {
			var items = page.getElementsByTagName('a');
			
			gCatalogPages[p] = page;
			page.style.display = 'none';
			
			for (var j = 0; j < items.length; ++j) {
				var item = items[j];
				
				if (item.className == 'item') {
					item.pageNumber = p;
					
					/*var thumbnail = item.getElementsByTagName('img')[0];*/
					var description = item.getElementsByTagName('span')[0];
					/*
					if (thumbnail && thumbnail.className == 'thumbnail') {
						item.thumbnail = thumbnail;
						*/
						CatalogEventRegister(item, 'mouseover', CatalogItemOnMouseOver);
						CatalogEventRegister(item, 'mouseout', CatalogItemOnMouseOut);
						/*
					}
					*/
					if (description && description.className == 'description') {
						item.description = description;
						description.style.display = 'none';
					}
				}
			}
			
			++p;
		}
	}
	
	gSearchInput = document.getElementById('search-input');	
	gSearchButton = document.getElementById('search-button');
	gSearchResultsDiv = document.getElementById('search-results');
	
	gNavInput[0] = document.getElementById('navigation-top-input');
	gNavInput[1] = document.getElementById('navigation-bottom-input');
	
	gNavPrevAnchor[0] = document.getElementById('navigation-top-prev');
	gNavPrevAnchor[1] = document.getElementById('navigation-bottom-prev');
	gNavNextAnchor[0] = document.getElementById('navigation-top-next');
	gNavNextAnchor[1] = document.getElementById('navigation-bottom-next');
	
	gNavPageAnchor[0] = new Array;
	gNavPageAnchor[1] = new Array;
	
	gNavPageAnchor[0][0] = document.getElementById('navigation-top-a');
	gNavPageAnchor[0][1] = document.getElementById('navigation-top-b');
	gNavPageAnchor[0][2] = document.getElementById('navigation-top-c');
	gNavPageAnchor[0][3] = document.getElementById('navigation-top-d');
	
	gNavPageAnchor[1][0] = document.getElementById('navigation-bottom-a');
	gNavPageAnchor[1][1] = document.getElementById('navigation-bottom-b');
	gNavPageAnchor[1][2] = document.getElementById('navigation-bottom-c');
	gNavPageAnchor[1][3] = document.getElementById('navigation-bottom-d');
	
	gNavDiv[0] = document.getElementById('navigation-top-div');
	gNavDiv[1] = document.getElementById('navigation-bottom-div');
	
	
	var currentPage = parseInt(window.location.hash.substring(1));
	if (isNaN(currentPage))
		currentPage = 1;
	
	CatalogPageSwitch(currentPage);
}

function CatalogShowPreview(item) {
	var previewWindow = window.open(
		'',
		'CatalogPreviewWindow',
		'height=500,width=500,left=100,top=100,resizable=yes,scrollbars=yes,toolbar=no,menubar=no,location=no,directories=no,status=yes'
	);
	
	previewWindow.document.writeln('<?xml version="1.0" encoding="utf-8" ?>');
	previewWindow.document.writeln('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">');
	previewWindow.document.writeln('<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">');
	previewWindow.document.writeln('	<head>');
	previewWindow.document.writeln('		<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />');
	previewWindow.document.writeln('		<title>T.R. McTaggart - Screenprint & Embroidery - Collection 2009</title>');
	previewWindow.document.writeln('		<meta name="description" content="T.R. McTaggart - Screenprint & Embroidery - Collection 2009" />');
	previewWindow.document.writeln('		<link rel="stylesheet" type="text/css" media="screen" href="catalog.css" />');
	previewWindow.document.writeln('	</head>');
	previewWindow.document.writeln('	<body>');
	previewWindow.document.writeln('		<div class="preview-item">');
	
	if (!item.code)
		item.code = item.description.getElementsByTagName('span')[0].innerHTML;
	
	previewWindow.document.writeln('<img src="thumbs/' + item.code + '.jpg" alt="" />');
	previewWindow.document.writeln('<span class="description">');
	previewWindow.document.writeln(item.description.innerHTML);
	previewWindow.document.writeln('</span>');
	
	previewWindow.document.writeln('		</div>');
	previewWindow.document.writeln('	</body>');
	previewWindow.document.writeln('</html>');
	
	previewWindow.document.close();
}

function CatalogPageSwitch(page) {
	if (page != gCurrentPage) {
		var items = gCatalogPages[page].getElementsByTagName('a');
			
		for (var i = 0; i < items.length; ++i) {
			var item = items[i];
			
			if (item.className == 'item') {
				if (!item.thumbnail)
				{
					item.thumbnail = document.createElement('img');
					item.thumbnail.className = 'thumbnail';
				
					item.code = item.description.getElementsByTagName('span')[0].innerHTML;
					item.thumbnail.src = 'thumbs/' + item.code + '.jpg';
					
					item.insertBefore(item.thumbnail, item.description);
				}
				
				item.onclick = function() {
					CatalogShowPreview(this);
					return false;
				}
			}
		}
	
		if (gCatalogPages[page]) {
			if (gCatalogPages[gCurrentPage])
				gCatalogPages[gCurrentPage].style.display = 'none';
	
			gCurrentPage = page;
			window.location.hash = gCurrentPage;
	
			if (gCatalogPages[gCurrentPage])
				CatalogStyleRemove(gCatalogPages[gCurrentPage], 'display');
			
			CatalogUpdateNav();
		}
	}
}

function CatalogGoToPageA()
{
	var pageNumber = parseInt(gNavInput[0].value);
	
	if (!isNaN(pageNumber) && pageNumber > 0 && pageNumber < gCatalogPages.length)
		CatalogPageSwitch(pageNumber);
}

function CatalogGoToPageB()
{
	var pageNumber = gNavInput[1].value;
	
	if (!isNaN(pageNumber) && pageNumber > 0 && pageNumber < gCatalogPages.length)
		CatalogPageSwitch(pageNumber);
}

function CatalogUpdateNav() {
	for (var i = 0; i < 2; ++i) {
		gNavPrevAnchor[i].href = 'index.html#' + (gCurrentPage - 1);
		gNavPrevAnchor[i].onclick = function() {
			CatalogPageSwitch(gCurrentPage - 1);
			return false;
		};
		
		gNavNextAnchor[i].href = 'index.html#' + (gCurrentPage + 1);
		gNavNextAnchor[i].onclick = function() {
			CatalogPageSwitch(gCurrentPage + 1);
			return false;
		};
		
		
		var aPage = new Array;
		aPage[0] = gCurrentPage - 1;
		if (aPage[0] < 1) {
			aPage[0] = 1;
			
			for (var j = 0; j < 3; ++j)
				aPage[j + 1] = aPage[j] + 1;
			aPage[3] = (gCatalogPages.length - 1);
		} else if (gCurrentPage > (gCatalogPages.length - 4)) {
			aPage[0] = 1;
			aPage[1] = 2;
			aPage[2] = 3;
			aPage[3] = (gCatalogPages.length - 1);
			
			for (var j = 3; j >= 0; --j)
				aPage[j - 1] = aPage[j] - 1;
		} else {
			for (var j = 0; j < 3; ++j)
				aPage[j + 1] = aPage[j] + 1;
			aPage[3] = (gCatalogPages.length - 1);
		}
		
		
		for (var j = 0; j < 4; ++j) {
			gNavPageAnchor[i][j].href = 'index.html#' + aPage[j];
			gNavPageAnchor[i][j].innerHTML = aPage[j];
			if (aPage[j] == gCurrentPage) gNavPageAnchor[i][j].className = 'current';
			else gNavPageAnchor[i][j].className = '';
		}
		
		gNavPageAnchor[i][0].onclick = function() {
			CatalogPageSwitch(aPage[0]);
			return false;
		};
		gNavPageAnchor[i][1].onclick = function() {
			CatalogPageSwitch(aPage[1]);
			return false;
		};
		gNavPageAnchor[i][2].onclick = function() {
			CatalogPageSwitch(aPage[2]);
			return false;
		};
		gNavPageAnchor[i][3].onclick = function() {
			CatalogPageSwitch(aPage[3]);
			return false;
		};
	}
}

function CatalogSearch() {
	var searchwords = gSearchInput.value.split(' ');

	gSearchResultsDiv.innerHTML = '';
	
	var content = document.getElementById('pages');
	var items = content.getElementsByTagName('a');
	
	for (var i = 0; i < items.length; ++i) {
		var item = items[i];
		if (item.className == 'item') {
			var relevance = 0;
		
			if (! item.tags) {
				item.keywords = '';
				
				var spans = item.description.getElementsByTagName('span');
				
				for (var j = 0; j < spans.length; ++j) {
					span = spans[j];
					item.keywords += ' ' + span.innerHTML;
				}
				
				item.keywords = item.keywords.split(' ');
			}
			
			for (var j = 0; j < searchwords.length; ++j) {
				var searchword = searchwords[j];
				
				if (searchword && searchword != '') {
					var found = false;
					searchword = searchword.toLowerCase();
					
					for (var k = 0; k < item.keywords.length; ++k) {
						var keyword = item.keywords[k];
						
						if (keyword && keyword != '') {
							keyword = keyword.toLowerCase();
							
							if (keyword == searchword) {
								relevance += (20 / (k / 10));
								found = true;
							} else if (keyword.indexOf(searchword) == 0) {
								relevance += (15 / (k / 10));
								found = true;
							} else if (searchword.indexOf(keyword) == 0) {
								relevance += (10 / (k / 10));
								found = true;
							} else if (keyword.indexOf(searchword) != -1) {
								relevance += (6 / (k / 10));
								found = true;
							} else if (searchword.indexOf(keyword) != -1) {
								relevance += (4 / (k / 10));
								found = true;
							}
						}
					}
					
					if (! found)
						relevance += -5;
				}
			}
		
			if (relevance > 0) {
				var result = CatalogCreateElement('a', 'item');
			
				/*result.thumbnail =
					CatalogCreateElement('img', 'thumbnail', item.thumbnail.innerHTML);*/
				result.description =
					CatalogCreateElement('div', 'description', item.description.innerHTML);
			
				/*result.appendChild(result.thumbnail);*/
				result.appendChild(result.description);
				result.relevance = relevance;
				result.pageNumber = item.pageNumber;
				result.href = '#' + result.pageNumber;
				
				result.onclick = function() {
					CatalogPageSwitch(this.pageNumber);
					return false;
				}
			
				var prevResult = gSearchResultsDiv.firstChild;
			
				while (prevResult && prevResult.nextSibling) {
					if (prevResult.relevance && prevResult.relevance < result.relevance)
						break;
					
					prevResult = prevResult.nextSibling;
				}
				
				if ((! prevResult) || (! prevResult.relevance))
					gSearchResultsDiv.appendChild(result);
				else if (prevResult.relevance > result.relevance)
					gSearchResultsDiv.appendChild(result);
				else
					gSearchResultsDiv.insertBefore(result, prevResult);
			}
		}
	}
}

function CatalogCreateElement(tag, className, innerHTML) {
	element = document.createElement(tag);
	if (className) element.className = className;
	if (innerHTML) element.innerHTML = innerHTML;
	
	return element;
}

function CatalogItemOnMouseOut(event) {
	var e = event || window.event;
	var item = CatalogItemForEventTarget(e.target || e.srcElement);
	var related = CatalogItemForEventTarget(e.relatedTarget || e.toElement);
	
	if (item && item != related) {
		CatalogSetOpacity(item.thumbnail, 1.0);
		item.description.style.display = 'none';
	}
}

function CatalogItemOnMouseOver(event) {
	var e = event || window.event;
	var item = CatalogItemForEventTarget(e.target || e.srcElement);
	var related = CatalogItemForEventTarget(e.relatedTarget || e.fromElement);
	
	if (item && item != related) {
		CatalogSetOpacity(item.thumbnail, 0.4);
		CatalogStyleRemove(item.description, 'display');
	}
}

function CatalogItemForEventTarget(target) {
	for (var item = target; item && item.parentNode; item = item.parentNode) {
		if (item.className == 'item')
			return item;
	}
	
	return null;
}

function CatalogEventRegister(object, type, handler) {
	if (object) {
		if (object.addEventListener)
			object.addEventListener(type, handler, false);
		else if (object.attachEvent)
			object.attachEvent('on' + type, handler);
		else
			object['on' + type] = handler;
	}
}

function CatalogEventStopPropagation(e) {
	if (e.stopPropagation)
		e.stopPropagation();
	else
		e.cancelBubbel = true;
	
	if (e.preventDefault)
		e.preventDefault();
	else
		e.returnValue = false;
}

function CatalogSetOpacity(element, opacity) {
	if (opacity < 1.0) {
		element.style.opacity = opacity;
		element.style.MozOpacity = opacity;
		element.style.filter = "alpha(opacity=" + (opacity * 100) + ")";
	} else {
		CatalogStyleRemove(element, 'opacity');
		CatalogStyleRemove(element, 'MozOpacity');
		CatalogStyleRemove(element, 'filter');
	}
}

function CatalogStyleRemove(element, style) {
	if (element.style.removeAttribute)
		element.style.removeAttribute(style);
	else if (element.style.removeProperty)
		element.style.removeProperty(style);
	else if (style == 'display')
		element.style[style] = 'block';
}

