/* Zarovnávání výšek prvků na stejném řádku a jeho vnitřních elementů */

$.fn.alignHeights = function(params) {

	var elementsAffected = 0;
	
	$(this).each(function() {
	
		// Podle rodiče odhadnu obalující tag jednotlivých prvků
		var wrapperTagName = $(this)[0].tagName.toLowerCase();
		switch(wrapperTagName) {
			case 'ul': tmpWrapper = 'li'; break;
			case 'ol': tmpWrapper = 'li'; break;
			default: tmpWrapper = 'div';
		}

		// Výchozí nastavení
		var options = {
			wrapElement: tmpWrapper, // obalující prvek jednotlivých prvků
			minHeight: 0, // minimální výška obalujícího divu
			alignWrapper: true, // nastavovat výšku obalujícímu prvku?
			childList: [] // pole selectorů vnořených prvků k zarovnání
		}
		
		// Uživatelské nastavení z parametrů
		if (!$.isEmptyObject(params)) {
			$.each(params, function(paramName, paramValue) {
				options[paramName] = paramValue;
			});
		}
	
		// Zjistim, zda se nastavují zaráz výšky obalujících a vnitřních prvků
		var outerInnerCollision = (options.childList.length > 0 && options.alignWrapper);
		
		// Procházím jednotlivé prvky od prvního po poslední	
		var actElement = $(this).children(options.wrapElement).first();
	
		while (actElement.length > 0) {

			var maxHeight = options.minHeight;
			var maxHeightChilds = [];		
			var rowTop = actElement.position().top;

			$.each(options.childList, function(childId, childClass) {
				maxHeightChilds[childId] = 0;
			});
			
			do {
			
				// Podle top pozice prvku ověřuju, zda je na stejným řádku jako předchozí a zaznamenávám maximální výšky
				if (actElement.position().top == rowTop) {
				
					if (options.alignWrapper && actElement.height() > maxHeight) {
						maxHeight = actElement.height();
					}
					
					$.each(options.childList, function(childId, childClass) {
						var childElem = actElement.find(childClass);
						if (childElem.height() > maxHeightChilds[childId]) {
							maxHeightChilds[childId] = childElem.height();
						}
					})							
					
				}
				
				// Když se jedná o prvek na novém řádku nebo o poslední prvek, aplikuju maximální výšku
				if (!(actElement.next().length > 0) || actElement.position().top != rowTop) {
		
					var itemsToAlign = actElement.prevUntil('.last');
					
					if (!(actElement.next().length > 0) && !(actElement.position().top != rowTop)) {
						$.merge(itemsToAlign, actElement);
					}

					if (actElement.position().top != rowTop) {
						actElement.prev().addClass('last');
					}

					if (!(actElement.next().length > 0)) {
						actElement = actElement.next();
					}

					$.each(options.childList, function(childId, childClass) {
						itemsToAlign.find(childClass).height(maxHeightChilds[childId]);
					})
					
					if (options.alignWrapper && !outerInnerCollision) {
						itemsToAlign.height(maxHeight);
					}
									
					elementsAffected += itemsToAlign.length;
					
					break;
					
				}

				actElement = actElement.next();		
			
			} while (actElement.length > 0)
						
		}

		// Nastavení výšek obalujících prvků zavolám až po nastavení výšek vnitřních prvků
		if (outerInnerCollision) {
			$(this).children(options.wrapElement).removeClass('last');
			$(this).alignHeights();
		}
								
	});
	
	return elementsAffected;

}
