function clusterAdvance(clusterId, advance) {
	// get different parts of the cluster
	var clusterEl  = _gel(clusterId);
	var low        = goog.dom.getElementsByTagNameAndClass('SPAN', 'video-cluster-videos-count-low', clusterEl)[0];
	var high       = goog.dom.getElementsByTagNameAndClass('SPAN', 'video-cluster-videos-count-high', clusterEl)[0];
	var total      = goog.dom.getElementsByTagNameAndClass('SPAN', 'video-cluster-videos-count-total', clusterEl)[0];
	var leftNav    = goog.dom.getElementsByTagNameAndClass('DIV', 'video-cluster-videos-nav-left', clusterEl)[0];
	var rightNav   = goog.dom.getElementsByTagNameAndClass('DIV', 'video-cluster-videos-nav-right', clusterEl)[0];
	var lowCount   = parseInt(low.innerHTML);
	var highCount  = parseInt(high.innerHTML);
	var totalCount = parseInt(total.innerHTML);

	// don't advance unnecessarily
	if ((advance && highCount == totalCount) || (!advance && lowCount == 1)) {
		return;
	}

	// hide old set
	for (var x = lowCount; x <= highCount; ++x) {
		var el = _gel(clusterId + '-' + (x - 1));
		_hidediv(el);
	}

	// calculate next set
	highCount = advance ? (highCount + 3 > totalCount ? totalCount : highCount + 3)
											: (highCount == totalCount && totalCount % 3 ? highCount - totalCount % 3 : highCount - 3);
	lowCount  = highCount - 3 >= 1 ? (highCount == totalCount && totalCount % 3 ? highCount - totalCount % 3: highCount - 3) + 1 : 1;

	low.innerHTML  = lowCount;
	high.innerHTML = highCount;

	// show next set
	for (var x = lowCount; x <= highCount; ++x) {
		var el = _gel(clusterId + '-' + (x - 1));
		_showdiv(el);
	}

	// disable buttons as necessary
	if (lowCount == 1) {
		_addclass(leftNav, "disabled");
	} else {
		_removeclass(leftNav, "disabled");
	}

	if (highCount == totalCount) {
		_addclass(rightNav, "disabled");
	} else {
		_removeclass(rightNav, "disabled");
	}
}
