/* 
 **************************************************************************************************************************************************************
 **** Функции для быстрого поиска *****************************************************************************************************************************
 ************************************************************************************************************************************************************** 
*/

/*
 *** Vars *****************************************************************************************************************************************************
*/
//массивы со значениями для различных полей
//должны задаваться для каждого поля, для которого будет производиться поиск
var qsStdWordName   = new Array();  //input-поле с текстом быстрого поиска
var qsStdWordNmID   = new Array();  //hidden-поле, где хран. id названия слова
var qsStdDivList    = new Array();  //div c списком слов
var qsStdFoundArr   = new Array();  //массив со значениями поиска
var qsStdCurSel     = new Array();  //id текущ. выделен. строки поиска
var qsStdInpTimer   = new Array();  //таймер для расчета таймаута "не нажатия" клавиши в поле для запроса
var qsStdInpExpire  = new Array();  //истек ли период ожидания таймаута нажатия
var qaStdInpTimeout = new Array();  //таймаут нажатия
var qsStdCurStr     = new Array();  //текущая введенная строка
var qsStdSelColor   = new Array();  //цвет выделения элемента в списке
var qsStdSrchFuncNm = new Array();  //название функции нажатия на элемент списка
var qsStdQueryStr   = new Array();  //доп. параметры запроса
var qsStdMinLtrs    = new Array();  //мин. кол-во символов для осущ. запроса


//параметры для поля "Быстрый поиск"(sid = 0)
qsStdWordName[0]    = document.getElementById('qSrchFldWordName');
qsStdWordNmID[0]    = document.getElementById('qSrchHidWordNmID');
qsStdDivList[0]     = document.getElementById('qSrchDivSearchList');
qsStdFoundArr[0]    = new Array();
qsStdCurSel[0]      = 0;
qsStdInpTimer[0]    = 0;
qsStdInpExpire[0]   = false;
qaStdInpTimeout[0]  = qSrchInputTimeout;
qsStdCurStr[0]      = qSrchCurEnterStr;
qsStdSelColor[0]    = qSrchSelColor;
qsStdSrchFuncNm[0]  = 'SRCHSetQuickSearchResult';
qsStdQueryStr[0]    = '';
qsStdMinLtrs[0]     = 3;
var qSrchForm       = document.getElementById('qSrchForm');            
var qSrchSubmitBut  = document.getElementById('qSrchSubmitBut');

/*
 *** Перемещение по элементам всплывающего списка ******************************************************************************************************************
*/
// ***input:
// - myEvt - событие
// - sid   - id поля
function SRCHFldKeyDown(myEvt,sid){
	newSel = false; //рашрешает/запрещает выделить новый элемент
	delSel = false; //разрешает/запрещает снять выделение с предыдущего элемента
	//нажата клавиша 'down'
	if(myEvt.keyCode == 40) {
		//не конец списка
		if((qsStdCurSel[sid]+1) <= qsStdFoundArr[sid].length) {	
			//если непервый элемент
			if(qsStdCurSel[sid] != 0) {	
				//задаем id эл., с которого нужно снять выделение
				varPrevSel = qsStdCurSel[sid];
				delSel     = true;
			}
			//если первый - выделение не снимаем
			else delSel = false;			
			//задаем id эл., который нужно выделить
			qsStdCurSel[sid]++;
			newSel = true;
		}
		//если превысили кол-во элементов - возвращ. к полю
		else if((qsStdCurSel[sid]+1) > qsStdFoundArr[sid].length) {
			newSel = false;
			delSel = true;
			//задаем id эл., с которого нужно снять выделение
			varPrevSel = qsStdCurSel[sid];
			//текущий выд. эл = 0
			qsStdCurSel[sid]  = 0;
			//задаем значение выбранной слова в hidden-поле как 0
			qsStdWordNmID[sid].value = 0;
			//возвращ. в поле раннее введенное значение
			qsStdWordName[sid].value = qsStdCurStr[sid];
		}		
	}
	//нажата клавиша 'up'
	else if(myEvt.keyCode == 38) {
		//обычное пермещение
		if((qsStdCurSel[sid]-1) > 0) {
			//задаем id эл., с которого нужно снять выделение
			varPrevSel = qsStdCurSel[sid];
			//задаем id эл., который нужно выделить
			qsStdCurSel[sid]--;
			newSel = true;
			delSel = true;	
		}
		//если вернулись к полю
		else if((qsStdCurSel[sid]-1) == 0) {
			newSel = false;
			delSel = true;
			//задаем id эл., с которого нужно снять выделение
			varPrevSel = qsStdCurSel[sid];
			//текущий выд. эл = 0
			qsStdCurSel[sid]  = 0;
			//задаем значение выбранной слова в hidden-поле как 0
			qsStdWordNmID[sid].value = 0;
			//возвращ. в поле раннее введенное значение
			qsStdWordName[sid].value = qsStdCurStr[sid];
		}
		//если переходим из поля к послед. элменту
		else {
			newSel = true;			
			delSel = false;
			//задаем id эл., который нужно выделить
			qsStdCurSel[sid] = qsStdFoundArr[sid].length;
		}
	}
	//если нужно выделить новый элемент
	if(newSel) {
		//берем элемент и меняем стиль
		var aSerchResult = document.getElementById('aSerchResult_'+sid+'_'+qsStdCurSel[sid]); 
		aSerchResult.style.backgroundColor = qsStdSelColor[sid];
		//заносим в поле название слова, а в hidden-поле id названия слова
		qsStdWordNmID[sid].value = qsStdFoundArr[sid][qsStdCurSel[sid]-1][0];
		qsStdWordName[sid].value = qsStdFoundArr[sid][qsStdCurSel[sid]-1][1];	
	}
	//если нужно снять выделение со старого элемента
	if(delSel) {
		//берем элменет и меняем стиль
		var aSerchResult = document.getElementById('aSerchResult_'+sid+'_'+varPrevSel); 			
		aSerchResult.style.backgroundColor = '';					
	}
}

/* 
 *** Подтвержаем форму быстрого поиска *************************************************************************************************************************
*/
function SRCHSubmitQuickSearchForm() {
	//отправляем данные, только введено больше 3-х символов		
	if(qsStdWordName[0].value.length >= 3) {
		qSrchForm.submit();
	}
}

/*
 *** Истек таймаут ожидания нажатия клавиши в поле *************************************************************************************************************
*/
// ***input:
// - sid - id поля
function SRCHExpirePressTimeout(sid) {
	//очищаем таймер
	window.clearTimeout(qsStdInpTimer[sid]);
	//делаем отметку, что таймаут истек
	qsStdInpExpire[sid] = true;
	//прерываем запрос
	AjaxAbortQuery();
	//запрашиваем поиск
	SRCHAjaxGetQuickSearchList(0,'call',sid);
}

/*
 *** AJAX-запрос на получение списка должностей по введенной строке *********************************************************************************************
*/
// ***input:
// - myEvt - событие отжатия клавиши в поле
// - mtype - тип вызова('self' - из поля, 'call' - из кода)
// - sid   - id поля
function SRCHAjaxGetQuickSearchList(myEvt,mtype,sid) {
	//если вызвали из поля
	if(mtype == 'self') {
		//если нажаты клавиши стрелок - выходим
		if(myEvt.keyCode == 37 || myEvt.keyCode == 38 || myEvt.keyCode == 39 || myEvt.keyCode == 40) {
			return;
		}
	}

	//продолжаем если, только ввели не менее опред. числа символов	
	qsStdWordName[sid].value = DeleteLChars(qsStdWordName[sid].value);	
	if(qsStdWordName[sid].value.length < qsStdMinLtrs[sid]) {	
		//скрываем список найденных вхождений + фрейм
		qsStdDivList[sid].style.visibility   = 'hidden';	
		//qSrchDivSearchIframe.style.visibility = 'hidden';
		return;
	}		
	
	//если не истек таймаут ожидания нажатия клавиши в поле
	if(!qsStdInpExpire[sid]) {
		//очищаем таймер
		window.clearTimeout(qsStdInpTimer[sid]);
		//задаем новый таймер
		qsStdInpTimer[sid] = window.setTimeout(function(){SRCHExpirePressTimeout(sid)},qaStdInpTimeout);
		//выходим
		return;
	}
	//иначе
	else {
		//делаем отметку, что таймаут не истек
		qsStdInpExpire[sid] = false;
	}
	
	//сохраняем текущ. значение строки
	qsStdCurStr[sid] = qsStdWordName[sid].value;	
	//задаем значение выбранной слова в hidden-поле как 0	
	qsStdWordNmID[sid].value = 0;
	
	//составляем url
	var url = '/kernel/mod/php/ajax.quick.search.php?word=' + encodeURIComponent(qsStdWordName[sid].value) + qsStdQueryStr[sid] + '&ajax=1';

	//делаем запрос		
	ajaxRequest.onreadystatechange = function(){SRCHAjaxGetQuickSearchListResult(sid)}
	AjaxNewQuery(url,'GET',0,'def',0,0);
	//alert(url);
	
}

/*
 *** Обработка результатов AJAX-запроса на получение списка должностей по введенной строке **************************************************************************
*/
// ***input:
// - sid - id поля
function SRCHAjaxGetQuickSearchListResult(sid) {
	//если все норм.
	if(ajaxRequest.readyState == 4) {
		if(ajaxRequest.status == 200) {	

			//разбиваем вернувшееся значение
			var responseArr = ajaxRequest.responseText.split('"');
	
			//ост. таймер и разр. новый запрос	
			AjaxAbortQuery();
		
			//смотрим 1-ый элемент массива, если неудачно
			if(responseArr[0] != 'success') {
				//выходим
				return;
			}
			
			//отображаем div со списком	+ фрейм
			qsStdDivList[sid].style.visibility   = 'visible';
			//qSrchDivSearchIframe.style.visibility = 'visible';	
	
			//если список поиска пуст
			if(responseArr[1] == 'no_words_names') {
				qsStdDivList[sid].innerHTML = '<span>не найдено совпадений</span>';
			}
			//если есть значения - задаем список в div
			else {	
				//обнуляем массив результатов и тек. выбранный элемент
				qsStdFoundArr[sid] = new Array();
				qsStdCurSel[sid]   = 0;				
				qsStdDivList[sid].innerHTML = '';
				for(i=1;i<responseArr.length; i++) {
					//разбиваем массив с данными
					var dataArr = responseArr[i].split('>');
					//добавляем строку					
					newA = document.createElement('a');					
					newA.setAttribute('id','aSerchResult_'+sid+'_'+i);					
					newA.setAttribute('href','javascript:'+qsStdSrchFuncNm[sid]+'(' + (i-1) + ',' + sid + ')');
					newA.innerHTML = dataArr[1];
					qsStdDivList[sid].appendChild(newA);					
					//добвляем данные в массив				
					qsStdFoundArr[sid][i-1] = new Array();
					qsStdFoundArr[sid][i-1][0] = dataArr[0];
					qsStdFoundArr[sid][i-1][1] = dataArr[1];
				}
			}
		}
	}
}	

/*
 *** Выбираем нужную слово и задаем параметры в форму ************************************************************************************************************
*/
// ***input:
// - str_id - id строки
// - sid    - id поля
function SRCHSetQuickSearchResult(str_id) {	
	//задаем значения в поля
	qsStdWordNmID[0].value = qsStdFoundArr[0][str_id][0];
	qsStdWordName[0].value = qsStdFoundArr[0][str_id][1];	
	//подтверждаем форму
	qSrchForm.submit()
}


/*
 *** Выбираем нужное слово из списка для поиска по текущему соннику ***************************************************************************************
*/
// ***input:
// - str_id - id строки
// - sid    - id поля
function SRCHSetBookWordResult(str_id,sid) {
	//задаем значения в поля
	qsStdWordNmID[sid].value = qsStdFoundArr[sid][str_id][0];
	qsStdWordName[sid].value = qsStdFoundArr[sid][str_id][1];
	//делаем запрос
	SRCHSetBookWordQuery(sid,0,0);
}

// ***input:
// - sid - id поля
// - word_id,book_id - прямые значения, если после клика на ссылке
function SRCHSetBookWordQuery(sid,book_id,word_id) {
	if(AjaxCanQuery()) {
		//составляем запрос
		//если вызвано поиском из инпута
		if(word_id == 0) {		
			var url = '/kernel/mod/php/ajax.simple.funcs.php?ajax=1&act=interp_for_book&book_id=' + sdDookID + '&word_id=' + qsStdWordNmID[sid].value + '&word_nm=' + encodeURIComponent(qsStdWordName[sid].value);	
		}
		//если кликом по ссылке
		else {
			var url = '/kernel/mod/php/ajax.simple.funcs.php?ajax=1&act=interp_for_book&book_id=' + book_id + '&word_id=' + word_id + '&word_nm=*****';	
		}
		ajaxRequest.onreadystatechange = function(){SRCHSetBookWordQueryResult(sid,word_id)};
		AjaxNewQuery(url,'GET','','def',0,0);	
	}
}

// ***input:
// - sid - id поля
function SRCHSetBookWordQueryResult(sid,word_id) {
	//если все норм.
	if(ajaxRequest.readyState == 4) {
		if(ajaxRequest.status == 200) {	

			//разбиваем вернувшееся значение
			var responseArr = ajaxRequest.responseText.split('>');
	
			//ост. таймер и разр. новый запрос	
			AjaxAbortQuery();

			//смотрим 1-ый элемент массива, если неудачно
			if(responseArr[0] != 'success') {
				//выходим
				return;
			}
			//если все норм.
			else {			
				//прячем список, если вызвано поиском из инпута
				if(word_id == 0) {	
					qsStdDivList[sid].style.visibility = 'hidden';			
				}
			
				var result = '';
				//если нашли толкование
				if(responseArr[1] == "found") {				
					result += '<div class="contBox describeDream"><dl class="sd_left">';
					result += '<dt><strong>' + HtmlCharsConvertDecode(responseArr[4]) + '</strong> ';
					result += '<small class="gray">из сонника &laquo;' + HtmlCharsConvertDecode(responseArr[5]) + '&raquo;</small></dt>';
					result += '<dd>' + HtmlCharsConvertDecode(responseArr[6]);
					if(responseArr[2] == "not_full") {
						result += '...<br /><a target="_blank" href="/search/quick/?word_id='+responseArr[3]+'&word_nm='+encodeURIComponent(HtmlCharsConvertDecode(responseArr[4]))+'">Читать полностью &rarr;</a>';
					}
					result += '</dd>';
					result += '</dl></div>';				
				}
				//если не нашли
				else {
					result = '<div class="contBox describeDream"><dl><dd><br />Толкование слова не найдено.</dl></dd></div>';
				}				
				STDShowMsg('<h2>Результат поиска слова</h2>',result);	
			}			
		}
	}	
}

