// флаг:включены/выключены подсказки
makeSuggestion = true;

//Id div контейнера с подсказкой
mainContainerId = 'ss_container';

//Id input поиска
searchInputId = 's';

//Id селектора выбора типа (songs/bands)
typeSelectorId = 'what';

//номер активного элемента
activeElem = 0;

//старое значение строки поиска
oldVal = '';

//флаг: последний результат нулевой; дабы не искать дальше, если начальные буквы результата не принесли
lastResultNull = false;

//возвращаемый массив с подсказками
ssArray = new Array({words:'', rating:0});

//минимальная длина, начиная с которой начинается поиск
minLength = 2;

//на сколько милисекунд задерживать отправку
keyPressTime = 200;

//ссылка на таймер нажития клавиш
keyPressTimerLink = null;

//Кеш подсказок
ssCache = new Object();

//Разделитель ключа Кеша
ssSeparator = '---';

//подсказка спрятана
ssIsHidden = true;

//передаем так же номер последнего запроса, 
//чтобы выводить результаты последнего отправленного запроса
ssLastQueryNumber = 0;

//вырубить браузерное автозаполнение
document.getElementById(searchInputId).setAttribute('autocomplete', 'off');

//прятать подсказку когда строка поиска не активна
document.getElementById(searchInputId).onblur = function () { 
	hideSearchResult();
}

//прятать подсказку когда селектор выбора типа не активен
document.getElementById(typeSelectorId).onblur = function () { 
	hideSearchResult();
}

//вырубить подсказки
function offSuggestions() {
	makeSuggestion = false;
}

//спрятать результат поиска
function hideSearchResult() {
	document.getElementById(mainContainerId).style.display = 'none';
	ssIsHidden = true;
}

//показать результат поиска
function showSearchResult() {
	document.getElementById(mainContainerId).style.display = 'block';
	ssIsHidden = false;
}

//распаковать XML файл в ssArray
function unpackNodeValueAll(obj, tag) {
	if (!obj)
		return;
	node=obj.getElementsByTagName(tag);
	if(node!=null && node.length>0) {
		for (i=0; i<node.length; i++) {
			childs = node[i].childNodes;
			retObj = new Object();
			for (j=0; j<childs.length; j++) {
				retObj[childs[j].tagName] = childs[j].firstChild.nodeValue;
			}
			ssArray.push(retObj);
		}
		return;
	} else {
		return;
	}
}

//записать значение активной подсказки в поле поика
function refreshCurrentValue() {
	document.getElementById(searchInputId).value = ssArray[activeElem].words;
}

//установить новый активный элемент
function setActiveElem(elem_num) {
	activeElem = elem_num;
	tableRefresh();
}

//активация поиска
function submitSearch() {
	refreshCurrentValue();
	document.getElementById('LMsearchForm').submit();
}

//перерисовка таблицы
function tableRefresh() {
	document.getElementById(mainContainerId).innerHTML = makeTable();
}

//первые три цифры значащие, остальные нули
function zeroRound(num, dig) {
	if (!dig)
		dig = 3;
	pow = Math.abs(num).toString().length - dig;
	pow = pow>0?pow:0;
	return num-num%Math.pow(10,pow);
}

//обрезает до 38 символов и добавляет "..."
function cutWords(words_normal, strCut) {
	if (!strCut)
		strCut = 38;
	words_cut = words_normal.substring(0,strCut);
	return (words_cut != words_normal)?words_cut + '...':words_cut;
}

//добавляет пробелы каждые три цифры (с конца)
function addDigitSpaces(num) {
	str = num.toString();
	new_str = '';
	var i;
	for (i=0;i<str.length;i++) {
		if	(i%3 == 0)
			new_str = ' ' + new_str;
		new_str = str.charAt(str.length-i-1) + new_str;
	}
	return new_str;
}

// приводим к нижнему регистру
// заменяем все символы кроме {букв латинского алфавита, цифр, пробела и одинарной кавычки} на пробелы
// удаляем пробелы из конца и начала строки
// если набор слов заключен в кавычки - удаляем их. если нет - то удаляем кавычки только вначале
// удаляем "лишние" пробелы
function trimDelSpaces(str) {
	str = str.toLowerCase();
	str = str.replace(/[^a-z0-9 ']/gi, " ");
	str = str.replace(/(^\s+)|(\s+$)/g, "");
	if (str.match(/^'+[a-z0-9 ']+'+$/i))
		str = str.replace(/(^[' ]+)|([' ]+$)/g, "");
	else {
		str = str.replace(/^[' ]+/g, "");
		str = str.replace(/[' ]+$/g, "'");
	}
	str = str.replace(/\s+/g, " ");
	return str;
}

//Возвращает код таблицы из распарсеного XML
function makeTable() {
	outHTML = '<table cellpadding="0" cellspacing="0" id="ss_table">';
	if (ssArray)
		for (i=1; i<ssArray.length; i++) {
			rating = zeroRound(ssArray[i].rating);
			rating = addDigitSpaces(rating);
			words = cutWords(ssArray[i].words);
			
			if (activeElem == i)
				outHTML += '<tr class="act_ss" onmousedown="submitSearch();">' +
								'<td class="firstCol">'+words+'</td>' +
								'<td align="right" class="secondCol">'+rating+(rating==1?' search':' searches')+'</td>' +
							'</tr>';
			else
				outHTML += '<tr class="not_act_ss" onmousemove = "setActiveElem('+i+');">' +
								'<td class="firstCol">'+words+'</td>' +
								'<td align="right" class="secondCol">'+rating+(rating==1?' search':' searches')+'</td>' +
							'</tr>';
		}
	
	//кнопочка close
	outHTML += '<tr>' +
					'<td colspan="2" align="right" class="secondCol">' +
						'<a href="" style="font-size:7pt;text-decoration:none" onmousedown="offSuggestions();" onclick="return false;">close <font color=red><b>x</b></font></a>' +
					'</td>' +
				'</tr>';
	
	outHTML += '</table>';
	return outHTML;
}

document.getElementById(searchInputId).onkeydown = function(event) {
	if (!makeSuggestion)
		return;
		
	keyCode = event ? event.keyCode : window.event.keyCode;
	
	if (keyCode == 38 && ssArray.length>minLength-1) {
		//клавиша "стрелочка вверх"
		//Выделить предыдущий элемент
		if (ssIsHidden) {
			showSearchResult();
		}
		else {
			activeElem = (activeElem + (ssArray.length-1))%ssArray.length;
			refreshCurrentValue();
			tableRefresh();
		}
	}
	else if (keyCode == 40 && ssArray.length>minLength-1) {
		//клавиша "стрелочка вниз"
		//Выделить следующий элемент
		if (ssIsHidden) {
			showSearchResult();
		}
		else {
			activeElem = (activeElem + 1)%ssArray.length;
			refreshCurrentValue();
			tableRefresh();
		}
	}
	else if (keyCode == 13) {
		//клавиша Enter
		hideSearchResult();
	}
};

document.getElementById(searchInputId).onkeyup = function(event) {
	if (!makeSuggestion)
		return;
	
	keyCode = event ? event.keyCode : window.event.keyCode;
	if (keyCode != 38 && keyCode != 40 && keyCode != 13){
		if (keyPressTimerLink)
			clearTimeout(keyPressTimerLink);
		keyPressTimerLink = setTimeout('searchSuggestion()', keyPressTime);
	}
}

//При переключении с песни на банду или обратно обновлять поиск
document.getElementById('what').onchange = function() {
	oldVal = '';
	lastResultNull = false;
	searchSuggestion();
}

//обрабатываем результат из Кеша или из Ajax запроса
function whenTakeResult() {
	//если возвращаемое значение пусто, то не продолжать поиск для заведомо нулевых результатов
	if (ssArray.length == 1) {
		lastResultNull = true;
		hideSearchResult();
	}
	else {
		lastResultNull = false;
		showSearchResult();
		tableRefresh();
	}
}

function searchSuggestion() {
	currentVal = trimDelSpaces(document.getElementById(searchInputId).value);
	ssArray[0].words = document.getElementById(searchInputId).value;
	
	//включена ли опция, изменилось ли значение
	//а так же вычисляет что (последний результат нулевой и мы продолжили вводить заведомо безрезультатные слова)
	if (makeSuggestion && currentVal!=oldVal && !(lastResultNull && currentVal.indexOf(oldVal)==0)) {
		oldVal = currentVal;
		//текущее значение больше минумима для поиска
		if (currentVal.length >= minLength) { 
			activeElem = 0;
			
			//проверяем Кеш
			if (ssCache[currentVal+ssSeparator+document.getElementById('what').value]) {
				//document.getElementById('output').innerHTML += '|';
				ssArray = ssCache[currentVal+ssSeparator+document.getElementById('what').value];
				ssArray[0].words = document.getElementById(searchInputId).value;
				whenTakeResult();
			}
			else {
				ssLastQueryNumber++;
				
				//данные для поиска подсказки
				data = new Array();
				data.push({name: 'words', 	value: currentVal});
				data.push({name: 'type', 	value: document.getElementById('what').value});
				data.push({name: 'qn',		value: ssLastQueryNumber});
				
				//отправлаем на сервер
				postUrl('/operations/search_suggestion.php', urlEncodeDict(data), true, execOnSuccess(function (req) {
						//проверяем нужный ли результат мы получили
						if (req.responseXML.documentElement.getElementsByTagName("qn")[0].firstChild.data == ssLastQueryNumber) {
							//распаковываем результат в массив
							ssArray = new Array({words:document.getElementById(searchInputId).value, rating:0});
							unpackNodeValueAll(req.responseXML.documentElement, "ss_elem");
							//кешируем его
							ssCache[currentVal+ssSeparator+document.getElementById('what').value] = ssArray;
							whenTakeResult();
						}
				}));
			}
		}
		else {
			//если не достигли необходимой длины для поиска
			lastResultNull = false;
			ssArray = new Array({words:document.getElementById(searchInputId).value, rating:0});
			hideSearchResult();
		}
	}
}
