var ElementMaxHeight = function() {
  this.initialize.apply(this, arguments);
}

ElementMaxHeight.prototype = {
	initialize: function(className) {
		this.elements = document.getElementsByClassName(className || 'maxheight');    
		this.textElement = document.createElement('span');
		this.textElement.appendChild(document.createTextNode('A'));
		this.textElement.style.display = 'block';
		this.textElement.style.position = 'absolute';
		this.textElement.style.fontSize = '1em';
		this.textElement.style.top = '-1000px';
		this.textElement.style.left = '-1000px';
		document.body.appendChild(this.textElement);
		this.textElementHeight = document.getDimensions(this.textElement).height;
		var __object = this;
		var __checkFontSize = this.checkFontSize;
		this.checkFontSizeInterval = window.setInterval(function() {return __checkFontSize.apply(__object)}, 500);
		this.expand();
		// Refresh elements height onResize event
		var __expand = this.expand;
		if (window.addEventListener) {
			window.addEventListener('resize', function(event) {
				return __expand.apply(__object, [( event || window.event)])
			}, false);
		} else if (window.attachEvent) {
			window.attachEvent('onresize', function(event) {
				return __expand.apply(__object, [( event || window.event)])
			});
		}
	},
	expand: function() {
		this.reset();
		for (var i = 0; i < this.elements.length; i++) {
			this.elements[i].style.height = document.getDimensions(this.elements[i].parentNode).height + 'px';
		}
	},
	reset: function() {
		for (var i = 0; i < this.elements.length; i++) {    
			this.elements[i].style.height = 'auto';
		}
	},
	checkFontSize: function() {
		var height = document.getDimensions(this.textElement).height;
		if(this.textElementHeight != height) {
			this.textElementHeight = height;
			this.expand();
		}
	}
}

if (!!document.evaluate) {
	document._getElementsByXPath = function(expression, parentElement) {
		var results = [];
		var query = document.evaluate(expression, parentElement || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
		for (var i = 0, length = query.snapshotLength; i < length; i++)
		results.push(query.snapshotItem(i));
		return results;
	}
}

document.getElementsByClassName = function(className, parentElement) {
	if (!!document.evaluate) {
		var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
		return document._getElementsByXPath(q, parentElement);
	} else {
		var children = (parentElement || document.body).getElementsByTagName('*');
		var elements = [], child;
		for (var i = 0, length = children.length; i < length; i++) {
			child = children[i];
			if (child.className.length != 0 &&
			(child.className == className ||
			child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))) {
				elements.push(child);
			}
		}
		return elements;
	}
}

document.getDimensions = function (element) {
	var display = element.style.display;
	if (display != 'none' && display != null) { // Safari bug
		return {width: element.offsetWidth, height: element.offsetHeight
		};
  	}
	return {
		width: originalWidth, height: originalHeight
	};
}