document.addEvent('domready', function() {
	var containers = [];
	
	var equalizeMatch = ['.eq'];
	var equalizeContainerMatch = ['.box-group', '.eq'];
	
	var getParentEx = function(el, matches) {
		if (!el) return null;
		var container = el.getParent();
		if (!container) return null;
		for (var i=0; i<matches.length; i++) {
			if (container.match(matches[i])) {
				return container;
			}
		}
		return getParentEx(container, matches);
	};
	
	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 (getParentEx(spacer, equalizeMatch) == 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]);
		}
	};
	$$(equalizeMatch.join(',')).reverse().each(function(el) {
		// Get first container (or null)
		var container = getParentEx(el, equalizeContainerMatch);
		// Add it
		addElementToContainer(container, el);
	});
	
	checkAll();
	
	//console.log(containers);
	
	checkAll.periodical(250);
});
