// доделываем функцию escape
// Инициализируем таблицу перевода
var trans = [];
for (var i = 0x410; i <= 0x44F; i++)
trans[i] = i - 0x350; // А-Яа-я
trans[0x401] = 0xA8;    // Ё
trans[0x451] = 0xB8;    // ё

// Сохраняем стандартную функцию escape()
var escapeOrig = window.escape;

// Переопределяем функцию escape()
window.escape = function(str){
	var ret = [];
	// Составляем массив кодов символов, попутно переводим кириллицу
	for(var i = 0; i < str.length; i++){
		var n = str.charCodeAt(i);
		if(typeof trans[n] != 'undefined')
			n = trans[n];
		if (n <= 0xFF)
			ret.push(n);
	}
	return escapeOrig(String.fromCharCode.apply(null, ret));
}


//------------------------------------------------------------------------------
// ajax
function get_http(){
	var xmlhttp;
	/*@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;
}


var http_num = 0;
this.http = new Array();

function ajax_lookup(url, result_function){
	// Получаем объект XMLHTTPRequest
	http_num++;
	if(!this.http[http_num]) this.http[http_num] = get_http();

	// Запрос
	if (this.http[http_num]){
		var http = this.http[http_num];
		url = url + '&hash=' + Math.random();

		this.http[http_num].open("GET", url, true);
		if(typeof(result_function) == 'function'){
			this.http[http_num].onreadystatechange = function(){
				if(http.readyState == 4){
					result_function(http.responseText);
				}
			}
		}
		this.http[http_num].send(null);
	}
	if(!this.http[http_num]) alert('Error creating XMLHTTP object!');
}

function ajax_test(){
	var t = get_http();
	return t ? true : false;
}

var _IS_AJAX_WORKS = ajax_test();

//end ajax
//------------------------------------------------------------------------------




// аналог in_array() из PHP
function in_array(needle, haystack){
	var res = false;
	var nn;
	for(nn in haystack) if(haystack[nn] == needle) res = true;
	return res;
}

// добавляет обработчик события для объекта
function add_handler(object, event, handler, useCapture){
	if (object.addEventListener)
		object.addEventListener(event, handler, useCapture ? useCapture : false);
	else if (object.attachEvent)
		object.attachEvent('on' + event, handler);
	else object['on' + event] = handler;
}

// обновляется капча на странице с формой
function recapcha(){
	document.getElementById('capcha_pic').src = '/capcha.htm?' + Math.random();
}








function remove_node(node){
	return node.parentNode.removeChild(node);
}



// Определение абсолютных координат объекта
function getAbsolutePos(el){
	var r = {x: el.offsetLeft, y: el.offsetTop};
	if(el.offsetParent){
		var tmp = getAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
}


// укорачивает длинную строку, добавляет ... в конец
function short_str(str, max_len){
	if(str.length > max_len){
		str = str.substr(0, max_len);
		str += '...';
	}
	return str;
}



// запрос на подтверждение удаления чего-либо
function delete_q(url){
	if (window.confirm('Вы подтверждаете удаление?')) document.location = url;
}


// отсчитывает макс. кол-во символов в элементе формы
function chars_counter(el, res_id, max_len){
	var counter = document.getElementById(res_id);
	if(el.value.length > max_len)
		el.value = el.value.substring(0, max_len);
	else
		counter.innerHTML = max_len - el.value.length;
}


function trim(s){
	s = s.replace( /^\s+/g, '');
	return s.replace( /\s+$/g, '');
}







// определяет, не Опера ли используется
function is_opera(){
	return navigator.userAgent.indexOf('Opera') >= 0 && document.getElementById ? true : false;
}




// функции для обработки полей с автозаполнением
var AF_on = false;

function AF_init(){
	// инициация схемы
	var list = document.getElementsByTagName('INPUT');
	for(var i = 0, l = list.length; i < l; i++)
		if(list[i].type == 'text' && list[i].id.substr(0, 3) == 'AF_'){
			var inp = list[i];

			// создаём ДИВ перед нужным инпутом
			var d = document.createElement('div');
            d.style.position = 'relative';
            inp.parentNode.insertBefore(d, inp);

			// заменяем ID инпута
            var id = inp.id; inp.id = 'AF_DELETE';

			// создаём textarea, которая заменит инпут
            var inp2 = document.createElement('textarea');
            // копируем свойсва
            inp2.id = id; inp2.name = inp.name; inp2.value = inp.value; inp2.className = 'af_field';
            d.appendChild(inp2);

			// создаём блок для показа вариантов
			var block = document.createElement('div');
			block.id = id + '_variants'; block.className = 'autofill';
			block.style.width = inp2.offsetWidth + 'px';
			d.appendChild(block);

			// прописываем события для текстового поля
			inp2.onblur = function(){AF_hide_delay(this)};
			inp2[is_opera() ? 'onkeypress' : 'onkeydown'] = function(e){return AF_keycheck(this, e)};
		}

	for(var i = 0, l = list.length; i < l; i++)
		if(list[i].type == 'text' && list[i].id == 'AF_DELETE'){
			remove_node(list[i]);
			l--; i--;
		}
}

// реакция на нажатие клавиши
function AF_keycheck(inp, e){
    if(!e) e = window.event;
	// e.keyCode: 38 - UP, 40 - DOWN, 13 - ENTER

	// если эта клавиша - не стрелка вверх/вниз и не Enter, значит это буква
	// пропускаем её и делаем запрос на список вариантов
    if(e.keyCode != 38 && e.keyCode != 40 && e.keyCode != 13){
    	setTimeout(function(){AF_lookup(inp)}, 200);
    	return true;
    }

	// получаем блок для вариантов
	var block = document.getElementById(inp.id + '_variants');

	// если блок сейчас скрыт!!!
	if(block.style.display != 'block'){
		if(e.keyCode == 13){			var frm = inp.parentNode;
			while(frm.tagName != 'FORM' && frm.tagName != 'BODY') frm = frm.parentNode;
			if(frm.tagName == 'FORM') frm.submit();
		}
		return false;
	}

	// определяем, выделен ли сейчас какой-либо вариант
    var selected = -1;
    var links = block.getElementsByTagName('A');
	for(var i = 0, l = links.length; i < l; i++) if(links[i].className == 's') selected = i;

    if(e.keyCode == 13){		// нажатие Enter
		if(selected != -1){
			// один из вариантов выделен - вставляем его в само поле
			for(var i = 0, l = links.length; i < l; i++)
				if(i == selected) AF_set_val(links[i]);
		}else{			// ни один из вариантов не выделен - пробуем сабмитить форму
			var frm = inp.parentNode;
			while(frm.tagName != 'FORM' && frm.tagName != 'BODY') frm = frm.parentNode;
			if(frm.tagName == 'FORM') frm.submit();
		}
	}else{
		// нажатие стрелки вверх/книз
		var next = selected + (e.keyCode == 38 ? -1 : 1);
		if(next == links.length) next = 0; if(next < 0) next = links.length - 1;

		for(var i = 0, l = links.length; i < l; i++) links[i].className = i == next ? 's' : '';
	}

	return false;
}

function AF_hide_delay(inp){
	setTimeout(function(){AF_hide(inp)}, 200);
}

function AF_hide(inp){
	document.getElementById(inp.id + '_variants').style.display = 'none';
}

function AF_lookup(inp){
	// на всякий случай: заменяем переносы строки на пробелы
	if(inp.value.search("\r\n") != -1) inp.value = inp.value.replace(/\r\n/g, ' ');

	var val = inp.value;
	var list_id = inp.id.split('_', 2); list_id = list_id[1];

	if(val){
		ajax_lookup('/PROG/AF_ajax.php?val=' + encodeURIComponent(val) + '&id=' + list_id, function(res){AF_show(inp, res)});
	}else AF_hide(inp);
}

function AF_show(inp, res){
	var block = document.getElementById(inp.id + '_variants');
	if(res){
		block.style.display = 'block';
		block.innerHTML = '<div>' + res + '</div><iframe id="' + block.id + '_ifr" scrolling="no"></iframe>';
		document.getElementById(block.id + '_ifr').style.width = block.offsetWidth + 'px';
		document.getElementById(block.id + '_ifr').style.height = block.offsetHeight + 'px';

		var links = block.getElementsByTagName('A');
		for(var i = 0, l = links.length; i < l; i++){
			links[i].onmouseover = function(){AF_lnk_over(this)};
			links[i].onmouseout = function(){AF_lnk_out(this)};
		}

	}else AF_hide(inp);

}

function AF_set_val(link){
	var inp = document.getElementById(link.parentNode.parentNode.id.replace('_variants', ''));

    inp.value = link.innerHTML;
	inp.focus();
	AF_hide(inp);
}

function AF_lnk_over(link){
    var links = link.parentNode.getElementsByTagName('A');
	for(var i = 0, l = links.length; i < l; i++) links[i].className = '';
	link.className = 's';
}

function AF_lnk_out(link){
    var links = link.parentNode.getElementsByTagName('A');
	for(var i = 0, l = links.length; i < l; i++) links[i].className = '';
}
















// очищает элемент SELECT и заполняет его новыми пунктами из полученной строки
// формат строки: 'value1::label1//value2::label2//value3::label3...'
function set_select_options(obj, str, selected){
	if(!obj) return;
	if(!selected) var selected = false;
	var sel_val = false;

	// очистка списка
	while(obj.options.length) obj.options[0] = null;

	var lines = str.split('//');
	for(var i = 0, l = lines.length; i < l; i++){
		var p = lines[i].split('::');
		if(p.length == 2){
			var newOpt = new Option(p[1], p[0]);
			obj.options.add(newOpt);
			if(selected && p[0] == selected) sel_val = true;
		}
	}

	if(sel_val) obj.value = selected;
}
