/*
	CD Universe - PsychicSearch autocomplete script
	Copyright © 2007 CD Universe, all rights reserved.

	Unauthorized duplication and / or distribution is
	strictly prohibited.
*/

var results = new Array();
var selected = -1;
var submitted = false;
var currentsearch = '';
var resultsvisible = false;
var noblur = false;
var pagestyle;
var processing = false;
var pending = false;
var userselected = false;

var delay = 300; //ms between keystrokes

String.prototype.trim = function(x) {
	if (x=='left')
		return this.replace(/^\s*/,'');
	if (x=='right')
		return this.replace(/\s*$/,'');
	if (x=='normalize')
		return this.replace(/\s{2,}/g,' ').trim();

	return this.trim('left').trim('right');
} 

function initPS() {
	results = new Array();
	selected = -1;
	submitted = false;
	currentsearch = '';
	resultsvisible = false;
	noblur = false;
	pagestyle;
	processing = false;
	pending = false;

	clearResults();
}

function selectItem(index) {
	noblur = false;
	if (userselected) {
		currentsearch = results[index];
	}
	results = new Array();
	submitForm();
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function disablePS() {
	noblur = false;
	clearResults();
	document.getElementById('psychicsearch').value = 'off';
	fetchResults('', '', '', true);
}

function isEnabled() {
	return (document.getElementById('psychicsearch').value == 'on');
}

function processData() {
	if (!pending) {
		if (results.length > 0) {
			var newHTML = '';
			var psroot = document.getElementById('psroot');
			var searchtext = document.getElementById('HT_Search_Info');
			var matchLength = stringcompare.length;
			var matchStart = 0;
			var tempMatch = '';
			stringcompare = stringcompare.toLowerCase();

			var ps = document.getElementById('ps');

			for (i=0;i<results.length;i++) {
				tempMatch = results[i].toLowerCase();
				matchStart = tempMatch.indexOf(stringcompare);
				tempMatch = results[i].substring(0, matchStart) + '<b>' + results[i].substring(matchStart, matchStart + matchLength) + '</b>' + results[i].substring(matchStart + matchLength, results[i].length);
				newHTML += '<div id="result' + i + '" onclick="userselected=true;selectItem(' + i + ');" style="cursor:pointer;overflow:hidden;width:100%;padding:0px;color:#3c71b0;" onmouseover="noblur=true;highlight(' + i + ');" onmouseout="noblur=false;unselect(' + i + ');">';
				newHTML += '<font size="-1"><nobr>' + tempMatch + '</nobr></font></div>';
			}

			newHTML += '<hr width="100%" size="1" noshade color="#666666"><div style="cursor:pointer;padding:2px;color:#3c71b0;" align="center" onmouseover="noblur=true;" onmouseout="noblur=false;" onclick="disablePS();"><font size="1">Disable Psychic Search</font></div>';

			resultsvisible = true;

			var pos = findPos(searchtext);
			psroot.style.left = pos[0];
			psroot.style.top = pos[1] + searchtext.offsetHeight;
			psroot.style.width = 275;
			psroot.style.display = 'block';
			psroot.style.zIndex = 100;
			psroot.style.position = 'absolute';
			ps.innerHTML = newHTML;
		}
		else {
			clearResults();
		}
	}

	processing = false;
}
			
function validateData(e) {
	var keynum;
	var handled = false;

	if (isEnabled()) {
		if(window.event)
			keynum = e.keyCode;
		else if(e.which)
			keynum = e.which;
						
		// Escape
		if (keynum == 27) {
			noblur = false;
			userselected = false;
			hideResults();
			handled = true;
		}
		// Backspace
		else if (keynum == 8) {
			userselected = false;
			reloadData(e);
		}
		// Up Arrow
		else if (keynum == 38) {
			userselected = true;
			select(-1);
			handled = true;
		}
		// Down arrow
		else if (keynum == 40) {
			userselected = true;
			forceSearch();
			select(1);
			handled = true;
		}
		// Enter
		else if ((keynum == 13) && (selected >= 0)) {
			selectItem(selected);
			handled = true;
			submitForm();
		}
		else {
			noblur = false;
			userselected = false;
		}

		if (handled) {
			if(window.event)
				window.event.keyCode = 0;
						
			return false;
		}
	}
}

function reloadData(e) {
	var keynum;

	if (isEnabled()) {
		if(window.event)
			keynum = e.keyCode;
		else if(e.which)
			keynum = e.which;

		if ((keynum == null) || (keynum == 27)){
			if(window.event)
				window.event.keyCode = 0;

			return true;
		}
		else if ((keynum == 13) && (selected >= 0)) {
			if(window.event)
				window.event.keyCode = 0;
			
			return true;
		}
		else {
			pending = true;
			selected = -1;
			processRequest();
		}
	}
}

function highlight(index) {
	if (selected >= 0) {
		unselect(selected);
	}

	selected = index;

	var divX = document.getElementById('result' + selected);
	divX.style.backgroundColor = '#3c71b0';
	divX.style.color = '#ffffff';
}

function select(direction) {
	var next = selected + direction;

	if ((next >= 0) && (next < results.length)) {
		if (selected >= 0)
			unselect(selected);

		highlight(next);
	}
}

function unselect(index) {
	if ((index >= 0) && (index < results.length)) {
		var divX = document.getElementById('result' + index);
		divX.style.backgroundColor = '#ffffff';
		divX.style.color = '#3c71b0';
	}
}
			
function processRequest() {
	if ((!pending) && (!processing)) {
		current = document.getElementById('HT_Search_Info').value.trim().toLowerCase();

		if ((isEnabled()) && (!submitted) && (currentsearch != current)) {

			if (current) {
				processing = true;

				var searchtype = document.getElementById('HT_Search').options[document.getElementById('HT_Search').selectedIndex].value;
						
				var producttype = 1;

				if (pagestyle == 'music') {
					producttype = 1;
				}
				else if (pagestyle == 'movie') {
					producttype = 2;
				}
				else if (pagestyle == 'games') {
					producttype = 8;
				}
				else if (pagestyle == 'ice') {
					producttype = 16;
				}
				else if (pagestyle == 'gay') {
					producttype = 32;
				}
				else if (pagestyle == 'atoy') {
					producttype = 64;
				}
				else if (pagestyle == 'nov') {
					producttype = 512;
				}

				currentsearch = current;

				if (current.length > 2) {
					fetchResults(searchtype, producttype, escape(current), !(isEnabled()));
				}
				else {
					processing = false;
					pending = false;
					userselected = false;
					clearResults();
				}
			}
			else {
				userselected = false;
				clearResults();
			}
		}
	}
	else {
		setTimeout("processRequest()", delay);
		pending = false;
	}	
}

function fetchResults(searchtype, producttype, search, disabled) {
	var url = 'http' + secureProtocol + '://' + window.location.hostname + '/psychicsearch.asp?type=' + searchtype + '&producttype=' + producttype + '&search=' + search + '&disable=' + disabled;
	var head = document.getElementsByTagName('head')[0];
	var scriptTag = document.getElementById('psScript');

	if (scriptTag)
		head.removeChild(scriptTag);
								
	script = document.createElement('script');
	script.src = url;
	script.type = 'text/javascript';
	script.id = 'psScript';
	head.appendChild(script);
}
			
function hideResults() {
	if (!noblur) {
		selected = -1;
		resultsvisible = false;
		document.getElementById('psroot').style.display = 'none'
	}
}
			
function submitForm() {
	if (!submitted) {
		submitted = true;
		if (userselected) {
			document.getElementById('HT_Search_Info').value = currentsearch;
		}

		document.getElementById('psroot').style.display = 'none'
		document.getElementById('frmSearch').submit();

		submitted = false;
		return true;
	}

	return false;
}

function clearResults() {
	hideResults();
	currentsearch = '';
	results = new Array();
}

function forceSearch() {
	if (isEnabled() && (!resultsvisible)) {
		if (results.length > 0) {
			processData();
		}
		else {
			var searchtext = document.getElementById('HT_Search_Info').value;
			if (searchtext) {
				currentsearch = '';
				processRequest(searchtext);
			}
		}
	}
}