document.addEvent('domready', function() {
	var containers = [];
	
	var equalizeClassName = 'equalize';
	var containerClassName = 'equalize-container';
	var updateInterval = 250;
	
	var addElementToContainer = function(container, element) {
		for (var i=0; i<containers.length; i++) {
			if (containers[i].container == container) {
				containers[i].elements.push(element);
				return;
			}
		}
		containers.push({
			container: container,
			elements: [element]
		});
	};
	
	var getElementSpacers = function(el) {
		var spacers = [];
		el.getElements('.spacer').each(function(spacer) {
			if (spacer.getParent('.'+equalizeClassName) == el) {
				spacers.push(spacer);
			}
		});
		if (spacers.length == 0) {
			// Need to add a spacer
			var spacer = new Element('div', { 'class':'spacer' }).inject(el);
			spacers.push(spacer);
		}
		return spacers;
	};
	
	var checkHeights = function(entry) {
		var maxHeight = 0;
		var i, j;
		var elementHeights = [];
		var elementSpacers = [];
		
		if (entry.elements.length < 2) return;
		
		// Calc max unaltered height
		for (i=0; i<entry.elements.length; i++) {
			var spacers = getElementSpacers(entry.elements[i]);
			var elementHeight = entry.elements[i].offsetHeight;
			for (j=0; j<spacers.length; j++) {
				elementHeight -= spacers[j].offsetHeight;
			}
			
			//if (entry.elements[i].hasClass('box')) elementHeight += 17;
			
			elementHeights[i] = elementHeight;
			elementSpacers[i] = spacers;
			if (elementHeight > maxHeight) {
				maxHeight = elementHeight;
			}
		}
		//console.log(elementHeights);
		// Set element heights
		for (i=0; i<entry.elements.length; i++) {
			//if (elementHeights[i] >= maxHeight) continue;
			var diff = maxHeight - elementHeights[i];
			//console.log("Element " + i + "/" + entry.elements.length + " : diff = " + diff);
			if (elementSpacers[i].length == 1) {
				//console.log("> Setting height to " + diff);
				//console.log(elementSpacers[i][0]);
				elementSpacers[i][0].setStyle('height', diff + 'px');
			}
			else {
				var spacerHeight = Math.floor(diff / elementSpacers[i].length);
				var firstSpacerHeight = diff - spacerHeight * (elementSpacers[i].length-1);
				//console.log([spacerHeight, firstSpacerHeight]);
				var thisSpacerHeight = firstSpacerHeight;
				for (j=0; j<elementSpacers[i].length; j++) {
					elementSpacers[i][j].setStyle('height', thisSpacerHeight + 'px');
					thisSpacerHeight = spacerHeight;
				}
			}
		}
	};
	
	var checkAll = function() {
		for (var i=0; i<containers.length; i++) {
			checkHeights(containers[i]);
		}
	};
	
	$$('.'+equalizeClassName).reverse().each(function(el) {
		// Get first container (or null)
		var container1 = el.getParent('.'+containerClassName);
		var container2 = el.getParent('.'+equalizeClassName);
		var container = null;
		if (container2 == null) {
			container = container1;
		}
		else {
			if (container2.getParent('.'+containerClassName) == container1) {
				container = container2;
			}
			else {
				container = container1;
			}
		}
		// Add it
		addElementToContainer(container, el);
	});
	
	checkAll();
	
	//console.log(containers);
	
	checkAll.periodical(updateInterval);
});
