
var _tagCloudTopPosition = -1;
var _tagCloudManuallyClosed = false;
var _intervalIDCheckTagCloudCollision = null;
var _isClosingTagCloud = false;
var _isOpeningTagCloud = false;
var _mustShowTagCloud = true;
var COLLISION_PADDING = 20;


var _contaTagsAdded = 0;
var _semaforoTagCloudResize = false;
var _intervalIDCheckTagCloudResizeOnAdd = null;
var _tagCloudInited = false;
var _precTagCloudsHtmlContent = "";
var _tagOverflow = false;
var MAX_TAG_CLOUD_HEIGHT = 95;

function stopTagCloudResizeOnAddInterval()
{
	if (_intervalIDCheckTagCloudResizeOnAdd != null)
		clearInterval(_intervalIDCheckTagCloudResizeOnAdd);
	_intervalIDCheckTagCloudResizeOnAdd = null;
}

function checkTagCloudResizeOnAdd()
{
	if (!_semaforoTagCloudResize)
	{
		//non è avvenuto il resize: proseguo con il prossimo tag!!!
		addNextTagInTagCloud();
	}
}

function tagCloudInitialized()
{
	jQuery("#tag_cloud_content a, #all_tag_cloud_content a").click(function()
	{
		if (jQuery(this).hasClass("tutti_tag")) 
			return;
		resetMenu();
		jQuery.historyLoad('tag/' + (jQuery.trim(jQuery(this).attr("idTag")) != "" ? "id=" + jQuery(this).attr("idTag") : ""));
	});
	
	stopTagCloudResizeOnAddInterval();
	
	var boxCollided = checkTagCloudAndBoxesCollision("force");
	if (!boxCollided)
	{		
		if (_mustShowTagCloud)
		{
			//faccio entrare il box
			jQuery("#tag_cloud").css('visibility', 'visible');
			jQuery("#tag_cloud_closed").hide();
			jQuery("#tag_cloud").animate({right: 0}, 200, "linear", function(){
				_tagCloudInited = true;

				//faccio partire il detect per la collisione
				startTagCloudAndBoxesCollisionDetection();	
			});
		}
		else
		{
			jQuery("#tag_cloud").css("display", "inline");
			jQuery("#tag_cloud").css("right", "0px");
			jQuery("#tag_cloud").css('visibility', 'visible');
			
			_tagCloudInited = true;

			//faccio partire il detect per la collisione
			startTagCloudAndBoxesCollisionDetection();	
		}
	}
	else
	{
		//if (_mustShowTagCloud)
		{
			_tagCloudInited = true;
			
			//faccio partire il detect per la collisione
			startTagCloudAndBoxesCollisionDetection();
		}
	}
}

function addNextTagInTagCloud()
{
	stopTagCloudResizeOnAddInterval();

	//ricerco il tag
	var currTag = jQuery("#tag_cloud_content span:eq(" + _contaTagsAdded + ")");
	if (jQuery(currTag).html() != null)
	{
		var extraStr = "";
		if (_contaTagsAdded > 0)
			extraStr = ", ";
		_contaTagsAdded++;
		
		_precTagCloudsHtmlContent = jQuery("#tag_cloud_content").html();
		_semaforoTagCloudResize = false;
		var tagToAdd = extraStr + "<a href=\"javascript:void(0);\" title=\"" + jQuery(currTag).html() + "\" idTag=\"" + jQuery(currTag).attr("idTag") + "\" " + (jQuery.trim(jQuery(currTag).attr("idContent")) != "" ? " idContent=\"" + jQuery(currTag).attr("idContent") + "\"" : "") + ">" + jQuery(currTag).html() + "</a>";
		
		if (!_tagOverflow)
			jQuery("#tag_cloud_content").append(tagToAdd);
	
		//aggiungo il tag anche nella lista completa
		jQuery("#all_tag_cloud_content").append(tagToAdd);

		_intervalIDCheckTagCloudResizeOnAdd = setInterval(checkTagCloudResizeOnAdd, 200);
	}
	else
	{
		tagCloudInitialized();
		
		_precTagCloudsHtmlContent = "";
		jQuery("#tag_cloud_content span").remove();
	}
}

jQuery(document).ready(function()
{
	jQuery("#tag_cloud_content").resize(function(){
		if (_tagCloudInited)
			return;
			
		_semaforoTagCloudResize = true;
		stopTagCloudResizeOnAddInterval();

		if (!_tagOverflow && (jQuery("#tag_cloud_content").height() + parseInt(jQuery("#tag_cloud_content").css("margin-top"), 10) + parseInt(jQuery("#tag_cloud_content").css("margin-bottom"), 10)) > MAX_TAG_CLOUD_HEIGHT)
		{
			//jQuery("#tag_cloud").css("height", MAX_TAG_CLOUD_HEIGHT + "px");

			//SBORDA!!!
			_tagOverflow = true;

			jQuery("#tag_cloud_content").html(_precTagCloudsHtmlContent + "...<br/><a href=\"javascript:void(0)\" class=\"tutti_tag\" title=\"visualizza tutti i tag\">[Tutti i TAG]</a>");
			
			jQuery("#tag_cloud_content .tutti_tag").click(function()
			{
				jQuery("#tag_cloud_content").hide();
				jQuery("#all_tag_cloud_content").show();
				jQuery("#tag_cloud").css("height", "auto");
				
				//controllo la collisione con i box
				var boxCollided = checkTagCloudAndBoxesCollision("force");
				if (boxCollided != null)
				{
					//faccio scrollare il sito fino a trovare la prima posizione disponibile per mostrare il tagcloud esploso

					//ricerco il primo "buco" libero risalendo verso l'alto
					var boxId = parseInt(jQuery(boxCollided).attr("id").substring("b_".length), 10);
					var found = findFirstFreeSpaceToOpenTagCloud(boxId);				
					if (!found)
					{
						jQuery("#vertical_scroll").scrollTop(jQuery("#vertical_scroll").scrollTop() + jQuery("#b_0").offset().top - (COLLISION_PADDING * 2 + 10 + jQuery("#tag_cloud").height()));
					}
				}
			});
			_precTagCloudsHtmlContent = "";
		}
		else
		{
			addNextTagInTagCloud();
		}
	});
	
	if (_mustShowTagCloud)
	{
		//sistemo la visualizzazione dei tags
		_contaTagsAdded = 0;
		addNextTagInTagCloud();
	}
});

function toggleMainTagCloud()
{
	if(_precLocationHRef == 'map') return;
	if (parseInt(jQuery("#tag_cloud").css("right"), 10) == 0)
	{
		_tagCloudManuallyClosed = true;
		closeTagCloud();
	}
	else
	{
		_tagCloudManuallyClosed = false;
		openTagCloud(true);
	}
}

function closeTagCloud()
{
	stopTagCloudAndBoxesCollisionInterval();
	if (parseInt(jQuery("#tag_cloud_closed").css("right"), 10) == 0 || _isClosingTagCloud)
		return;

	_isClosingTagCloud = true;
	jQuery("#tag_cloud").animate({right: -jQuery("#tag_cloud").width() + 'px', opacity: 0}, 100, "easeOutSine", function(){

			//controllo: se ho i tag tutti aperti allora li mostro in versione ridotta
			if (jQuery("#all_tag_cloud_content").css("display") != "none")
			{
				jQuery("#tag_cloud_content").show();
				jQuery("#tag_cloud").css("height", (jQuery("#tag_cloud_content").height() + parseInt(jQuery("#tag_cloud_content").css("margin-top"), 10) + parseInt(jQuery("#tag_cloud_content").css("margin-bottom"), 10)) + "px");
				jQuery("#all_tag_cloud_content").hide();
			}

			jQuery(this).hide();
			jQuery("#tag_cloud").css('visibility', 'hidden');					
			jQuery("#tag_cloud_closed").css('visibility', 'visible');	
			jQuery("#tag_cloud_closed").show();
			jQuery("#tag_cloud_closed").animate({right: '0px', opacity: 1}, 200, "easeOutSine");
			
			_isClosingTagCloud = false;
		});
}

function openTagCloud(pOpenManually)
{
	stopTagCloudAndBoxesCollisionInterval();
	if (parseInt(jQuery("#tag_cloud").css("right"), 10) == 0 || _isOpeningTagCloud || !_mustShowTagCloud)
		return;

	//controllo se collido: evito l'apertura...
	var boxCollided = checkTagCloudAndBoxesCollision("force");
	if (boxCollided != null)
	{
		if (pOpenManually)
		{
			//faccio scrollare il sito fino a trovare la prima posizione disponibile per mostrare il tagcloud esploso
			//ricerco il primo "buco" libero risalendo verso l'alto
			var boxId = parseInt(jQuery(boxCollided).attr("id").substring("b_".length), 10);
			var found = findFirstFreeSpaceToOpenTagCloud(boxId);				
			if (!found)
			{
				jQuery("#vertical_scroll").scrollTop(jQuery("#vertical_scroll").scrollTop() + jQuery("#b_0").offset().top - (COLLISION_PADDING * 2 + 10 + jQuery("#tag_cloud").height()));
			}
		}
		return;
	}
	
	_isOpeningTagCloud = true;
	jQuery("#tag_cloud_closed").delay((!pOpenManually ? 300 : 0)).animate({right: -(jQuery("#tag_cloud_closed").width() + parseInt(jQuery("#tag_cloud_closed").css("padding-right"), 10)) + 'px', opacity: 0}, 200, "easeOutSine", function(){
	
			//controllo se collido: evito l'apertura...
			if (checkTagCloudAndBoxesCollision("force") != null)
			{
				_isOpeningTagCloud = false;
				jQuery("#tag_cloud_closed").animate({right: "0px", opacity: 1}, 100, "easeOutSine");
				jQuery("#tag_cloud").css('visibility', 'hidden');
				jQuery("#tag_cloud_closed").css('visibility', 'visible');
				return;
			}
		
			jQuery(this).hide();					
			jQuery("#tag_cloud").show();
			jQuery("#tag_cloud").css('visibility', 'visible');
			jQuery("#tag_cloud").animate({right: '0px', opacity: 1}, 200, "easeOutSine");
			
			_isOpeningTagCloud = false;
		});
}

function findFirstFreeSpaceToOpenTagCloud(pBoxId)
{
	if (_lastBoxesInRow == null)
		return false;
	
	//scorro tutti box presenti nell'utlima posizione sulla relativa riga
	for (var seek = 0; seek < _lastBoxesInRow.length; seek++)
	{
		if (parseInt(jQuery(_lastBoxesInRow[seek]).attr("row"), 10) == parseInt(jQuery("#b_" + pBoxId).attr("row"), 10) - 1)
		{
			//trovata la riga immediatamente sopra al box di collisione: adesso inizio la ricerca dello spazio disponibile fino ad arrivare al top della pagina
			for (var r = seek; r >= 0; r--)			
			{
				//calcolo l'offset tra la posizione attuale del tagcloud e il box da controllare...
				var tagCloudY = jQuery("#vertical_scroll").scrollTop() + _tagCloudTopPosition;
				var boxY = parseInt(jQuery("#content").css("margin-top"), 10) + parseInt(jQuery(_lastBoxesInRow[r]).css("top"), 10) + parseInt(jQuery(_lastBoxesInRow[r]).css("margin-top"), 10);
				var tmp = tagCloudY - boxY;

				var checkLast = checkTagCloudAndBoxCollision(jQuery(_lastBoxesInRow[r]), -tmp);
				
				//controllo anche la riga sotto
				var checkLastUp = false;
				if (r > 0)
				{
					var box2Y = parseInt(jQuery("#content").css("margin-top"), 10) + parseInt(jQuery(_lastBoxesInRow[r - 1]).css("top"), 10) + parseInt(jQuery(_lastBoxesInRow[r - 1]).css("margin-top"), 10);
					var tmp2 = tagCloudY - box2Y;

					checkLastUp = checkTagCloudAndBoxCollision(jQuery(_lastBoxesInRow[r - 1]), -tmp2);
				}
				
				if (!checkLast && !checkLastUp)
				{
					//non collide...
					jQuery("#vertical_scroll").scrollTop(parseInt(jQuery("#content").css("margin-top"), 10) + parseInt(jQuery(_lastBoxesInRow[r + 1]).css("top"), 10) + parseInt(jQuery(_lastBoxesInRow[r + 1]).css("margin-top"), 10) - jQuery("#tag_cloud").height() - COLLISION_PADDING * 2 - 10);
					return true;
				}
			}
			break;
		}
	}
}

function stopTagCloudAndBoxesCollisionInterval()
{
	if (_intervalIDCheckTagCloudCollision != null)
		clearInterval(_intervalIDCheckTagCloudCollision);
	_intervalIDCheckTagCloudCollision = null;
}

function startTagCloudAndBoxesCollisionDetection()
{
	if (_tagCloudTopPosition < 0)
		_tagCloudTopPosition = parseInt(jQuery("#tag_cloud").css("top"), 10); //jQuery("#tag_cloud").offset().top;
		
	stopTagCloudAndBoxesCollisionInterval();
	//if((jQuery.browser.msie && jQuery.browser.version > 7) || !jQuery.browser.msie)
	//{
		_intervalIDCheckTagCloudCollision = setInterval(checkTagCloudAndBoxesCollision, 100);
	/*}else
	{
		closeTagCloud();
	}*/
}

function checkTagCloudAndBoxesCollision(pForceDetect)
{
	var collisionBox = null;
	
	if (!_mustShowTagCloud || _lastBoxesInRow == null || _tagCloudManuallyClosed || _tagCloudTopPosition < 0 || parseInt(jQuery("#tag_cloud").css("top"), 10) < _tagCloudTopPosition)
		return collisionBox;
	
	for (var i = 0; i < _lastBoxesInRow.length; i++)
	{
		if (checkTagCloudAndBoxCollision(_lastBoxesInRow[i], 0, pForceDetect))
		{
			collisionBox = _lastBoxesInRow[i];
			break;
		}
	}
	
	if (collisionBox != null)
	{
		if (pForceDetect != "force")
			closeTagCloud();
	}
	else
	{
		if (pForceDetect != "force")
			openTagCloud(false);
	}
	return collisionBox;
}

function checkTagCloudAndBoxCollision(pBox, pTagCloudOffset, pForceDetect)
{
	if (jQuery(pBox).html() == null || (!_tagCloudInited && pForceDetect != "force"))
		return;
		
	var tagCloudY = jQuery("#vertical_scroll").scrollTop() + _tagCloudTopPosition + pTagCloudOffset;
	var boxY = parseInt(jQuery("#content").css("margin-top"), 10) + parseInt(jQuery(pBox).css("top"), 10) + parseInt(jQuery(pBox).css("margin-top"), 10);

	if (parseInt(jQuery("#main").css("margin-left"), 10) + jQuery("#main").width() - jQuery("#tag_cloud").width() <= jQuery(pBox).offset().left + jQuery(pBox).width() && 
		((tagCloudY - COLLISION_PADDING >= boxY && tagCloudY - COLLISION_PADDING <= boxY + jQuery(pBox).height()) ||
		(tagCloudY + COLLISION_PADDING + jQuery("#tag_cloud").height() >= boxY && tagCloudY + COLLISION_PADDING + jQuery("#tag_cloud").height() <= boxY + jQuery(pBox).height()) ||
		(boxY >= tagCloudY - COLLISION_PADDING && boxY <= tagCloudY + COLLISION_PADDING + jQuery("#tag_cloud").height()) ||
		(boxY + jQuery(pBox).height() >= tagCloudY - COLLISION_PADDING && boxY + jQuery(pBox).height() <= tagCloudY + COLLISION_PADDING + jQuery("#tag_cloud").height())))
	{
		return true;
	}		
	
	return false;
}

function showTagCloud()
{
	_mustShowTagCloud = true;
	
	if (jQuery("#tag_cloud_closed").css("visibility") == "hidden")
	{
//		jQuery("#tag_cloud_closed").fadeOut(0);
//		jQuery("#tag_cloud").fadeOut(0);
		jQuery("#tag_cloud_closed").css("visibility", "visible");
		jQuery("#tag_cloud").css("visibility", "visible");
	}

	jQuery("#tag_cloud").css('visibility', 'visible');
	jQuery("#tag_cloud_closed").css('visibility', 'visible');
	//jQuery("#tag_cloud_closed").fadeIn(200);
	
	//jQuery("#tag_cloud").fadeIn(200);
	jQuery("#tag_cloud").show();

	startTagCloudAndBoxesCollisionDetection();
}

function hideTagCloud()
{
	_mustShowTagCloud = false;

	stopTagCloudAndBoxesCollisionInterval();

	if (_tagCloudInited)
	{
		jQuery("#tag_cloud").css('visibility', 'hidden');
		jQuery("#tag_cloud_closed").css('visibility', 'hidden');
		
		//jQuery("#tag_cloud_closed").fadeOut(200);
		//jQuery("#tag_cloud").fadeOut(200);
		jQuery("#tag_cloud_closed").hide();
		jQuery("#tag_cloud").hide();
	}
	else
	{
		jQuery("#tag_cloud_closed").css("visibility", "hidden");
		jQuery("#tag_cloud").css("visibility", "hidden");
	}	
}
