var SearchEngine =
{
	minChar: 3, timeoutSec: 0.3,

	url: location.protocol + "//" + location.host + "/catalog/searchEngine_getHint.php",
	xhr: null,
	hintDiv: null,
	to: false,


	getHint: function (caller)
	{
		this.hintDiv = getE ("searchEngine_hintContainer");

		if (caller.value.length < SearchEngine.minChar)
		{
			SearchEngine.hintDiv.className = "searchEngine_hintContainer searchEngine_hintContainer_off";
			return;
		}

		this.val = caller.value;
		$cT (this.to);
		this.to = $sT ("SearchEngine.send ();", this.timeoutSec * 1000);
	},
	send: function ()
	{
		if (this.xhr)
			this.xhr.abort ();
		this.xhr = getXHR ();
		var url = SearchEngine.url + "?q=" + this.val;

		this.xhr.onreadystatechange = SearchEngine.stateChanged;
		this.xhr.open ("GET", url, true);
		this.xhr.send (null);
	},
	stateChanged: function ()
	{
		if (SearchEngine.xhr.readyState == 4 || SearchEngine.xhr.readyState == "complete")
		{
			if (this.responseText != "")
				SearchEngine.applyHint ();
			this.xhr = false;
		}
	},


	applyHint: function ()
	{
		try
		{
			eval ("var result = " + this.xhr.responseText + ";");
		}
		catch (e)
		{
			alert (e);
			return;
		}

		var i, div;

		for (i = this.hintDiv.childNodes.length - 1; i >= 0 ; i--)
		{
			this.hintDiv.removeChild (this.hintDiv.childNodes[i]);
		}


		if (result == false)
		{
			div = this.createDiv ("nessun risultato");
			this.hintDiv.appendChild (div);
		}
		else
		{
			for (i = 0; i < result.length; i++)
			{
				div = this.createDiv (result[i].n);
				div.prodoID = result[i].p;
				this.hintDiv.appendChild (div);
			}
		}

		this.hintDiv.className = "searchEngine_hintContainer";
	},
	createDiv: function (code)
	{
		var div = document.createElement ("div");
		div.className = "searchEngine_hintItem searchEngine_hintItem_out";
		div.onmouseover = SearchEngine.itemOver;
		div.onmouseout = SearchEngine.itemOut;
		div.onclick = SearchEngine.itemClick;
		// var vals = val.split (" ");
		// for (var i in vals)
		div.innerHTML = str_ireplace (this.val, "<b>" + this.val + "</b>", code);

		return div;
	},


	// *********************
	//		Item Mouse Events
	itemOver: function ()
	{
		this.className = "searchEngine_hintItem searchEngine_hintItem_over";
	},
	itemOut: function ()
	{
		this.className = "searchEngine_hintItem searchEngine_hintItem_out";
	},
	itemClick: function ()
	{
		this.className = "searchEngine_hintItem searchEngine_hintItem_out";
		if (typeof this.prodoID != 'undefined')
			location.href = location.protocol + "//" + location.host + "/catalog/product_info.php?products_model=" + this.prodoID;
	}
}



// *********************
//		LIBRERIE GENERICHE
function getXHR ()
{
	var xhr = null;
	try
	{
		// Firefox, Opera 8.0+, Safari
		xhr = new XMLHttpRequest ();
	}
	catch (e)
	{
		// Internet Explorer
		try
		{
			xhr = new ActiveXObject ("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			xhr = new ActiveXObject ("Microsoft.XMLHTTP");
		}
	}

	return xhr;
}







function getE (elem)
{
	if (typeof elem == "string")
		return document.getElementById (elem);
	else
		return elem;
}
function $cT (t)
{
	if (typeof t != 'boolean')
		window.clearTimeout (t);
}
function $sT (cmd, to)
{
	return window.setTimeout (cmd, to);
}


function str_replace(search, replace, subject)
{
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Gabriel Paderni
    // +   improved by: Philip Peterson
    // +   improved by: Simon Willison (http://simonwillison.net)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   bugfixed by: Anton Ongson
    // +      input by: Onno Marsman
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    tweaked by: Onno Marsman
    // *     example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
    // *     returns 1: 'Kevin.van.Zonneveld'
    // *     example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');
    // *     returns 2: 'hemmo, mars'

    var f = search, r = replace, s = subject;
    var ra = r instanceof Array, sa = s instanceof Array, f = [].concat(f), r = [].concat(r), i = (s = [].concat(s)).length;

    while (j = 0, i--) {
        if (s[i]) {
            while (s[i] = (s[i]+'').split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){};
        }
    };

    return sa ? s : s[0];
}
function str_ireplace (search, replace, subject)
{
    // http://kevin.vanzonneveld.net
    // +   original by: Martijn Wieringa
    // +      input by: penutbutterjelly
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    tweaked by: Jack
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // *     example 1: str_ireplace('l', 'l', 'HeLLo');
    // *     returns 1: 'Hello'

    var i, k = '';
    var searchl = 0;

    search += '';
    searchl = search.length;
    if (!(replace instanceof Array)) {
        replace = new Array(replace);
        if (search instanceof Array) {
            // If search is an array and replace is a string,
            // then this replacement string is used for every value of search
            while (searchl > replace.length) {
                replace[replace.length] = replace[0];
            }
        }
    }

    if (!(search instanceof Array)) {
        search = new Array(search);
    }
    while (search.length>replace.length) {
        // If replace has fewer values than search,
        // then an empty string is used for the rest of replacement values
        replace[replace.length] = '';
    }

    if (subject instanceof Array) {
        // If subject is an array, then the search and replace is performed
        // with every entry of subject , and the return value is an array as well.
        for (k in subject) {
            subject[k] = str_ireplace(search, replace, subject[k]);
        }
        return subject;
    }

    searchl = search.length;
    for (i = 0; i < searchl; i++) {
        reg = new RegExp(search[i], 'gi');
        subject = subject.replace(reg, replace[i]);
    }

    return subject;
}


function randomString (len)
{
	var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
	var randomstring = '';
	for (var i=0; i < len; i++)
	{
		var rnum = Math.floor(Math.random() * chars.length);
		randomstring += chars.substring(rnum,rnum+1);
	}

	return randomstring;
}
