function popup()
{
	this.data = {};
	this.uploader = null;

	/*	Отобразить popup окно.
	 *	В аргументе data должен содержаться параметр content, в котором находится тело окна
	 */
	this.open = function(data)
	{
		if (typeof data.content == 'undefined')
		{
			return;
		}
		if (typeof data.eventType != 'undefined')
		{
			this.data.eventType = data.eventType;
		}
		else
		{
			this.data.eventType = null;
		}

		if ($.browser.msie && $.browser.version == 6)
		{
			$('select').hide();
		}
		$('#popup').html(data.content).show();
		if ($.browser.msie && $.browser.version == 6)
		{
			$('#popup a.pp-turn').hide();
		}
		this.data.messageBox = $('#popup td.pp-message');
		var w = parseInt($('#popup table.pp-data > tr:first-child > td:first-child').attr('width'));
		if (w > 50)
		{
			$('#popup table.pp-data > tr > td:first-child').width(w);
		}
		this._position();
		this._plugins();
		this._events();
		if (typeof form_func == 'function')
		{
			form_func();
		}
	};

	/*	Вывести сообщение в окне.
	 *	msg - текст сообщения,
	 *	append - булевый указатель, если append == true, то msg добавится к предыдущему сообщению, иначе - заменит его
	 */
	this.message = function(msg, append)
	{
		if (typeof append != 'undefined' && append == true)
		{
			this.data.messageBox.html(this.data.messageBox.html() + ' ' + msg);
		}
		else
		{
			this.data.messageBox.html(msg);
		}
	};

	/*	Отметить строки формы. используется при ошибках заполнения
	 *	Аргумент fields содержит массив имён полей, в которых содержатся ошибки. строки таблицы (tr) с этими полями помечается классом mark
	 *	Если mark_td == true, тогда помечаются не строки, а ячейки таблицы
	 */
	this.markFields = function(fields, mark_td)
	{
		if (mark_td == true)
		{
			$('table.pp-data tr td', '#popup').removeClass('mark');
			for (i = 0; i < fields.length; i++)
			{
				var td = $('table.pp-data *[name="'+fields[i]+'"]', '#popup').parent('td');
				if (i == 0)
				{
					var off = td.offset().top - $('table.pp-data').offset().top - $('div.pp-scroll').scrollTop();
					if (off < 0 || off + td.height() > $('div.pp-scroll', '#popup').height())
					{
						$('div.pp-scroll', '#popup').scrollTo(td, {duration:400});
					}
				}
				td.addClass('mark');
			}
		}
		else
		{
			$('table.pp-data tr', '#popup').removeClass('mark');
			for (i = 0; i < fields.length; i++)
			{
				var tr = $('table.pp-data *[name="'+fields[i]+'"]', '#popup').parent('td').parent('tr');
				if (i == 0)
				{
					var off = tr.offset().top - $('table.pp-data').offset().top - $('div.pp-scroll').scrollTop();
					if (off < 0 || off + tr.height() > $('div.pp-scroll', '#popup').height())
					{
						$('div.pp-scroll', '#popup').scrollTo(tr, {duration:400});
					}
				}
				tr.addClass('mark');
			}
		}
	};

	/*	Закрыть popup окно.
	 *	delay - задержка перед закрытием окна
	 *	callback - функция, которая выполнится после закрытия окна (например перезагрузка страницы)
	 */
	this.close = function(delay, callback)
	{
		$('td.pp-submit a', '#popup').hide();
		setTimeout(function(){
			$('#popup, #popup-shadow').fadeOut(1000, function(){
				$('#popup').html('').removeAttr('style').removeClass('down');
				if (typeof callback == 'function')
				{
					callback();
				}
			});
			if ($.browser.msie && $.browser.version == 6)
			{
				$('select').show();
			}
		}, parseInt(delay));
	};

	/*	Задать значение внутренней переменной.
	 *	data - объект, ключи которого будут переписаны во внутреннее хранилище класса
	 */
	this.setData = function(data)
	{
		for (p in data)
		{
			this.data[p] = data[p];
		}
	};

	/*	Системные функции	*/

	/*	Ограничение размера окна и позиционирование его по центру экрана.
	 *	delay - задержка перед закрытием окна
	 *	callback - функция, которая выполнится после закрытия окна (например перезагрузка страницы)
	 */
	this._position = function()
	{
		if ($('#popup').hasClass('down'))
		{
			$('#popup').removeClass('down').draggable('enable');
		}
		if ($('#popup table.pp-window').height() > $(window).height() - 100)
		{
			$('#popup div.pp-scroll').css({'height':$(window).height() - 180});
		}
		var w = $('#popup').width();
		var h = $('#popup').height();
		var top = ($(window).height() - h) / 2 + $(document).scrollTop();
		var left = ($(window).width() - w) / 2 + $(document).scrollLeft();
		$('#popup').css({'top':top, 'left':left});
		$('#popup-shadow').width(w + 36).height(h + 36).css({'top':top-18, 'left':left-18}).show();
	};

	/*	
	 *	Объявление событий для элементов окна
	 */
	this._events = function()
	{
		//	Закрыть окно
		$('a.pp-close', '#popup').bind('click', {ppObj:this}, function(e){e.data.ppObj.close(0);});
		//	Свернуть окно
		$('a.pp-turn', '#popup').bind('click', function()
		{
			if ($('#popup').hasClass('down'))
			{
				$('#popup').removeClass('down').draggable('enable');
				$('#popup-shadow').show();
			}
			else
			{
				$('#popup').addClass('down').draggable('disable');
				$('#popup-shadow').hide();
			}
		});
		//	Подсказка к окну
		$('a.pp-help', '#popup').hover(
			function()
			{
				var div = $('#popup td.pp-controls div');
				if(div.html().length == 0)
				{
					div.load(lang+'/ajax/sys/help/'+$(this).attr('name')+'/');
				}
				div.show('fast');
			},
			function(){$('#popup td.pp-controls div').hide('fast');}
		);
	};

	/*
	 *	Подключение плагинов
	 */
	this._plugins = function()
	{
		//	Перетаскивание окна
		$('#popup').draggable({handle:"td.pp-title", cursor:'move'});
		$('#popup').bind( "drag", function(event, ui) {
			$('#popup-shadow').css({'top':ui.position.top-18, 'left':ui.position.left-18});
		});
	};
}

function view(obj)
{
	var view = '';
	for (p in obj)
	{
		view += p+' = '+obj[p]+"\n";
	}
	$('body').append('<pre>'+view+'</pre>');
}
