SelectBox = function(e, element, type) // запускается по onclick-у
{
	var e = e || window.event; // событие
	var key = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0))
	
	var is_hide = (SelectBox.frame.style.visibility == 'hidden') ? true : false;
	if (key == '27') {SelectBox.hideFrame(); return;} // Esc
	if (key == '13' && !is_hide) {SelectBox.hideFrame(); return;} // Enter
	
	//45, 46, 48-49, 186-192, 8, 32, 65-90, 219-222, 110, 111, 106, 109, 107 - коды клавишь
	
	var element = (document.getElementById(element)) ? document.getElementById(element) : element;
	SelectBox.element = element;
	element.focus();
	var len = (inArray(type, ['passengers','addresses'])) ? 1 : 2;
	if (element.value.length < len) {SelectBox.hideFrame(); return;}

	// добавляем событие
	if (!element.SelectBoxAddEvent)
	{
		element.SelectBoxAddEvent = true;
		var is_ie = /msie/i.test(navigator.userAgent);
		if (is_ie) {addEvent(element, 'keydown', SelectBox.moveCursor); addEvent(element, 'keydown', SelectBox.rememberValue);}
		else {addEvent(element, 'keypress', SelectBox.moveCursor); addEvent(element, 'keypress', SelectBox.rememberValue);}
		addEvent(element, 'click', SelectBox.rememberValue);
	}
	
	SelectBox.type = type;
	SelectBox.afterKeypressValue = SelectBox.element.value;
	
	frames[SelectBox.frame.name].Do(SelectBox.element);
	if (SelectBox.rebuild) frames[SelectBox.frame.name].SetMarkedValue(); // вставляем выбарнное значение в input, только если список уже построен
	
	
}

// глобальные
SelectBox.element = false; // элемент, куда вписываем выбранное значение
SelectBox.frame = document.getElementById('SelectBoxFrame'); // фрейм, в котором находится список
SelectBox.type = 0; // тип: 'avia', 'railway', 'addresses', 'passengers'
SelectBox.oldvalue = '';
SelectBox.oldkey = '';
SelectBox.key = ''; // ключ, для которого сейчас построен список

SelectBox.rememberValue = function()
{
	SelectBox.beforeKeypressValue = SelectBox.element.value;
}

SelectBox.moveCursor = function(e)
{
	var e = e || window.event; // событие
	var key = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0))
	
	var is_hide = (SelectBox.frame.style.visibility == 'hidden') ? true : false;
	if (is_hide) return;
	
	if (key == 13) {return false;}
	
	if (inArray(key, ['38','40']))
	{
		var frame = frames[SelectBox.frame.name];
		
		if (key == '38') frame.markItem('up'); // вверх
		else if (key == '40') frame.markItem('down'); // вниз
	}	
}

// установка курсора на позицию поля ввода
SelectBox.moveCaret = function(event, pos)
{
	var element = SelectBox.element;
	
	if (pos == -1) pos = element.value.length;
	else if (typeof(pos) == 'undefined')
	{
		if (document.selection)
		{
			element.focus();
			var sel = document.selection.createRange();
			sel.moveStart('character', -element.value.length);
			pos = sel.text.length;
			if (pos == 0) pos = element.value.length; // для ie код выше не срабатывает
		}
		else if (element.selectionStart) pos = element.selectionStart;
	}
	
	if (element.setSelectionRange)
	{
		element.focus();
		element.setSelectionRange(pos,pos);
	}
	else if (element.createTextRange)
	{
		var range = element.createTextRange();
		range.collapse(true);
		range.moveEnd('character', pos);
		range.moveStart('character', pos);
		range.select();
	}
}

SelectBox.hideFrame = function(e)
{
	if (!e) var target = '';
	else if (e.srcElement) var target = e.srcElement;
	else if (e.target) var target = e.target;
	else var target = '';
	if (target != SelectBox.element)
	{
		SelectBox.frame.style.visibility = 'hidden';
		frames[SelectBox.frame.name].markItem('clear');
	}
}

SelectBox.showFrame = function()
{
	SelectBox.frame.style.display = 'block';
	SelectBox.frame.style.visibility = 'visible';
}

SelectBox.getScrollTop = function()
{
	if (document.documentElement.scrollTop) return document.documentElement.scrollTop;
	if (document.body.scrollTop) return document.body.scrollTop;
	if (window.pageYOffset) return window.pageYOffset;
	return 0;
}

SelectBox.getWinHeight = function()
{
	if (window.innerHeight) return window.innerHeight;
	if (document.documentElement.clientHeight) return document.documentElement.clientHeight;
	if (document.body.clientHeight) return document.body.clientHeight;
	return 0;
}

// позиционирование фрейма
SelectBox.posFrame = function()
{
	var el = SelectBox.element;
	var w = el.offsetWidth; var h = el.offsetHeight;
	
	var l = 0, t = 0;
	
	if (el.getBoundingClientRect)
	{
		var box = el.getBoundingClientRect()
		var body = document.body
		var docElem = document.documentElement
		var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop
		var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft
		var clientTop = docElem.clientTop || body.clientTop || 0
		var clientLeft = docElem.clientLeft || body.clientLeft || 0
		var t  = box.top +  scrollTop - clientTop
		var l = box.left + scrollLeft - clientLeft
	}
	else
	{
		while (el)
		{
			l += el.offsetLeft;
			t += el.offsetTop;
			el = el.offsetParent;
		}
		var is_ie = /msie/i.test(navigator.userAgent);
		l += (is_ie) ? 3 : 0;		
	}
	
    SelectBox.frame.style.left = l + 'px';
	SelectBox.frame.style.top = t + h + 'px';
	
	// подгоняем размеры
	el = frames[SelectBox.frame.name].document.getElementById('Frame');
	SelectBox.frame.style.width = SelectBox.element.clientWidth + (is_ie?2:3) + 'px';
	el.style.width = SelectBox.element.clientWidth
		- parseInt(frames[SelectBox.frame.name].getElementComputedStyle(el, 'border-left-width'))
		- parseInt(frames[SelectBox.frame.name].getElementComputedStyle(el, 'border-right-width')) + (is_ie?2:3) + 'px';
	SelectBox.frame.style.height = parseInt(frames[SelectBox.frame.name].getElementComputedStyle(el, 'height'))
		+ parseInt(frames[SelectBox.frame.name].getElementComputedStyle(el, 'border-top-width'))
		+ parseInt(frames[SelectBox.frame.name].getElementComputedStyle(el, 'border-bottom-width')) + 'px';
}

// установка значения при окончательном выборе
SelectBox.setValue = function(key)
{
	if (inArray(this.type, ['passengers','addresses']))
	{
		if (this.type == 'passengers')
		{
			var selects = this.element.parentNode.parentNode.parentNode.getElementsByTagName('select');
			for (var i=0;i<selects.length;i++) if (selects[i].name == 'passengers[passenger][]') {var Select = selects[i]; break;}
			Passengers.SelectPassenger(Select, key);
		}
		else if (this.type == 'addresses') Delivery.SelectAddress(key);
	}
	else this.element.value = key.replace(/<b>/gi, '').replace(/<\/b>/gi, '');
}

addEvent(document, 'click', SelectBox.hideFrame);