var searchTime, keynum, pageURL, pagename;

function search(text, page) {
	pageURL = document.referrer;
	pagename = pageURL.substring(pageURL.lastIndexOf('/') + 1, pageURL.indexOf('?'));

	clearKey();
	if (page == undefined || page < 1)
		page = 1;
	if (text == undefined) {
		var qsearch = document.getElementById("qsearch");
		if (qsearch && qsearch.value.length > 0 && qsearch.value != "Search for answers")
			text = qsearch.value;
	}
	text = escape(text);
	getResults(text, page);
}

function setKey(e) {
	clearKey();

	if (window.event)
		keynum = e.keyCode;
	else if (e.which)
		keynum = e.which;
	if (keynum == 13)
		search();
	else if (keynum == null || (keynum < 32 && keynum != 8))
		return;
	else
		searchTime = setTimeout("search()", 300);
	keynum = null;
}

function clearKey() {
	clearTimeout(searchTime);
}

function startLoader() {
	var loader = document.getElementById("ajaxloader");
	loader.style.visibility = "visible";
}

function stopLoader() {
	var loader = document.getElementById("ajaxloader");
	loader.style.visibility = "hidden";
}

function getResults(text, page) {
	startLoader();
	var url = "squizajax.php";
	var params = "text=" + text + "&page=" + page;

	var http = null;
	if (window.XMLHttpRequest)
		http = new XMLHttpRequest();
	else if (window.ActiveXObject)
		http = new ActiveXObject("Microsoft.XMLHTTP");

	if (http != null) {
		http.open("POST", url, true);
		http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		http.setRequestHeader("Content-length", params.length);
		http.setRequestHeader("Connection", "close");

		http.onreadystatechange = function() {
			if (http.readyState == 4 && http.status == 200)
				parseJSON(http.responseText);
		}
		http.send(params);
	}
}

function parseJSON(text) {
	var search = eval('(' + text + ')');

	var resdiv = document.getElementById("results");
	if (resdiv)
		resdiv.parentNode.removeChild(resdiv);

	var rdiv = document.createElement("div");
	rdiv.id = "results";

	createPages(search, rdiv);

	if (search.error) {
		var rei = document.createElement("p");
		rei.className = "sresult error";
		rei.innerHTML = "Error: " + search.error;
		rdiv.appendChild(rei);
	}
	else {
		var resultLen = search.results.length;
		if (resultLen == 0) {
			var rei = document.createElement("p");
			rei.className = "sresult last";
			rei.innerHTML = "No questions found matching your query.";
			rdiv.appendChild(rei);
		}
		else {
			for (var i=0; i<resultLen; i++) {
				var rei = document.createElement("p");
				rei.className = "sresult";
				if (i%2 == 0)
					rei.className += " even";
				rei.innerHTML = "<b>Question: </b>" + search.results[i].question + "<br/><br/>\n<b>Answer: </b>" + search.results[i].answer;
				rdiv.appendChild(rei);
			}
		}
	}
	document.getElementById("search").appendChild(rdiv);
	stopLoader();
}

function createPages(search, rdiv) {
	var oldSpan = document.getElementById("searchnav");
	if (oldSpan)
		oldSpan.parentNode.removeChild(oldSpan);
	var span = document.createElement("p");
	span.id = "searchnav";
	var pageOffset = 2;
	var arrows = new Array();
	var pages = new Array();
	var qtext = search.text;

	var curpage = search.curpage/1;
	var startpage = curpage-pageOffset;
	var maxpage = search.maxpage/1;
	var maxOffset = curpage+pageOffset;

	if (search.results.length > 0) {
		arrows[0] = '&lt;&lt;';
		arrows[1] = '&lt;';
		arrows[2] = '&gt;';
		arrows[3] = '&gt;&gt;';

		arrows[0] = arrows[0].link(qtext, 1);
		if (curpage > 1)
			arrows[1] = arrows[1].link(qtext, curpage-1);
		else
			arrows[1] = arrows[1].link(qtext, curpage);
		if (curpage < maxpage)
			arrows[2] = arrows[2].link(qtext, curpage+1);
		else
			arrows[2] = arrows[2].link(qtext, curpage);
		arrows[3] = arrows[3].link(qtext, maxpage);

		while (startpage <= maxOffset) {
				if (startpage > 0) {
				if (startpage > maxpage)
					startpage = maxOffset+1;
				else {
					pages[startpage] = startpage.toString();
					if (startpage != curpage)
						pages[startpage] = pages[startpage].link(qtext, startpage);
				}
			}
			startpage++;
		}
		arrows = arrows.concat(pages);
		arrows = arrows.concat(arrows.splice(2, 2));
		span.innerHTML = arrows.join(" ");
	}
	document.getElementById("search").appendChild(span);
}

function toggleInput(hide) {
	var obj = document.getElementById("qsearch");
	if (hide) {
		if (obj.value == "Search for answers")
			obj.value = "";
	}
	else {
		if (obj.value == "")
			obj.value = "Search for answers";
	}
}

String.prototype.link = function(text, page) {
	return '<a href="'+pagename+'?q='+text+'&page='+page+'" onclick="location.href = \'javascript:search(\\\'' + addslashes(addslashes(text)) + '\\\', ' + page + ')\'; return false;">' + this + '</a>';
}

function addslashes(str) {
	return String(str).replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0");
}
