var DHTMLSelect;
if (!DHTMLSelect)
{
	DHTMLSelect = {};
	DHTMLSelect.visible_layers = new Array();
	
	// Инициализация модуля (вешаем событие клика на окно)
	DHTMLSelect.init = function()
	{
		if (window.addEventListener)
		{
			window.addEventListener("click", DHTMLSelect.processEvent, false);
		}
		else if (window.attachEvent)
		{
			window.document.body.attachEvent("onclick", DHTMLSelect.processEvent);
		}
		else
		{
			window.onclick = DHTMLSelect.processEvent;
		}
	}
	
	// Обработка собфтия клика в окне
	// Если клик не в слое селектора, закрываем его (их)
	DHTMLSelect.processEvent = function(e)
	{
		if (!e) e = window.event;
		
		for (var i in DHTMLSelect.visible_layers)
		{
			if (document.getElementById(i))
			{
				var win_x = window.pageXOffset ? window.pageXOffset : document.body.scrollLeft;
				var win_y = window.pageYOffset ? window.pageYOffset : document.body.scrollTop;
				if (!window.pageXOffset && document.compatMode == 'CSS1Compat')
				{
					win_x = document.documentElement.scrollLeft;
					win_y = document.documentElement.scrollTop;
				}
		
				var layer_x = DHTMLSelect.getObjLeft(document.getElementById(i)) - win_x;
				var layer_width = document.getElementById(i).offsetWidth;
				var layer_y = DHTMLSelect.getObjTop(document.getElementById(i)) - win_y;
				var layer_height = document.getElementById(i).offsetHeight;
				
		
				if (e)
				{
					var event_x = e.clientX ? e.clientX : e.pageX;
					var event_y = e.clientY ? e.clientY : e.pageY;
				}
				else
				{
					return;
				}
		
				if ( (event_x < layer_x ||
					event_x > layer_x + layer_width ||
					event_y < layer_y ||
					event_y > layer_y + layer_height) &&
					DHTMLSelect.visible_layers[i] == 1 &&
					document.getElementById(i).style.visibility == 'visible')
				{
					document.getElementById(i).style.visibility = 'hidden';
					document.getElementById(i).style.display = 'none';
					delete(DHTMLSelect.visible_layers[i]);
				}
			}
		}
	}
	
	// Добавить в список показанных селекторов еще один
	DHTMLSelect.addShowLayer = function(layer)
	{
		if (DHTMLSelect.visible_layers[layer] != 1 && DHTMLSelect.visible_layers[layer] != 2)
		{
			DHTMLSelect.visible_layers[layer] = 1;
		}
	}
	
	DHTMLSelect.getObjLeft = function(anObject)
	{
		return(anObject.offsetParent ? (DHTMLSelect.getObjLeft(anObject.offsetParent) + anObject.offsetLeft) : anObject.offsetLeft);
	}

	DHTMLSelect.getObjTop = function(anObject)
	{
		return(anObject.offsetParent ? (DHTMLSelect.getObjTop(anObject.offsetParent) + anObject.offsetTop) : anObject.offsetTop);
	}
	
	DHTMLSelect.lock_select = 0;
	DHTMLSelect.lock_select_timeout = 20;
	
	//
	DHTMLSelect.showSelect = function(event, is_key, url, layer, handler)
	{
		if (DHTMLSelect.lock_select == 0)
		{
			document.getElementById(layer).style.position = 'absolute';
			if (is_key == 1)
			{
				var badKeys = new Array(0,9,16,17,19,27,33,34,35,36,37,38,39,40,45,46,47,112,113,114,115,116,117,118,119,120,121,122,123,145);
				for (i = 0; i < badKeys.length; i++)
				{
					if (event.keyCode == badKeys[i])
					{
						return false;
					}
				}
			}
		
			if (document.getElementById(layer).style.visibility == 'visible' && is_key == 0)
			{
				document.getElementById(layer).style.visibility = 'hidden';
				document.getElementById(layer).style.display = 'none';
			}
			else
			{
				DHTMLSelect.showDataLoadingMessage();
	
				var re = /^(.*?)([^\/]*)$/;
				
				var path_arr = re.exec(location.pathname);
				var path = path_arr[1];
				
				var re2 = /^(.*?)\?(.*)$/;
				var file_arr = re2.exec(url);
				var file = file_arr[1];
				var args = file_arr[2];

				var url;
				var url_is_relative = false;
				if (url.indexOf('/') == 0)
				{
					url = "http://" + location.host + url + '&rnd='+Math.random();
				}
				else
				{
					url = "http://" + location.host + '/' + path + url + '&rnd='+Math.random();
					url_is_relative = true;
				}

				document.getElementById(layer).style.visibility = 'hidden';
				document.getElementById(layer).style.display = 'none';

				document.getElementById(layer).innerHTML = '';

				var ajax = new sack();
				if (url_is_relative)
				{
					ajax.requestFile = "http://" + location.host + path + file;
				}
				else
				{
					ajax.requestFile = "http://" + location.host + file;
				}

				ajax.processURLString(args, true);
				ajax.method = 'GET';
				ajax.element = layer;

				if (handler)
				{
					ajax.handler = handler;
				}

				ajax.onCompletion = function()
				{
					var l = document.getElementById(layer);
					l.style.visibility = 'visible';
					l.style.display = 'block';
					DHTMLSelect.addShowLayer(l.id);
					DHTMLSelect.hideDataLoadingMessage();
				};
				ajax.runAJAX();
			}
			DHTMLSelect.lock_select = 1;
			setTimeout("DHTMLSelect.lock_select=0", DHTMLSelect.lock_select_timeout);
		}
	}
	
	// Показать сообщение о загрузке данных
	DHTMLSelect.showDataLoadingMessage = function()
	{
		var l = document.getElementById('data_loading');
		if (l)
		{
			var win_x = self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);
			var win_y = self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop)
			var win_width = window.innerWidth ? window.innerWidth : screen.availWidth;
			var win_height = window.innerHeight ? window.innerHeight : screen.availHeight;
			
			l.style.left = (win_width - l.offsetWidth)/2 + win_x + 'px';
			l.style.top = (win_height - l.offsetHeight)/2 + win_y + 'px';
			
			l.style.visibility = 'visible';
			l.style.display = 'block';
		}
	}

	// Скрыть сообщение о загрузке данных
	DHTMLSelect.hideDataLoadingMessage = function ()
	{
		var l = document.getElementById('data_loading');
		if (l)
		{
			l.style.visibility = 'hidden';
			l.style.display = 'none';
		}
	}
}