function poorMansGrep (func, array) {
	var result = [];
	for (var i = 0; i < array.length; ++i) {
		if (func(array[i])) {
			result.push(array[i]);
		}
	}
	return result;
}

/* Incase this function is ever extended:
   This function shall be passed at most one argument, named options.
   If that argument is passed, it shall be an object,
   used to pass named parameters.  All parameters shall be optional. */

function setupExploreGallery (options) {
	var columns = 5;
	var i;

	var collection = 
		document.getElementById("exploreGalleryItemCollection");
	if (!collection) { return; } // sanity check
	var container =
		document.getElementById("exploreGalleryTableContainer");
	if (!container) { return; } // sanity check

	var previousLinks;
	var nextLinks;

	/* Create functions to change the displayed gallery item. */
	var selectedIndex = null;
	var changePreviousNextLinks = function () {
		/* for middle-click friendliness */
		var pi = (selectedIndex + items.length - 1) % items.length;
		var ni = (selectedIndex + 1) % items.length;
		if (previousLinks) {
			for (var i = 0; i < previousLinks.length; ++i) {
				previousLinks[i].href = "?startat=" + pi;
			}
		}
		if (nextLinks) {
			for (var i = 0; i < nextLinks.length; ++i) {
				nextLinks[i].href = "?startat=" + ni;
			}
		}
	};
	var selectItem = function (i) {
		if (selectedIndex !== null) {
			items[selectedIndex].style.display = "none";
		}
		selectedIndex = i;
		items[selectedIndex].style.display = "block";
		changePreviousNextLinks();
		try { startSound(digitalCameraClickSound); } catch (e) { }
	};
	var selectNextItem = function () {
		selectItem((selectedIndex === null) ? 0 :
			   (selectedIndex + 1) % items.length);
		return false;
	};
	var selectPreviousItem = function () {
		selectItem((selectedIndex === null) ? 0 :
			   (selectedIndex + items.length - 1) % items.length);
		return false;
	};

	/* Find all previous and next links, and bind functions to their
	   onclicks. */
	var links = document.getElementsByTagName("a");
	previousLinks = poorMansGrep(function (link) {
		return (/(^|\s)exploreGalleryPrevious($|\s)/.
			test(link.className));
	}, links);
	for (i = 0; i < previousLinks.length; ++i) {
		previousLinks[i].href = "#";
		previousLinks[i].onclick = selectPreviousItem;
	}
	nextLinks = poorMansGrep(function (link) {
		return (/(^|\s)exploreGalleryNext($|\s)/.
			test(link.className));
	}, links);
	for (i = 0; i < nextLinks.length; ++i) {
		nextLinks[i].href = "#";
		nextLinks[i].onclick = selectNextItem;
	}

	/* Find container and populate it with the gallery table. */

	var divs = collection.getElementsByTagName("div");
	var items = poorMansGrep(function (div) {
		return (/(^|\s)exploreGalleryItem($|\s)/.
			test(div.className));
	}, divs);
	if (!items.length) { return; }

	container.innerHTML = "";

	var table = document.createElement("table");
	table.setAttribute("border", "0");
	table.setAttribute("cellspacing", "0");
	table.setAttribute("cellpadding", "0");
	table.className = "exploreGalleryTable";

	var tbody = document.createElement("tbody");
	table.appendChild(tbody);

	var onclick = function () {
		selectItem(this.index);
		return false;
	};

	var tr;
	var largeImages;
	var largeImage;
	var imageURL;
	var thumbURL;
	var headings;
	var htmlTitle;
	var imageTitle;
	var a1;
	var a2;
	var img;
	var td;

	for (i = 0; i < items.length; ++i) {

		/* Find large image URL and generate thumbnail URL from it.
		   images/012345.jpg becomes images/012345t.jpg */
		largeImages = items[i].getElementsByTagName("img");
		if (!largeImages.length) { continue; }
		largeImage = largeImages[0];
		imageURL = largeImage.src;
		thumbURL = imageURL.replace(/(\.[a-z0-9]+)$/i, "t$1");

		/* extract image title */
		headings = items[i].getElementsByTagName("h2");
		if (!headings.length) { continue; }
		htmlTitle = headings[0].innerHTML;
		imageTitle = htmlTitle.replace(/<.*?>/g, "");
		
		/* Start a new row at the 1st item and every 5th item
		   (or however many) thereafter. */
		if ((i % columns === 0) || !tr) {
			tr = document.createElement("tr");
			tbody.appendChild(tr);
		}

		largeImage.alt = imageTitle;
		largeImage.title = imageTitle;

		a1 = document.createElement("a");
		a1.index = i;
		a1.href = "?startat=" + i; /* middle-click friendliness */
		a1.onclick = onclick;

		a2 = document.createElement("a");
		a2.index = i;
		a2.href = "?startat=" + i; /* middle-click friendliness */
		a2.onclick = onclick;

		img = document.createElement("img");
		img.src = thumbURL;
		img.width = 60;
		img.height = 63;
		img.alt = imageTitle;
		img.title = imageTitle;
		img.setAttribute("border", "0");
		img.className = "colorStroke";

		a1.appendChild(img);
		a2.innerHTML = htmlTitle;

		td = document.createElement("td");
		td.appendChild(a1);
		td.appendChild(document.createElement("br"));
		td.appendChild(a2);

		tr.appendChild(td);
	}

	/* fill the last row with blank cells if needed. */
	for (; i % columns; ++i) {
		td = document.createElement("td");
		td.innerHTML = "&nbsp;";
		tr.appendChild(td);
	}

	container.appendChild(table);

	if (/(?:^|\?|\&)startat=(\d+)/.test(document.location.search)) {
		selectItem(parseInt(RegExp.$1, 10));
	} 
	else {
		selectItem(0);
	}
}


function setupExploreGalleryUsingMarketingObjectRetrieval (options) {
	var columns = 5;
	var i;

	var collection = 
		document.getElementById("exploreGalleryItemCollection");
	if (!collection) { return; } // sanity check
	var container =
		document.getElementById("exploreGalleryTableContainer");
	if (!container) { return; } // sanity check

	var previousLinks;
	var nextLinks;

	/* Create functions to change the displayed gallery item. */
	var selectedIndex = null;
	var changePreviousNextLinks = function () {
		/* for middle-click friendliness */
		var pi = (selectedIndex + items.length - 1) % items.length;
		var ni = (selectedIndex + 1) % items.length;
		if (previousLinks) {
			for (var i = 0; i < previousLinks.length; ++i) {
				previousLinks[i].href = "?startat=" + pi;
			}
		}
		if (nextLinks) {
			for (var i = 0; i < nextLinks.length; ++i) {
				nextLinks[i].href = "?startat=" + ni;
			}
		}
	};
	var selectItem = function (i) {
		if (selectedIndex !== null) {
			items[selectedIndex].style.display = "none";
		}
		selectedIndex = i;
		items[selectedIndex].style.display = "block";
		changePreviousNextLinks();
		try { startSound(digitalCameraClickSound); } catch (e) { }
	};
	var selectNextItem = function () {
		selectItem((selectedIndex === null) ? 0 :
			   (selectedIndex + 1) % items.length);
		return false;
	};
	var selectPreviousItem = function () {
		selectItem((selectedIndex === null) ? 0 :
			   (selectedIndex + items.length - 1) % items.length);
		return false;
	};

	/* Find all previous and next links, and bind functions to their
	   onclicks. */
	var links = document.getElementsByTagName("a");
	previousLinks = poorMansGrep(function (link) {
		return (/(^|\s)exploreGalleryPrevious($|\s)/.
			test(link.className));
	}, links);
	for (i = 0; i < previousLinks.length; ++i) {
		previousLinks[i].href = "#";
		previousLinks[i].onclick = selectPreviousItem;
	}
	nextLinks = poorMansGrep(function (link) {
		return (/(^|\s)exploreGalleryNext($|\s)/.
			test(link.className));
	}, links);
	for (i = 0; i < nextLinks.length; ++i) {
		nextLinks[i].href = "#";
		nextLinks[i].onclick = selectNextItem;
	}

	/* Find container and populate it with the gallery table. */

	var divs = collection.getElementsByTagName("div");
	var items = poorMansGrep(function (div) {
		return (/(^|\s)exploreGalleryItem($|\s)/.
			test(div.className));
	}, divs);
	if (!items.length) { return; }

	container.innerHTML = "";

	var table = document.createElement("table");
	table.setAttribute("border", "0");
	table.setAttribute("cellspacing", "0");
	table.setAttribute("cellpadding", "0");
	table.className = "exploreGalleryTable";

	var tbody = document.createElement("tbody");
	table.appendChild(tbody);

	var onclick = function () {
		selectItem(this.index);
		return false;
	};

	var tr;
	var largeImages;
	var largeImage;
	var imageURL;
	var thumbURL;
	var headings;
	var htmlTitle;
	var imageTitle;
	var a1;
	var a2;
	var img;
	var td;

	for (i = 0; i < items.length; ++i) {

		/* Find large image URL and generate thumbnail URL from it.
		   images/012345.jpg becomes images/012345t.jpg */
		largeImages = items[i].getElementsByTagName("img");
		if (!largeImages.length) { continue; }
		largeImage = largeImages[0];
		imageURL = largeImage.src
		thumbURL = largeImage.src + "&Variant=ThumbnailPhoto";
		largeImage.src = imageURL + "&Variant=ViewLarger";

		/* extract image title */
		headings = items[i].getElementsByTagName("h2");
		if (!headings.length) { continue; }
		htmlTitle = headings[0].innerHTML;
		imageTitle = htmlTitle.replace(/<.*?>/g, "");
		
		/* Start a new row at the 1st item and every 5th item
		   (or however many) thereafter. */
		if ((i % columns === 0) || !tr) {
			tr = document.createElement("tr");
			tbody.appendChild(tr);
		}

		largeImage.alt = imageTitle;
		largeImage.title = imageTitle;

		a1 = document.createElement("a");
		a1.index = i;
		a1.href = "?startat=" + i; /* middle-click friendliness */
		a1.onclick = onclick;

		a2 = document.createElement("a");
		a2.index = i;
		a2.href = "?startat=" + i; /* middle-click friendliness */
		a2.onclick = onclick;

		img = document.createElement("img");
		img.src = thumbURL;
		img.width = 60;
		img.height = 63;
		img.alt = imageTitle;
		img.title = imageTitle;
		img.setAttribute("border", "0");
		img.className = "colorStroke";

		a1.appendChild(img);
		a2.innerHTML = htmlTitle;

		td = document.createElement("td");
		td.appendChild(a1);
		td.appendChild(document.createElement("br"));
		td.appendChild(a2);

		tr.appendChild(td);
	}

	/* fill the last row with blank cells if needed. */
	for (; i % columns; ++i) {
		td = document.createElement("td");
		td.innerHTML = "&nbsp;";
		tr.appendChild(td);
	}

	container.appendChild(table);

	if (/(?:^|\?|\&)startat=(\d+)/.test(document.location.search)) {
		selectItem(parseInt(RegExp.$1, 10));
	} 
	else {
		selectItem(0);
	}
}


