var textSuggest = new Array();
var caretPos;

function inizializeSearchSuggest(id, anchor)
{
	var suggest = document.getElementById(id);
	if(suggest)
	{
		suggest.style.left = document.getElementById(anchor).offsetLeft + "px";
		suggest.style.top = document.getElementById(anchor).offsetHeight + "px";
		suggest.style.width = (document.getElementById(anchor).offsetWidth - 10) + "px";
	}
}

function findPos(obj, what)
{
	var posX = obj.offsetLeft;
	var posY = obj.offsetTop;
	while(obj.offsetParent)
	{
		posX = posX + obj.offsetParent.offsetLeft;
		posY = posY + obj.offsetParent.offsetTop;
		if(obj == document.getElementsByTagName('body')[0])
			break;
		else
			obj = obj.offsetParent;
	}
	if(what == 'left')
		return posX;
	else if(what == 'top')
		return posY;
}

function searchSuggest (textBox, e)
{
	if(!document.all && !document.getElementsByTagName) return;
	switch (e.keyCode)
	{
	  //case  8: return true; break; // Backspace
	  //case 46: return true; break; // Canc
	  //case 35: return true; break; // Fine
	  //case 36: return true; break; // Home
	  //case 37: return true; break; // Freccia Sinistra
	  //case 39: return true; break; // Freccia Destra
	  case 27: closeSearchSuggest(); break; // Esc
	  case 13: return true; break; // Invio
	  case  9: return true; break; // TAB
	  case 16: return true; break; // Shift
	  case 17: return true; break; // CTRL
	  case 18: return true; break; // ALT
	  case 20: return true; break; // Caps Lock
	  case 33: return true; break; // Pagina Su
	  case 34: return true; break; // Pagina Giù
	  case 38: return true; break; // Freccia Su
	  case 40: return true; break; // Freccia Giù
	  default:
	  if(document.forms[0].testo.value.length > 2)
			sendSearchSuggest();
	 else
			closeSearchSuggest();
	  return false;
	}
}

function closeSearchSuggest () {
	if(!document.all && !document.getElementsByTagName) return;	
	var searchSuggest = document.getElementById('suggest_tag');
	searchSuggest.style.visibility = 'hidden';
	searchSuggest.innerHTML = '';
}

function sendSearchSuggest()
{
	var searchValue = 'searchValue=' + document.forms[0].testo.value;
  	if (window.XMLHttpRequest) // branch for native XMLHttpRequest object
  	{
	 	req = new XMLHttpRequest();
		if (req)
		{
      		req.onreadystatechange = function () { processReqChange(); }
			req.open('POST', '/cgi-bin/taggato/index.cgi', true);
			req.send(searchValue);
		}
  	}
  	else if (window.ActiveXObject) // branch for IE/Windows ActiveX version
  	{
    	req = new ActiveXObject("Microsoft.XMLHTTP");
		if (req)
		{
      		req.onreadystatechange = function () { processReqChange(); }
			req.open('POST', '/cgi-bin/taggato/index.cgi', true);
			req.send(searchValue);
    	}
  	}
}	

function processReqChange()
{
	if (req.readyState == 4)
	{	
  		if(req.status == 200)
    	{
			if(req.responseText)
			{
				var searchSuggest = document.getElementById('suggest_tag');
				searchSuggest.innerHTML = req.responseText;
				searchSuggest.style.visibility = 'visible';
			}
			else
				closeSearchSuggest();
		}
	}
}

function selSearchText(text)
{
	if(!document.all && !document.getElementsByTagName) return;
	var textBox = document.getElementById('searchText');
	textBox.value = text;
	closeSearchSuggest();
	return;
}

function inizializeSuggest () {
	if(!document.all && !document.getElementsByTagName) return;	
	var div = document.getElementById("userTag");
	if(div)
	{
		var lis = div.getElementsByTagName("li");
		for (var i=0; i<lis.length; i++)
		{ 
			var li = lis[i];
			if(document.all)
				textSuggest.push(li.innerText);
			else
				textSuggest.push(li.textContent);
		}
	}

	div = document.getElementById("nickTag");
	if(div)
	{
		var lis = div.getElementsByTagName("li");
		for (var i=0; i<lis.length; i++)
		{ 
			var li = lis[i];
			if(document.all)
				textSuggest.push(li.innerText);
			else
				textSuggest.push(li.textContent);
		}
	}

	div = document.getElementById("favoritesTag");
	if(div)
	{
		var lis = div.getElementsByTagName("li");
		for (var i=0; i<lis.length; i++)
		{ 
			var li = lis[i];
			if(document.all)
				textSuggest.push(li.innerText);
			else
				textSuggest.push(li.textContent);
		}
	}	
}

function openSuggest (arr) {
	var suggest = document.getElementById('suggest');
	var HTML = "";
	var complete = "";
 	HTML = 'Suggerimenti: ';
	for(var i = 0; i < arr.length; i++)
	{
		complete = arr[i].replace(/"/g, "&quot;");
		complete = complete.replace(/'/g, "\\'");
	 	HTML += '<span><a href="javascript:completeTag(\''+complete+'\')">'+arr[i]+'</a></span> ';
	}
	suggest.innerHTML = HTML;
}

function closeSuggest () {
 if(!document.all && !document.getElementsByTagName) return;	
 var suggest = document.getElementById('suggest');	
 suggest.innerHTML = '&nbsp;';
}

function suggestBox (textBox, e)
{
	if(!document.all && !document.getElementsByTagName) return;
	caretPos = getCaretPosition(textBox);
	switch (e.keyCode)
	{
	  //case  8: return true; break; // Backspace
	  //case 46: return true; break; // Canc
	  //case 35: return true; break; // Fine
	  //case 36: return true; break; // Home
	  //case 37: return true; break; // Freccia Sinistra
	  //case 39: return true; break; // Freccia Destra
	  case 27: closeSuggest(); break; // Esc
	  case 13: return true; break; // Invio
	  case  9: return true; break; // TAB
	  case 16: return true; break; // Shift
	  case 17: return true; break; // CTRL
	  case 18: return true; break; // ALT
	  case 20: return true; break; // Caps Lock
	  case 33: return true; break; // Pagina Su
	  case 34: return true; break; // Pagina Giù
	  case 38: return true; break; // Freccia Su
	  case 40: return true; break; // Freccia Giù
	  default:
		highlightTag();
		textForSuggest = tagSelected(textBox, caretPos);
		if(textForSuggest && textForSuggest.length > 2)
		{
			var results = cleanOrderArray(findSuggest(textForSuggest));
			if(results.length)
				openSuggest(results);
			else
				closeSuggest();
		}
		else
			closeSuggest();
	  return false;
	}
}

function findSuggest(testo) {
	var results = new Array();
	for(var i = 0; i < textSuggest.length; i++)
	{
		if(textSuggest[i] == testo)
			highlightTag();
		else if(textSuggest[i].indexOf(testo) == 0)
			results.push(textSuggest[i]);
	}
	return results;
}

function cleanOrderArray (arr)
{
	var textBox = document.getElementById('tags');
	var elencoTags = textBox.value.split(/\s*,\s*/g);
	var retArray = new Array();
	for(var i = 0; i < arr.length; i++)
	{
		var unique = true;
		for(var j = 0; j < retArray.length; j++)
		{
			if(arr[i] == retArray[j])
			{
				unique = false;
				break;
			}
		}
		if(unique)
		{
			var present = false;
			for(var k = 0; k < elencoTags.length; k++)
			{
				if(arr[i] == elencoTags[k])
				{
					present = true;
					break;
				}
			}
			if(!present)
				retArray.push(arr[i]);
		}
	}
	return retArray.sort();
}

function completeTag(testo)
{
	if(!document.all && !document.getElementsByTagName) return;
	var find = false;
	var textBox = document.getElementById('tags');
	selectedTag = tagSelected(textBox, caretPos);
	var elencoTags = textBox.value.split(/\s*,\s*/g);
	var elencoNewTags = new Array();
	for(var i = 0; i < elencoTags.length; i++)
	{
		if(elencoTags[i] != selectedTag || find)
			elencoNewTags.push(elencoTags[i]);
		else
		{
			elencoNewTags.push(testo);
			find = true;
		}
	}	
	textBox.value = elencoNewTags.join(", ");
	setCaretPosition(textBox, caretPos);	
	highlightTag();
}

function search()
{
	if(!document.all && !document.getElementsByTagName) return;
	var validity = true;
	if(document.forms[0].dove.value == "web")
	{
		validity = false;
		location.href = "http://www.comune.torino.it/cgi-bin/cerca/ricerca.cgi?term_query=" + encodeURIComponent(document.forms[0].testo.value);
	}
	return validity;		
}

function selTag(tag)
{
	if(!document.all && !document.getElementsByTagName) return;
	var textBox = document.getElementById('tags');	
	var elencoNewTags = new Array();
	var exist = 0;
	
	if(textBox.value)
	{
		elencoTags = textBox.value.split(/\s*,\s*/g);

		for (var i=0; i<elencoTags.length; i++)
		{
			if(elencoTags[i] != tag)
				elencoNewTags.push(elencoTags[i]);
			else
				exist = 1;
		}
	}
	if(!exist)
		elencoNewTags.push(tag);

	textBox.value = elencoNewTags.join(", ");
	setCaretPosition(textBox, caretPos);	
	highlightTag();
}

function highlightTag()
{
	var textBox = document.getElementById('tags');
	var elencoTags = textBox.value.split(/\s*,\s*/g);
	var div = document.getElementById("userTag");
	if(div)
	{
		var lis = div.getElementsByTagName("li");
		for (var i=0; i<lis.length; i++)
		{ 
			exist = 0;
			var li = lis[i];
			if(document.all)
				var text = li.innerText;
			else
				var text = li.textContent;

			for (var j=0; j<elencoTags.length; j++)
			{ 
				if(text == elencoTags[j])
				{
					exist = 1;
					break;
				}
			}
			if(exist)
				li.className = "highlight";
			else
				li.className = "";
		}
	}

	div = document.getElementById("nickTag");
	if(div)
	{
		var lis = div.getElementsByTagName("li");
		for (var i=0; i<lis.length; i++)
		{ 
			exist = 0;
			var li = lis[i];
			if(document.all)
				var text = li.innerText;
			else
				var text = li.textContent;

			for (var j=0; j<elencoTags.length; j++)
			{ 
				if(text == elencoTags[j])
				{
					exist = 1;
					break;
				}
			}
			if(exist)
				li.className = "highlight";
			else
				li.className = "";
		}
	}

	div = document.getElementById("favoritesTag");
	if(div)
	{
		var lis = div.getElementsByTagName("li");
		for (var i=0; i<lis.length; i++)
		{ 
			exist = 0;
			var li = lis[i];
			if(document.all)
				var text = li.innerText;
			else
				var text = li.textContent;

			for (var j=0; j<elencoTags.length; j++)
			{ 
				if(text == elencoTags[j])
				{
					exist = 1;
					break;
				}
			}
			if(exist)
				li.className = "highlight";
			else
				li.className = "";
		}
	}
}

function getCaretPosition (el)
{
	var iCaretPos = 0;
	if (document.selection) // IE hack
	{
		var selectionRange = document.selection.createRange();
		selectionRange.moveStart('word', -el.value.length);
		iCaretPos = selectionRange.text.length;
	} 
	else if (el.selectionStart || el.selectionStart == '0') // Firefox
	{
		iCaretPos = el.selectionStart;
	}
	return iCaretPos;
}

function setCaretPosition (el, iCaretPos) 
{
	el.focus();
	if (document.selection) // IE 
	{
		var range = el.createTextRange();
		range.moveStart('character', -el.value.length);
		range.moveEnd('character', -el.value.length);
		range.moveStart('character', iCaretPos);		
		range.select();
	}
	else if (el.selectionStart || el.selectionStart == '0') // Firefox
	{
		el.setSelectionRange(iCaretPos, iCaretPos);
	}
}

function tagSelected(el, iCaretPos) {
	setCaretPosition(el, iCaretPos);
	var selectedTag = "";
	if (document.selection) // IE hack
	{	
		var trange = document.selection.createRange();
		var fulltext = trange.duplicate();
		fulltext.expand('textedit');
		while(trange.text.substr(0, 1) != ',') {
			if(!trange.compareEndPoints('StartToStart', fulltext))
				break;
			trange.moveStart('character', -1);
		}
		if(trange.text.substr(0, 1) == ',')
			trange.moveStart('character', 1);
		while(trange.text.substr(trange.text.length - 1) != ',') {
			if(!trange.compareEndPoints('EndToEnd', fulltext))
				break;
			trange.moveEnd('character', 1);
		}
		if(trange.text.substr(trange.text.length - 1) == ',')	
			trange.moveEnd('character', -1);
		selectedTag = trange.text;			
	}
	else if (el.selectionStart || el.selectionStart == '0') // Firefox
	{
		var start = el.selectionStart - 1;
		var end = el.selectionStart;
		while(start > 0 && el.value.substr(start, 1) != ',')
			start--;
		if(start > 0 && el.value.substr(start, 1) == ',')
			start++;
		while(end < el.value.length && el.value.substr(end, 1) != ',')
			end++;
		if(start < 0)
			start = 0;
		selectedTag = el.value.substr(start, end-start);
	}
	return selectedTag.replace(/^\s+|\s+$/, '');
}

window.onload = function() {
	if(!document.all && !document.getElementsByTagName) return;	
	inizializeSuggest();
	inizializeSearchSuggest('suggest_tag', 'searchText');
}

window.onresize = function ()
{
	inizializeSearchSuggest('suggest_tag', 'searchText');
}

