dom = (document.getElementById)?(true):(false);
ie = document.all;
ie4 = ie && !dom;
nn4 = document.layers;

var isMSIE = true; isMSIE = /*@cc_on!@*/false;
var isOpera = (navigator.appName=="Opera");

visible = (nn4)?('show'):('visible');
hidden = (nn4)?('hide'):('hidden');

////////////////////////////////////////////////////////////////////////////////

function getElemById(elemId)
{
	return (dom)?(document.getElementById(elemId)):(document.all[elemId]);
}

var tabIds = new Array("metasearchTabDiv", "wikiTabDiv");

function setTab(tabId) 
{
	if (tabId < 0)	tabId = 0;
	if (tabId > 1)	tabId = 1;	
	for (var i = 0; i < tabIds.length; ++i) 
	{
		var currTab = document.getElementById(tabIds[i]);
		if (i == tabId) currTab.className = document.searchfrm.smode.value + "_" + tabIds[i] + "_selected";
		else currTab.className = document.searchfrm.smode.value + "_" + tabIds[i];
	}
	var year = 365*24*3600*1000;
	setCookie("tabID", tabId, year);
	switch (tabId)
	{
	    case 0: setMS(); break;
	    case 1: setWiki(); break;
	    default: setMS();
	};
	tryFocus();
}

function setWiki()
{
	document.getElementById("collengines").name="collections";
	document.getElementById("collengines").value="WIKIPEDIA";
	document.searchfrm.wikipedia.checked = true;
}

function setMS()
{
	document.searchfrm.wikipedia.checked = false;
	document.getElementById("collengines").name="engines";
	document.getElementById("collengines").value="GOOGLE YANDEX RAMBLER ASK YAHOO MSN";
}

function switchThesaurus() 
{
	var thesaurusDiv = document.getElementById("thesaurusDiv");
	if (thesaurusDiv.style.display == "none") thesaurusDiv.style.display="block";
	else	thesaurusDiv.style.display = "none";
}

function pause (mSec)
{
	clock = new Date();
	justMinute = clock.getTime();
	while (true)
	{
		just = new Date();
		if (just.getTime() - justMinute > mSec) break;
	}
}
// Функция установки значения cookie.
// name      - имя cookie
// value     - значение cookie
// [path]    - путь, для которого cookie действительно (по умолчанию - /)
// [expires] - дата окончания действия cookie (по умолчанию - до конца сессии)
// [domain]  - домен, для которого cookie действительно (по умолчанию - домен,
//             в котором значение было установлено)
// [secure]  - логическое значение, показывающее требуется ли защищенная
//             передача значения cookie
function setCookie(name, value, expires, path, domain, secure) {

	var exp = new Date();
	if(expires)
	{
		var cookieexpire = exp.getTime()+expires;
		exp.setTime(cookieexpire);
	}
	
	var curCookie = name + "=" + escape(value) +
			((expires) ? "; expires=" + exp.toGMTString() : "") +
			((path) ? "; path=" + path : "; path=/") +
			((domain) ? "; domain=" + domain : "") +
			((secure) ? "; secure" : "");
	document.cookie = curCookie;
}

// Функция чтения значения cookie.
// name - имя считываемого cookie
function getCookie(name) {
	var prefix = name + "=";
	var cookieStartIndex = document.cookie.indexOf(prefix);
	if(cookieStartIndex == -1) return null;
	var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length);
	if(cookieEndIndex == -1) cookieEndIndex = document.cookie.length;
	return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex));
}

// Функция удаления значения cookie
// name - имя cookie
// [path] - путь, для которого cookie действительно
// [domain] - домен, для которого cookie действительно
function delCookie(name, path, domain) 
{
	if(getCookie(name))
	{
		document.cookie = name 
					+ "=" + ((path) ? "; path=" + path : "; path=/") 
					+ ((domain) ? "; domain=" + domain : "") 
					+ "; expires=Thu, 01-Jan-70 00:00:01 GMT";
	}
}

// Устанавливает Cookie сложной структуры.
function setCookieEx(name, value, expires, path, domain, secure)
{
	value=Serialize(value);
	return setCookie(name, value, expires, path, domain, secure);
}

// Читает Cookie сложной структуры.
function getCookieEx(name)
{
	var v=getCookie(name);
	return Unserialize(v);
}

// Разделители для сериализации (те же, что в CGI::WebIn)
var Div1 = '.';
var Div2 = '.';

// Функция сериализации, совместимая с CGI::WebIn::Serialize
// Вложенные ссылки игнорируются.
function Serialize(v)
{ return "L1"+Div1+SerializeWO(v);
}

// Функция десериализации.
// Вложенные ссылки игнорируются.
function Unserialize(v)
{ var sb=new StringBuffer(v);
  if(sb.first(1)=='L') sb.shiftTill(Div2);
  return UnserializeWO(sb);
}

function UnserializeWO(sb)
{
	if(sb.first(1)=='r') sb.shift(1);
	var type=sb.first(1);
	if(type=='L' || type=='H') {
    // Массив
		sb.shift(1);
		if(sb.first(1)=='L') sb.shift(1);
		var n=sb.shiftTill(Div2);
		var len = parseInt(n);
		var a=new Array(len);
		for(var i=0; i<len; i++) {
			a[i]=UnserializeWO(sb);
		}
    // если хэш, то преобразуем
		if(type=='H') {
			var h=new Hashtable();
			for(var i=0; i<a.length; i+=2) h[a[i]]=a[i+1];
			return h;
		} else {
			return a;
		}
	} else {
    // Строка
		var n=sb.shiftTill(Div1);
		var len = parseInt(n);
		var s=sb.shift(len);
		return s;
	}
 
}

function SerializeWO(v)
{
	if (v==null || typeof v=='number' || typeof v=='string') {
		if(v==null) v="";
		return (""+v).length+Div1+(""+v);
	} else if(v instanceof Array) {
		var s="rL"+v.length+Div2;
		for(var i=0; i<v.length; i++) {
			s+=SerializeWO(v[i]);
		}
		return s;
	} else {
		var a=new Array();
		for(var k in v) {
			if(v[k]==null) continue;
			a[a.length++]=k;
			a[a.length++]=v[k];
		}
		var s="rHL"+a.length+Div2;
		for(var i=0; i<a.length; i++) {
			s+=SerializeWO(a[i]);
		}
		return s;
	}
}

// Строковой буфер с возможностью сдвига влево.
function StringBuffer(s)
{       this.s=''+s;
        this.shift=StringBuffer_shift;
	this.shiftTill=StringBuffer_shiftTill;
	this.first=StringBuffer_first;
}

function StringBuffer_shift(n)
{        var s=this.s.substr(0,n);
        this.s=this.s.substr(n);
	return s;
}

function StringBuffer_shiftTill(s)
{       var p=this.s.indexOf(s);
        var r=this.shift(p);
	this.shift((""+s).length);
	return r;
}

function StringBuffer_first(n)
{        return this.s.substr(0,n);
}

function getInnerText(elemId)
{
	var e = getElemById(elemId);
	if(!e) return "";
	return isMSIE ? e.innerText : e.text;
}
////////////THESAURUS PROCESSING FUNCTIONS/////////////////////////////////////
function trim(str, chars) 
{
	return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) 
{
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) 
{
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}
//////////////////////////////////////////////////////////////////////////////
function  GetWordsArrayFromString(WordsString, Delimiter)
{
	var words=new Array();
	var wStr=WordsString;
	var spacePos=0;
	while ((spacePos=wStr.indexOf(Delimiter) )!=-1)
	{
		var s=wStr.substring(0,spacePos);
		words.push(trim(s));
		wStr=wStr.substring(spacePos+1);
	}
	words.push(trim(wStr));
	return words;
}

function decode(s)
{
	s = decodeURI(s).replace(new RegExp("[+]","g"), ' ');
	return s.replace(new RegExp("%2C","g"), ',').toLowerCase();
}

function PosAndLength(pos, len)
{
	this.pos = pos;
	this.len = len;
}

function cmpSize(a, b) 
{
	var aWords = GetWordsArrayFromString(a, " ");
	var bWords = GetWordsArrayFromString(b, " ");
	
	if ( aWords.length > bWords.length) return -1;
	if (aWords.length < bWords.length) return 1;
	if (String(a) < String(b)) return -1;
	if (String(a) > String(b)) return 1;	
	return 0;
}
   
function findWordInQuery(queryStr, WordsForSwitch)
{
	var SWords = GetWordsArrayFromString(decode(WordsForSwitch), '|');
	SWords.sort(cmpSize);
	qStr = queryStr.toLowerCase();

	var j;
	var pos = -1;

	for (j=0; j<SWords.length ;j++)
	{
		pos = qStr.indexOf(SWords[j]);
		if(pos != -1) break;
	}            
		
	if( pos == -1)  return new PosAndLength(-1, -1);
 
	var len = (SWords[j]).length;
	return new PosAndLength(pos, len);
}

function switchWord(arg)
{
	var elems = GetWordsArrayFromString(arg, '~');
	var ForSwitch = decode(elems[0]);
	var New = decode(elems[1]);	
	var queryString = document.searchfrm.elements.namedItem('query').value;
	var posAndLen = findWordInQuery(queryString,ForSwitch);
        
	if( posAndLen.pos == -1) return; // not found
	var last = posAndLen.pos + posAndLen.len;
	var firstStr = queryString.substring(0, posAndLen.pos);
	var lastStr = queryString.substring(last, queryString.length);
	document.searchfrm.elements.namedItem('query').value = firstStr + New + lastStr;
}
///////////////////////////////////////////////////////////////////////////////

var isCtrl = false; 
var isAlt = false;
			
function keyUp(e)
{ 	
	if(window.event) 
	{
		if(window.event.ctrlKey)  isCtrl=false; 
		if(window.event.altKey)  isAlt=false;
	}
	else 
	{
		if(e.which == 17) isCtrl=false; 
		else if(e.which == 18) isAlt=false; 
	}
	return false;
} 

function keyDown(e)
{ 
	var key;
	if(window.event)
	{
		key = window.event.keyCode;     //IE
		if(window.event.ctrlKey)isCtrl = true;
		else 			isCtrl = false;
		
		if(window.event.altKey) isAlt=true;
		else 			isAlt=false;
	}
	else
	{
		key = e.which;     //firefox
		if(e.ctrlKey)	isCtrl = true;
		else		isCtrl=false;		
		
		if(e.altKey) 	isAlt=true;
		else		isAlt=false
	}
		
	var code = key;	
	if(code == 17)		isCtrl=true;
	else if(code == 18)	isAlt=true;	
	else if((code==0 || code==32 || (code>46 && code<91) || code>157) && (!(isCtrl || isAlt))) 
		document.searchfrm.query.focus();
	else if(code == 37 && isCtrl) 
	{		
		d = getElemById('page_left');
		if(d) location.href = d.href;
 		return false; 
	}
	else if(code == 39 && isCtrl) 
	{
		d = getElemById('page_right');
		if(d) location.href = d.href;
 		return false; 
	}		
	return true;
}

var keyUp_def = document.onkeyup;
var keyDown_def = document.onkeydown;
			
function qFocus()
{
	document.onkeyup=keyUp_def;
	document.onkeydown=keyDown_def;
}

function qBlur()
{
	document.onkeyup=keyUp;
	document.onkeydown=keyDown;
}

function searchEngine(flagInput, cook, engine)
{	
	var v=flagInput.checked = !(getCookie(cook)=="not_checked");	
	var e=document.getElementById(engine);
	if(e) {e.checked=v;}
	//alert("element: " + e + " for coockie: " + cook + " status: " + v);
}

function restoreQuery()
{
	document.searchfrm.query.value = getInnerText('raw_query_text');
}

function checkLanguages()
{
/*
        if(document.settfrm&&document.settfrm.searchRusLang)
                document.settfrm.searchRusLang.checked=document.searchfrm.lang_ru.checked;
        if(document.settfrm&&document.settfrm.searchEngLang)
                document.settfrm.searchEngLang.checked=document.searchfrm.lang_en.checked;
*/
}


function tryFocus()
{	
	if(document.searchfrm.query.value != "") qBlur();        
        else document.searchfrm.query.focus();        
}

function FormLoad()
{	
	restoreQuery();	
	document.searchfrm.query.onfocus=qFocus;
	document.searchfrm.query.onblur=qBlur;
	//tryFocus();

	var tabId = getCookie("tabID");
	if (!tabId) tabId = 0;		
	setTab(tabId + 0);
	
	searchEngine(document.searchfrm.google, "google", "googleEngine");
	searchEngine(document.searchfrm.yandex, "yandex", "yandexEngine");
	searchEngine(document.searchfrm.rambler, "rambler", "ramblerEngine");
	searchEngine(document.searchfrm.ask, "ask", "askEngine");
	searchEngine(document.searchfrm.msn, "msn", "msnEngine");
	searchEngine(document.searchfrm.yahoo, "yahoo", "yahooEngine");
	
//	document.searchfrm.lang_ru.checked = !(getCookie("lang_ru")=="not_checked");		
//	document.searchfrm.lang_en.checked = (getCookie("lang_en")=="checked");
	checkLanguages();
	
	var val = getCookie("result_size");
	document.searchfrm.result_size.value = val ? val : 20;	
	if(document.settfrm&&document.settfrm.engineResultsCount)
		document.settfrm.engineResultsCount.value = document.searchfrm.result_size.value
	    
	var dpp = getCookie("docsperpage");
	document.searchfrm.docsperpage.value=dpp ? dpp : 10;
            
	var profile_id=getCookie("profile_id");
	document.searchfrm.profileid.value=profile_id ? profile_id : 1;		
	
	if(document.settfrm&&document.settfrm.searchType)
	{		
		for(var i = 0; i < document.settfrm.searchType.length; ++i)
		{			
			document.settfrm.searchType[i].checked=((i+1)==document.searchfrm.profileid.value);	
		}
	}
	
	if(document.searchfrm.smode)
	{
		var year = 365*24*3600*1000;
		var smode = document.searchfrm.smode.value.toLowerCase();
		setCookie("smode", smode, year);				
	}
	
	var slq=getCookie("showLinkedQueries");
	var lqd = document.getElementById("linkedQueriesDiv");
	if(slq && slq=="no" && lqd) lqd.style.display="none";
	if(document.settfrm&&document.settfrm.showLinkedQueries) document.settfrm.showLinkedQueries.checked=(slq!="no");
}

function changeLanguage(mode)
{
	var m = mode.toLowerCase();
	if( m == "en")
	{
	    document.searchfrm.lang_ru.checked = false;
	    document.searchfrm.lang_en.checked = true;
	}
	if(m == "ru")
	{
	    document.searchfrm.lang_ru.checked = true;
	}
	checkLanguages();	
	save_options();	
}

function goto_settings()
{
	var e = document.getElementById("settingsAnchor");
	if(e) e.href+="&query="+encodeURIComponent(document.searchfrm.query.value);
	return false;
}

function save_options()
{
	if(document.settfrm&&document.settfrm.googleEngine) document.searchfrm.google.checked=document.settfrm.googleEngine.checked;
	if(document.settfrm&&document.settfrm.yandexEngine) document.searchfrm.yandex.checked=document.settfrm.yandexEngine.checked;
	if(document.settfrm&&document.settfrm.ramblerEngine) document.searchfrm.rambler.checked=document.settfrm.ramblerEngine.checked;
	
	if(document.settfrm&&document.settfrm.askEngine) document.searchfrm.ask.checked=document.settfrm.askEngine.checked;
	if(document.settfrm&&document.settfrm.msnEngine) document.searchfrm.msn.checked=document.settfrm.msnEngine.checked;
	if(document.settfrm&&document.settfrm.yahooEngine) document.searchfrm.yahoo.checked=document.settfrm.yahooEngine.checked;
		
	if(document.settfrm&&document.settfrm.searchRusLang) document.searchfrm.lang_ru.checked=document.settfrm.searchRusLang.checked;
	if(document.settfrm&&document.settfrm.searchEngLang) document.searchfrm.lang_en.checked=document.settfrm.searchEngLang.checked;
	
	if(document.settfrm&&document.settfrm.engineResultsCount) 
		document.searchfrm.result_size.value=document.settfrm.engineResultsCount.value;
		
	if(document.settfrm&&document.settfrm.searchType)
	{		
		for(var i = 0; i < document.settfrm.searchType.length; ++i)
		{	
			if(document.settfrm.searchType[i].checked)
			{
				document.searchfrm.profileid.value=i+1;
				break;
			}			
		}
	}
	
	var year = 365*24*3600*1000;
	
	if(document.settfrm&&document.settfrm.showLinkedQueries) 
		setCookie("showLinkedQueries", (!document.settfrm.showLinkedQueries.checked) ? "no" : "yes", year);
		
	setCookie("google", document.searchfrm.google.checked ? "" : "not_checked", year);
	setCookie("yandex", document.searchfrm.yandex.checked ? "" : "not_checked", year);
	setCookie("rambler", document.searchfrm.rambler.checked ? "" : "not_checked", year);
	
	setCookie("ask", document.searchfrm.ask.checked ? "" : "not_checked", year);
	setCookie("msn", document.searchfrm.msn.checked ? "" : "not_checked", year);
	setCookie("yahoo", document.searchfrm.yahoo.checked ? "" : "not_checked", year);	
	
	setCookie("lang_ru", document.searchfrm.lang_ru.checked ? "" : "not_checked", year); 
	setCookie("lang_en", document.searchfrm.lang_en.checked ? "checked" : "", year);

	setCookie("result_size",document.searchfrm.result_size.value,year);
	setCookie("docsperpage",document.searchfrm.docsperpage.value,year);
	setCookie("onto_queries_limit", "5", year);
	setCookie("profile_id", document.searchfrm.profileid.value, year);
	
}
///////////////////////////////////////////////////////////////////////////////
function get_http()
{
	var xmlhttp;
	// this is the MS IE inline-code detection
	/*@cc_on
	@if (@_jscript_version >= 5)
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e)
	{
		try {	
			xmlhttp = new
			ActiveXObject("Microsoft.XMLHTTP");
		} catch (E)
		{
			xmlhttp = false;
		}
	}
	@else
	xmlhttp = false;
	@end @*/
	
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
		try {
			xmlhttp = new XMLHttpRequest();
		} catch (e) {
			xmlhttp = false;
		}
	}
	return xmlhttp;
}

function UpdateOntology(taskID, res_no)
{
	// Получаем объект XMLHTTPRequest
	if(!this.http)
	{
		this.http = get_http();
	}
        // Запрос
	if (this.http)
	{
		var http = this.http;
		var url = document.location.protocol+"//"+document.location.host+"/redirect.cgi"
				+document.location.search+"&taskid="+taskID+"&res_no="+(res_no-1);
		
      		//создаём запрос
		try
		{
			this.http.open("GET", url, true);
			this.http.send("");
		}
		catch (e)
		{
		}
	}
}

function SetQuery(QueryString)
{
	//document.searchfrm.query.value=QueryString;
}
/*
function handleError(message, dest) 
{
  	// обработчик ошибки
	//alert("Ошибка: "+message);
	dest.innerHTML = "Нет перевода.";
}

function translate(txt, tSpan)
{		
	var addr='http://proling.iitp.ru/etap-bin2/etaphttpserv.exe';
	//alert("translating: " + txt);	
	var xmlhttp = get_http();	// Получаем объект XMLHTTPRequest        
	if (xmlhttp) // Запрос
	{		
		var transSpan = tSpan;
		var t = trim(txt);
		t = t.replace('\n', ' ');
		t = t.replace('\r', ' ');
		var request="<translation langfrom=\"eng\" langto=\"rus\">\r\n<text>" + trim(txt) +"</text>\r\n</translation>";
		//alert(request);		
		var url = document.location.protocol+"//"+document.location.host+"/trans.cgi?timeout=30"+"&server=" + addr;
		//alert (url);
		xmlhttp.open("POST", url, true);
		xmlhttp.onreadystatechange=function()
		{
			//alert("HEADER: "+ xmlhttp.getResponseHeader());
			if (xmlhttp.readyState != 4) return;
			clearTimeout(timeout) // очистить таймаут при наступлении readyState 4
			if (xmlhttp.status == 200) 
			{
				//alert("Response: " + xmlhttp.responseText);
				if(xmlhttp.responseText != "") 
					transSpan.innerHTML = xmlhttp.responseText;
				else handleError("", transSpan);
			}
			else
			{
				handleError(xmlhttp.statusText, transSpan) // вызвать обработчик ошибки с текстом ответа
			}			
		}
		xmlhttp.send(request);
		var timeout = setTimeout( function(){ xmlhttp.abort(); handleError("Game over", transSpan) }, 30000);
	}
}

function prepareAbs (absNode)
{
	//alert("NODE: "+ absNode + " SIZE: " + absNode.childNodes.length);		
	if(!(absNode.hasChildNodes()))
	{
		//alert("TEXT: " + absNode.data);
		return absNode.data;
	}		
	var nodes = absNode.childNodes;
	var txt = "";	
	for(var i = 0; i<nodes.length; ++i)
	{
		var node = nodes.item(i);
		txt += prepareAbs(node);
	}
	return txt ;
}

function TranslateAbs(res_no)
{
	var ref = getElemById("trans_ref_"+res_no);
	var ref1 = getElemById("trans_ref_"+res_no+"_1");
	var absDiv = getElemById("abs_"+res_no);
	var transDiv = getElemById("trans_div_"+res_no);
	var transSpan = getElemById("trans_span_"+res_no);

	if(trim(transSpan.innerHTML) == "")
	{
		transSpan.innerHTML = "Пожалуйста, подождите...";
		translate(trim(prepareAbs(absDiv)), transSpan);
	}
	
	if(transDiv.style.display!='block') 
	{
		ref.style.display='none';
		ref1.style.display='block';
		transDiv.style.display='block';
	}
	else 	
	{
		ref.style.display='block';
		ref1.style.display='none';
		transDiv.style.display='none';
	}	
}
*/

