/*
 * йКЮЯЯ ОНХЯЙЮ ОН ЯЮИРС
 */

var DEBUG = false;
var YANDEX_DIRECT_ENABLED = true;

var YandexDirect = new Class.create();
YandexDirect.prototype = {
	initialize: function(wrapper, iframe_name){
		this.wrapper = $(wrapper);
		if (!this.wrapper) return null;
		Element.update(this.wrapper, '<iframe src="" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" id="' + iframe_name + '" style="width:100%;height:0;margin:0;padding:0"></iframe>');
		this.iframe = $(iframe_name);
		Element.hide(this.wrapper);
		var _this = this;
		this.iframe.handle_height = function(height){
			this.style.height = height + 'px';
			//alert (height);
			if (!height) Element.hide(_this.wrapper);
		}
	},
	print: function(text, p){
		if (typeof YANDEX_DIRECT_ENABLED == 'undefined' || !YANDEX_DIRECT_ENABLED) return false;
		if (text){
			Element.show(this.wrapper);
			this.iframe.src = '/yadirect.html?' + $H({'text': text, 'page-no': p}).toQueryString(); // !!! gotta be toQueryString and nothing else;
			//alert(this.iframe.src);
		}else Element.hide(this.wrapper);
	}
}

var Search = new Class.create();
Search.prototype = {
	initialize: function(form, submit_btn, found_count_div, results_div, pagination_div, sort_div, error_div, copyright_div, yandex_direct, options){
		this.form = $(form);
		this.input = this.form.text;
		this.submit_btn = $(submit_btn);
		this.found_count_div = $(found_count_div);
		this.results_div = $(results_div);
		this.pagination_div = $(pagination_div);
		this.sort_div = $(sort_div);
		this.error_div = $(error_div);
		this.copyright_div = $(copyright_div);
		Element.hide(this.copyright_div);
		this.yandex_direct = yandex_direct || null;
		this.options = {
			url: this.form.action,
			page: 0,
			numdoc: 30,
			how: 'rlv', // rlv || tm
			doc_url_redundant: 'webds',
			doc_title_redundant: '',
			spcctx: 'doc',
			hostname: ''
		};
		Object.extend(this.options, options || {});

		this.found_count = 0;

		this.form.onsubmit = this.search.bindAsEventListener(this);

		this.initInput();
	},
	initInput: function(){
		if (location.search){
			var text = getQueryParam('text') || getQueryParam('s_string') || null; // !!! no unescape or decodeURIComponent/parseQuery; getQueryParam is global
			if (text) this.search(null, true, text);
		}
	},
	getElemText: function(node){
		return (node.text || node.textContent || (function(node){
			var _result = "";
			if (node == null) {
				return _result;
			}
			var childrens = node.childNodes;
			var i = 0;
			while (i < childrens.length) {
				var child = childrens.item(i);
				switch (child.nodeType) {
					case 1: // ELEMENT_NODE
					case 5: // ENTITY_REFERENCE_NODE
						_result += arguments.callee(child);
						break;
					case 3: // TEXT_NODE
					case 2: // ATTRIBUTE_NODE
					case 4: // CDATA_SECTION_NODE
						_result += child.nodeValue;
						break;
					case 6: // ENTITY_NODE
					case 7: // PROCESSING_INSTRUCTION_NODE
					case 8: // COMMENT_NODE
					case 9: // DOCUMENT_NODE
					case 10: // DOCUMENT_TYPE_NODE
					case 11: // DOCUMENT_FRAGMENT_NODE
					case 12: // NOTATION_NODE
					// skip
					break;
				}
				i++;
			}
			return _result;
		}(node))).strip();
	},
	resetPageIndex: function(){
		this.options.page = 0;
	},
	setInputValue: function(text){
		this.input.value = text;
	},
	doNav: function(obj){
		obj.className == 'ajax-search-prev' ? this.options.page-- : this.options.page++;
		this.search();
		document.all('ajax-search-found').scrollIntoView(true);
		//this.form.scrollIntoView(true);
	},
	doSort: function(obj){
		this.options.how = obj.getAttribute('_how');
		this.search(null, true);
		document.all('ajax-search-found').scrollIntoView(true);
		//this.form.scrollIntoView(true);
	},
	searchDone: function(request, response){
		var res_doc = request.responseXML;
		this.setInputValue(this.getElemText(res_doc.getElementsByTagName('query')[0])); // !!!
		var error_elem = res_doc.getElementsByTagName('error')[0] || null;
		if (this.yandex_direct) this.yandex_direct.print(error_elem ? '' : $F(this.input), this.options.page); // yandex direct
		if (error_elem){
			Element.update(this.results_div, '');
			Element.update(this.found_count_div, '');
			Element.update(this.pagination_div, '');
			Element.update(this.sort_div, '');
			Element.hide(this.copyright_div);
			Element.update(this.error_div, this.getElemText(error_elem));
			document.getElementById('ajax-search-found').innerHTML = 'Искомая комбинация слов  <b>&laquo;'+this.getElemText(res_doc.getElementsByTagName('query')[0])+'&raquo;</b> нигде не встречается.<br><br>Если Вы можете сообщить что-либо о слове, словосочетании, определении товара, организации или услуге, <a href="#" onClick="window.open(\'/cgi-bin/mailfind.cgi?text='+this.getElemText(res_doc.getElementsByTagName('query')[0])+'\',\'w1\', \'width=640 height=480\');return(false);">сообщите нам</a>.<br><br>Также, мы обязательно поможем найти и опубликуем интересующую Вас информацию, достаточно отправить нам <a href="#" onClick="window.open(\'/cgi-bin/mailfind.cgi?text='+this.getElemText(res_doc.getElementsByTagName('query')[0])+'\',\'w1\', \'width=640 height=480\');return(false);">запрос</a>.';
		}else{
			this.found_count = this.getElemText(res_doc.getElementsByTagName('found')[2]); // priority="all", used in a few places
			Element.update(this.error_div, '');
			Element.update(this.results_div, this.getResItems(res_doc));
			Element.update(this.found_count_div, this.getFoundCount(res_doc));
			Element.update(this.sort_div, this.getSortOptions(res_doc));
			Element.update(this.pagination_div, this.getNavOptions());
			Element.show(this.copyright_div);
			var _this = this;
			$A(this.sort_div.getElementsByTagName('a')).each(function(a){
				a.onclick = function(e){
					_this.doSort(a);
				}
			});
			$A(this.pagination_div.getElementsByTagName('a')).each(function(a){
				a.onclick = function(e){
					_this.doNav(a);
				}
			});
		}
		if (! this.options.page) {
			document.getElementById('search_log').src='/cgi-bin/search_log.pl?count='+this.found_count+'&text='+this.getElemText(res_doc.getElementsByTagName('query')[0]);
		}
	},
	search: function(e, first_time, text){
		var e = e || window.event;
		var first_time = (first_time) || (e && e.type == 'submit');
		var text = text || encodeURIComponent($F(this.input)) || null; // !!! gotta be encoded
		if (e) Event.stop(e);
		if (first_time) this.resetPageIndex();
		if (text){
			var pars = 'text=' + text + '&p=' + this.options.page + '&numdoc=' + this.options.numdoc + '&how=' + this.options.how + '&xml=yes&spcctx='+ this.options.spcctx;
			var req =new Ajax.Request(
			'/search/request?' + pars, // !!! no 'parameters'
			{
				method: 'get',
				onComplete: this.searchDone.bind(this)
			});
		}
	},
	getFoundCount: function(res_doc){
		return 'По запросу &laquo;'+this.form.text.value+'&raquo; найдено документов: ' + this.found_count;
	},
	getHighlightedText: function(node){
		if (!node) return '';
		$A(node.getElementsByTagName('hlword')).each(function(hlword){
			if (hlword.firstChild) hlword.firstChild.nodeValue = 'START_HL_WORD' + hlword.firstChild.nodeValue +  'END_HL_WORD';
		});
		return this.getElemText(node).replace(/START_HL_WORD/gi, '<strong>').replace(/END_HL_WORD/gi, '</strong>');
	},
	getResItems: function(res_doc){
		var s = '';
		var _this = this;
		var page_first = res_doc.getElementsByTagName('page')[1].getAttribute('first');
		var index = 0;
		$A(res_doc.getElementsByTagName('doc')).each(function(doc){
			var url = _this.getElemText(doc.getElementsByTagName('url')[0]).substring(_this.options.doc_url_redundant.length).replace(':8080', '').replace('?print=1','');

			//s += '<li value="' + (page_first++) + '"><a href="/' + url + '" target="_blank" style="font-weight:bold">' + _this.getElemText(doc.getElementsByTagName('title')[0]).substring(_this.options.doc_title_redundant.length) + '</a><div style="margin:3px 0"><small>' + _this.getHighlightedText(doc.getElementsByTagName('headline')[0]) + '&hellip; ' + _this.getHighlightedText(doc.getElementsByTagName('passages')[0]) + '</small></div><div style="color:gray;font-size:85%;margin-bottom:11px">http:/' + _this.options.hostname + url +  ' ::  '+_this.getElemText(doc.getElementsByTagName('modtime')[0]).substring(0, '0000-00-00'.length)+'</div></li>';
			s += '<li value="' + (page_first++) + '"><a href="/' + url + '" style="font-weight:bold">' + _this.getElemText(doc.getElementsByTagName('title')[0]).substring(_this.options.doc_title_redundant.length) + '</a><div style="margin:3px 0">' + _this.getHighlightedText(doc.getElementsByTagName('headline')[0]) + '&hellip; ' + _this.getHighlightedText(doc.getElementsByTagName('passages')[0]) + '</div><div style="color:#a6a6a6;margin-bottom:11px">http:/' + _this.options.hostname + url + '</div></li>';
		});
		return s;
	},
	getNavOptions: function(res_doc){
		var prev_page = this.options.page ? '&larr; <a href="javascript:void(0)" class="ajax-search-prev">Предыдущая страница</a>' : '';
		var next_page = this.found_count > this.options.numdoc * (!this.options.page ? 1 : (this.options.page + 1)) ? (prev_page ? ' &nbsp;|&nbsp; ' : '') + '<a href="javascript:void(0)" class="ajax-search-next">Следующая страница</a> &rarr;' : '';
		return prev_page + next_page;
	},
	getSortOptions: function(res_doc){
		var how_rlv = this.options.how == 'rlv' ? '<strong>по релевантности</strong>' : '<a href="javascript:void(0)" _how="rlv">по релевантности</a>';
		var how_tm = this.options.how == 'tm' ? '<strong>по дате<strong>' : '<a href="javascript:void(0)" _how="tm">по дате</a>';
		//return 'Сортировка: ' + how_rlv + ' &nbsp;|&nbsp; ' + how_tm;
	}
}