/*
	suggest.js

	Copyright (c) MedicosCubanos.com
*/

var LINE_BREAK = "<br/>";
var DATA_END = "<total>"

var AUTOCOMPLETEINDEX_INI = -1;
var MAX_LIST = 20 + AUTOCOMPLETEINDEX_INI;

var KEY_CURSOR_DOWN = 40;
var KEY_CURSOR_UP = 38;
var KEY_ENTER = 13;

var autocompleteIndex = AUTOCOMPLETEINDEX_INI;
var autocompleteHTML = "";
var autocompleteClosed = false;
var req;


function Suggest_Initialize()
{
    try
    {
        req = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch(e)
    {
        try
        {
            req = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch(oc)
        {
            req = null;
        }
    }

    if( !req && typeof XMLHttpRequest != "undefined" )
    {
        req = new XMLHttpRequest();
    }
};


function Event( e )
{	
	// WARNING: didn't work in Safari outside this file
	// http://www.javascriptkit.com/javatutors/javascriptkey2.shtml
	// usage: onkeydown="FunctionName(event)"
	// inside "FunctionName" call:
	// 	var keyCode = Event( e).keyCode;
	
	if( e == null )
		e = window.event;	// IE
	
	if( e == null )
	{
		alert("Event: null");
		return;
	}

	var keyCode = e.keyCode ? e.keyCode : e.charCode;	// IE6+ (Safari3) : FireFox2
	//alert("Event: " + e.keyCode);
	this.obj = e;
	this.keyCode = keyCode;
	return this;
};


function Suggest_DivGet()
{
	return document.getElementById("autocomplete");
};

function Suggest_DivHtmlSet( html )
{
	//autocompleteHTML = html;
	Suggest_DivGet().innerHTML = html;
};

function Suggest_DivHtmlGet()
{
	return autocompleteHTML;
};

function Suggest_TxtGet()
{
	return document.getElementById("txtSuggest");
};


function Suggest_KeyDown( e )
{
	var event = Event(e);
	var keyCode = event.keyCode;
	//e.stopPropagation();

	if( keyCode == KEY_ENTER )
	{
		//if( autocompleteClosed || autocompleteHTML == "" )
		//	return;

		Suggest_Submit();
	}
	else if( keyCode == KEY_CURSOR_DOWN )
	{
		if( autocompleteClosed || autocompleteHTML == "" )
			return;

		if( autocompleteIndex < MAX_LIST )
			autocompleteIndex++;
		else
			autocompleteIndex = 0;
	}
	else if( keyCode == KEY_CURSOR_UP )
	{
		if( autocompleteClosed || autocompleteHTML == "" )
			return;

		if( autocompleteIndex > 0 )
			autocompleteIndex--;
		else
			autocompleteIndex = MAX_LIST;
	}
	else
	{	
		//alert(keyCode );

		//if( keyCode == 188 || keyCode == 190 )	// dont allow < (aspx error)
		//	return false;

		Suggest_SendQuery( e );
		return;
	}

	//document.getElementById("autocomplete").innerHTML = ;
	Suggest_Highlight( autocompleteIndex );
};


function Suggest_Highlight( index )
{
	var arr = new Array();
	arr = autocompleteHTML.split( LINE_BREAK );
	//var re = /\<term\>(.*?)\<\/term\>/gi;
	var re = new RegExp("\<term\>(.*?)\<\/term\>", "gi");
	var txtSuggest = Suggest_TxtGet();

	for( var i = 0; i < arr.length - 1; i++ )
	{
		var objItem = document.getElementById("SuggestRow"+i);

		if( i == index )
		{
			objItem.className = "hi";
			var matchArray = re.exec(arr[i]);
			txtSuggest.value = matchArray[1];
		}
		else
		{
			objItem.className = "";
		}
	}
};


function Suggest_MouseOver( index )
{
	// document.getElementById("autocomplete").innerHTML = ;
	autocompleteIndex = index;
	Suggest_Highlight( index );
};

function Suggest_MouseClick( index )
{
	Suggest_Submit();
};


function Suggest_Submit()
{
	var q = Trim( Suggest_TxtGet().value );
	if( q != "" )
	{
		if( q.indexOf("<") > -1 || q.indexOf(">") > -1 )
		{
			alert("Por favor, elimina los caracteres < > para poder realizar la búsqueda.");
			return;
		}

	    var enc = encodeURIComponent(q);
	    //alert("'"+q+"/'"+enc+"'");
	    
	    var objSearchScope = document.getElementById("SearchScope");
	    var searchScope = "";
	    if( typeof(objSearchScope) != "undefined" && objSearchScope.checked)
			searchScope = "&r=" + objSearchScope.value;
		//alert(searchScope);
		
		window.location.assign( window.location.pathname + "?q=" + enc + searchScope);
	}
};


function Suggest_SendQuery( e )
{
	//var keyCode = Event( e).keyCode;
	//if( keyCode == KEY_CURSOR_DOWN || keyCode == KEY_CURSOR_UP || keyCode == KEY_ENTER || autocompleteClosed )
	//	return;

	key = Suggest_TxtGet().value;

	if( key == "" || key.indexOf("<") > -1 || key.indexOf(">") > -1 )
	{
		autocompleteHTML = "";
		Suggest_HideDiv("autocomplete");
		return;
	}

	Suggest_Initialize();

	var url = "libraries/suggest.aspx?k=" + escape( VowelAccentStrip( key) );

	if( req != null )
	{
		req.onreadystatechange = Suggest_Process;
		req.open("GET", url, true);
		req.send(null);
	}
};


function Suggest_Process()
{
	if( req.readyState == 4 )
	{
		// only if "OK"
		if( req.status == 200 )
		{
			if( req.responseText == "" )
			{
				Suggest_HideDiv("autocomplete");
			}
			else
			{
				autocompleteIndex = AUTOCOMPLETEINDEX_INI;
				autocompleteHTML = req.responseText;
				//alert(autocompleteHTML);

				// getting total items in list
				//var re = /\<total\>(.*?)\<\/total\>/gi;	<-- alernating ERRORS (ret null) IN FireFox2!
				var re = new RegExp("\<total\>(.*?)\<\/total\>", "gi");
				var matchArray = re.exec( autocompleteHTML );
				MAX_LIST = parseInt( matchArray[1]) + AUTOCOMPLETEINDEX_INI;

				// removing extra info
				autocompleteHTML = autocompleteHTML.substr(0, autocompleteHTML.indexOf(DATA_END));
				//alert(autocompleteHTML);

				Suggest_ShowDiv("autocomplete");
				Suggest_DivGet().innerHTML = autocompleteHTML;
			}
		}
		else
		{
			Suggest_DivGet().innerHTML = "There was a problem retrieving data.";	//+ req.statusText;
		}
	}
};


function Suggest_ShowDiv(divid)
{
	if( autocompleteClosed )
		return;
		
	if( document.layers )
		document.layers[divid].visibility = "show";
	else
		document.getElementById(divid).style.visibility = "visible";
};

function Suggest_HideDiv( divid, force )
{
	autocompleteClosed = force;
	
	if( document.layers )
		document.layers[divid].visibility = "hide";
	else 
		document.getElementById(divid).style.visibility = "hidden";
};


function Suggest_BodyLoad()
{
	Suggest_HideDiv("autocomplete");
	
	var inputBox = Suggest_TxtGet();
	var div = Suggest_DivGet();

	//ClickEventAdd( Suggest_HideDiv("autocomplete") );
	document.getElementsByTagName("BODY")[0].onclick = function(){ Suggest_HideDiv("autocomplete"); };
	
	// horiz align input-box and drop-down div
	var x = FindPosX(inputBox);
	div.style.left = x + "px";	// "px" needed in FF & Safari

	inputBox.focus();
	inputBox.select();
}

/*
function Suggest_Set( str )
{
    Suggest_TxtGet().value = str;
}*/
