use Data::Dumper;
use URI::Escape;

use Zanas::Presentation::MSIE_5;
use Zanas::Presentation::Mozilla_3;
use Zanas::Presentation::Unsupported;

=head1 NAME

Presentation.pm - подпрограммы отрисовки элементов ГИП.

=cut

################################################################################

sub dump_attributes {
	my $attributes = $_[0];	
	return join ' ', map {"$_='" . $attributes -> {$_} . "'"} keys %$attributes;	
}

################################################################################

sub trunc_string {
	my ($s, $len) = @_;
	return length $s <= $len - 3 ? $s : substr ($s, 0, $len - 3) . '...';
}

################################################################################

=head1 install_drawer

Загрузка графического драйвера. Желательно вызывать при старте материнского экземпляра Apache.

=head2 Использование

	Zanas::install_drawer ('MSIE_5');

=cut

################################################################################

sub install_drawer {
	my ($drawer_name) = @_;
	$drawers or our $drawers = {};
	unless (exists $drawers -> {$drawer_name}) {
		eval "require Zanas::Presentation::$drawer_name";
		eval "\$drawers -> {\$drawer_name} = Zanas::Presentation::$drawer_name -> new ();";
	}
}


################################################################################

=head1 drawer_call

Процедура-"обёртка", передающая вызовы нужному драйверу. Не должна использоваться напрямую.

=head2 Использование

	return drawer_call ('draw_text_cell', @_);

=cut

################################################################################

sub drawer_call {
	my $sub_name = shift;
	&{"$$_USER{drawer_name}_$sub_name"} (@_);	
}

################################################################################

=head1 js_escape

Преобразование строки символов в корректный с точки зрения javaScript литерал.

=head2 Использование

	return js_escape ('Строка по-русски');

=cut

################################################################################

sub js_escape {
	return drawer_call ('js_escape', @_);
}

################################################################################

=head1 create_url

Процедура генерации C<url> с сохранением сессии и всех C<CGI>-параметров, кроме явно переопределяемых и тех, имена которых начинаются с C<'_'>.

=head2 Использование


	# Текущий url: /?sid=666&type=foo&_x=1&id=1

	my $url = create_url (id => 2, n => 5);

	# Теперь $url eq '/?sid=666&type=foo&id=2&n=5'


=cut

################################################################################

sub create_url {

	my %over = @_;	
	my %param = %_REQUEST;
	$over {password} = '';
	while (my ($key, $value) = each %over) {
		$param {$key} = $value;
	}
	
	return '/?' . join ('&', map {($_ !~ /^_/ || $_ eq '__no_navigation') && $param {$_} ? ($_ . '=' . uri_escape ($param {$_})) : ()} keys %param);
	
}

################################################################################

=head1 check_href

Процедура коррекции компонента C<href> заданного хэша, переданного по ссылке, на предмет расстановки параметров C<sid> и C<_salt>. Для C<javascript>-ссылок оставляет аргумент без изменения.

=head2 Использование


	# Текущий $options: {href => '/?type=foo&_x=1&id=1'}, sid = 666

	check_href ($options);

	# Теперь $options: {href => '/?type=foo&_x=1&id=1&sid=666&_salt=0.357357387387'}


=cut

################################################################################

sub check_href {

	my ($options) = @_;
	
	if ($options -> {href} !~ /^(\#|java|\/i\/)/ and $options -> {href} !~ /\&sid=/) {	
		$options -> {href} .= "\&sid=$_REQUEST{sid}";
		$options -> {href} .= '&_salt=' . rand;
	}	
	
	if ($_REQUEST{period} and $options -> {href} !~ /^(\#|java)/ and $options -> {href} !~ /\&period=/) {
		$options -> {href} .= "\&period=$_REQUEST{period}";
	}	

}

################################################################################

=head1 draw_page

Процедура отрисовки страницы в целом. Используется основным обработчиком, не должна вызываться напрямую.

=cut

################################################################################

sub draw_page {

	drawer_call ('draw_page', @_);
	
}

################################################################################

=head1 draw_menu

Процедура генерации основного меню системы. Используется основным обработчиком, не должна вызываться напрямую.

=cut

################################################################################

sub draw_menu {
	drawer_call ('draw_menu', @_);	
}

################################################################################

=head1 draw_hr

Отрисовка вертикатьного разделителя заданной высоты.

=head2 Параметры

=over

=item height

высота в пикселях	

=item class

CSS-класс фона, по умолчанию - фон страницы (bgr8)	

=back

=head2 Использование

	draw_hr ({ height => 10 });

=cut

################################################################################

sub draw_hr {
	drawer_call ('draw_hr', @_);	
}

################################################################################

=head1 draw_text_cell

Отрисовка клетки таблицы (предположительно, плоской выборки) с заданным текстовым содержимым. Если задан C<href> без номера сессии, то он приписывается автоматически.

=head2 Параметры

=over

=item label

текст, отображаемый в клетке

=item max_len

ограничение длины строки. По умолчанию $conf -> {max_len}. По умолчанию 30.

=item href

(если не C<undef>) гиперссылка с текста	

=item target

целевое окно/фрейм для ссылки

=item attributes

дополнительные HTML-атрибуты для тега C<td>.

=item a_class

CSS-класс ссылки. По умолчанию равен C<lnk4>. 

=item picture 

Числовой формат. 

=back

=head2 Использование

	draw_text_cell ({ 
		label   => 1000000,
		picture => '$ ### ### ###',
		href    => '/?type=bank&action=pillage',
		target  => 'invisible',
		max_len => 255,
		attributes => {
			width => '1%',
			align => 'right',
		},
		a_class => 'red_hot_link'
	});

=cut

################################################################################

sub draw_text_cell {
	drawer_call ('draw_text_cell', @_);	
}


################################################################################

=head1 draw_text_cells

=head2 Использование

	draw_text_cells ([
	
		{ 
			label   => 'foo',
		},
		
		{ 
			label   => 1000000,
			picture => '$ ### ### ###',
			href    => '/?type=bank&action=pillage',
			target  => 'invisible',
			max_len => 255,
			attributes => {
				width => '1%',
				align => 'right',
			},
			a_class => 'red_hot_link'
		},

	]);

=cut

################################################################################

sub draw_text_cells {
	drawer_call ('draw_text_cells', @_);	
}

################################################################################

=head1 draw_checkbox_cell

Отрисовка клетки таблицы (предположительно, плоской выборки) с checkbox'ом внутри. 

=head2 Параметры

=over

=item name

имя CGI-параметра

=item checked

отмечен ли checkbox при отрисовке

=item attributes

дополнительные HTML-атрибуты для тега C<td>.

=back

=head2 Использование

	draw_text_cell ({ 
		label   => '$1 000 000',
		href    => '/?type=bank&action=pillage',
		target  => 'invisible',
		max_len => 255,
		attributes => {
			width => '1%',
			align => 'right',
		},
		a_class => 'red_hot_link'
	});

=cut

################################################################################

sub draw_checkbox_cell {
	drawer_call ('draw_checkbox_cell', @_);	
}

################################################################################

sub draw_input_cell {
	drawer_call ('draw_input_cell', @_);	
}

################################################################################

=head1 draw_tr

Отрисовка строки таблицы из заданных клеток.

=head2 Параметры

Ничего (пока) не значащие опции, потом список HTML-строк клеток.

=head2 Использование

	draw_tr ({}, $td1, $td2);

=cut

################################################################################

sub draw_tr {
	drawer_call ('draw_tr', @_);	
}

################################################################################

=head1 draw_one_cell_table

Обвязка: таблица 100% ширины со встроенной формой. Предназначена для нестандартных форм редактирования, которые не укладываются в рамки C<draw_form>: например, форм, генерируемых под Excel.

=head2 Параметры

Ничего (пока) не значащие опции, потом внутренний HTML.

=head2 Использование

	draw_one_cell_table ({}, $the_very_table);

=cut

################################################################################

sub draw_one_cell_table {
	drawer_call ('draw_one_cell_table', @_);
}

################################################################################

=head1 draw_table

Отрисовка таблицы для плоской выборки.

=head2 Параметры

Если первый параметр -- C<ARRAYREF>, то он содержит список заголовков.

Следующий параметр -- C<callback>-функция, вызываемая для каждой записи. Запись видна из C<callback>'а как переменная C<$i>.

Следующий параметр -- ссылка на список записей (recordset).

Последний, необязательный параметр -- опции.

=head2 Опции

=over

=item off

если истина, то будет возвращена пустая строка.

=head2 Использование

	draw_table (
	
		[
			'Номер', 
			{
				label => 'Имя', 
				off => 0, 
				href => 'javaScript:alert("Joke!")'
			}, 
			''
		],
		
		sub {		
			draw_text_cell ({label => $i -> {id}}) . 
			draw_text_cell ({label => $i -> {name}, off => 0}) . 
			draw_row_buttons ({}, [{
				icon => 'delete', 
				label => 'Удалить', 
				href => "/?type=mytype&action=delete&id=$$i{id}", 
				confirm => "Удалить $$i{name}?"
			}])				
		},
		
		$data,
		
		{off => @$data == 0}
		
	);

=cut

################################################################################

sub draw_table {
	drawer_call ('draw_table', @_);
}

################################################################################

=head1 draw_path

Отрисовка пути к текущему объекту.

=head2 Параметры

Первый параметр -- опции:

=over

=item multiline

если истина, то путь разбивается на строки

=item id_param

имя параметра, который считается C<id> по умолчанию.

=back

Последний параметр -- ссылка на список записей этажей. Обычно формируется в content-процедуре.

Для каждого этажа отображается компонент C<name>, из остальных формируется url. Если задан компонент C<id_param>, то значение C<id> передаётся не как C<'id'>, а как C<$id_param>. Это требуется, например, если текущий C<id> на прошлом этаже фигурировал как C<id_rubric>.

=head2 Использование

	draw_path ({}, [	
		{type => 'forms', name => 'Формы'},
		{type => 'forms', name => $form -> {label}, id => $form -> {id}},	
	])

=cut

################################################################################

sub draw_path {
	drawer_call ('draw_path', @_);
}

################################################################################

=head1 draw_window_title

Отрисовка заголовка окна.

=head2 Параметры

=over

=item label

заголовок окна.

=item off

если истина, то будет возвращена пустая строка.

=back

=head2 Использование

	draw_window_title ({
		label => 'Моё окно',
		off   => $no_title,
	})

=cut

################################################################################

sub draw_window_title {
	drawer_call ('draw_window_title', @_);
}

################################################################################

=head1 draw_toolbar

Верхняя панель с кнопками.

=head2 Параметры

Первый параметр -- опции (не используется, зарезервировано), потом -- список HTML кнопок.

=head2 Использование

	draw_toolbar ({}, 
		
		draw_toolbar_button ({
			icon  => 'create',
			label => 'Добавить',
			href  => '?type=mytype&action=create',
		}),
		
	)

=cut

################################################################################

sub draw_toolbar {
	drawer_call ('draw_toolbar', @_);
}

################################################################################

=head1 draw_toolbar_button

Кнопка, встраиваемая в панель. Номер сессии приписывается к C<href> автоматически. Целевым фреймом ссылки всегда является C<invisible>.

=head2 Параметры

=over

=item icon

название иконки

=item label

текстовая подпись

=item href

гиперссылка

=item off

если истина, то будет возвращена пустая строка.

=back

=head2 Использование

	draw_toolbar_button ({
		icon  => 'create',
		label => 'Добавить',
		href  => '?type=mytype&action=create',
	})

=cut

################################################################################

sub draw_toolbar_button {
	drawer_call ('draw_toolbar_button', @_);
}

################################################################################

=head1 draw_toolbar_input_text

Форма ввода короткой строки, встраиваемая в панель. Используется для организации поиска в длинных выборках.

=head2 Параметры

=over

=item icon

название иконки

=item label

текстовая подпись

=item q

имя вводимого CGI-параметра

=item value

значение по умолчанию

=back

=head2 Использование

	draw_toolbar_input_text ({
		icon   => 'tv',
		label  => 'Искать',
		name   => 'q',
	}),

=cut

################################################################################

sub draw_toolbar_input_text {
	drawer_call ('draw_toolbar_input_text', @_);
}

################################################################################

=head1 draw_toolbar_pager

Навигация по страницам длинной выборки (вперёд-назад, надено ... из ...). Все содержательные параметры берутся из url. Номер текущей страницы управляется CGI-параметром start.

=head2 Параметры

=over

=item cnt

количество строк на текущей странице

=item total

общее число строк в выборке

=back

=head2 Использование

	draw_toolbar_pager ({
		cnt    => 0 + @{$data -> {forms}},
		total  => $data -> {cnt},
	})

=cut

################################################################################

sub draw_toolbar_pager {
	drawer_call ('draw_toolbar_pager', @_);
}

################################################################################

=head1 draw_row_button

Эту функцию не надо вызывать напрямую. Используйте draw_row_buttons.

=cut

################################################################################

sub draw_row_button {
	drawer_call ('draw_row_button', @_);
}

################################################################################

=head1 draw_row_buttons

Ряд кнопок, встраиваемых в строку таблицы. 

=head2 Параметры

Сначала опции, потом -- описания кнопок. Каждое описание содержит поля:

=over

=item icon

имя иконки

=item label

отображаемая текстовая строка

=back

=head2 Использование

	draw_row_buttons ({},	[
			{
				icon => 'delete', 
				label => 'Удалить', 
				href => "/?type=forms\&action=delete_multiple\&n=$$i{n}\&id_form=$$data{id}\&period=" . $_CALENDAR -> period (), 
				confirm => "Удалить строку $$i{n}?",
			},
		]
	))

=cut

################################################################################

sub draw_row_buttons {
	drawer_call ('draw_row_buttons', @_);
}


################################################################################

=head1 draw_form

Форма для редактирования скалярных полей объекта. Если определена опция C<bottom_toolbar>, то её значение (HTML, который желательно генерировать процедурой C<draw_centered_toolbar>) добавляется снизу основной таблицы. В противном случае нижняя панель генерируется автоматически и содержит кнопки "OK" и "Отмена", причём ссылка с последней берётся из опции C<esc>.

=head2 Параметры

Опции, данные, описания полей.

Опции:

=over

=item action

Значение CGI-параметра action. По умолчанию 'update'.

=item type

Значение CGI-параметра type. По умолчанию сохраняется то же, что для текущей страницы.

=item id

Значение CGI-параметра id. По умолчанию сохраняется то же, что для текущей страницы.

=item esc

Ссылка, на которую ведёт кнопка 'Отмена', если не задана опция C<bottom_toolbar>.

=item name

Имя формы. По умолчанию 'form'.

=back

=head2 Использование

	draw_form ({esc => "/?type=forms&search=1"}, 
		{
			name   => 'form1',
			period => 1,
		}		
		[
			{
				name  => 'name',
				label => 'Символическое имя',
				mandatory => 1,
				attributes => {
					disabled => '1',
				}
			},
			{
				name   => 'period',
				label  => 'Периодичность',
				type   => 'radio',
				values => [
					{id => 1, label => 'Годичная'},
					{id => 3, label => 'Квартальная'},
				],
			},
		]
	);

=cut

################################################################################

sub draw_form {
	drawer_call ('draw_form', @_);
}

################################################################################

=head1 draw_form_field_string

Отрисовка поля формы типа 'string'. Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item name

Имя CGI-параметра и одновременно ключа в хэшрефе C<$data>.

=item label

Отображаемое имя

=item size

Значение атрибутов C<size> и C<maxlength>

=back

=cut

################################################################################

sub draw_form_field_string {
	drawer_call ('draw_form_field_string', @_);
}

################################################################################

=head1 draw_form_field_datetime

Отрисовка поля формы типа 'datetime' (требуется скачать DHTML с http://dynarch.com/mishoo/calendar.epl). Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item name

Имя CGI-параметра и одновременно ключа в хэшрефе C<$data>.

=item label

Отображаемое имя

=item size

Значение атрибутов C<size> и C<maxlength>

=item no_time

Не вводить время.

=item format

Формат даты (описание формата см. там же, где download).

=back

=cut

################################################################################

sub draw_form_field_datetime {
	drawer_call ('draw_form_field_datetime', @_);
}

################################################################################

=head1 draw_form_field_file

Отрисовка поля формы типа 'file'. Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item name

Имя CGI-параметра и одновременно ключа в хэшрефе C<$data>.

=item label

Отображаемое имя

=item size

Значение атрибута C<size>

=back

=cut

################################################################################

sub draw_form_field_file {
	drawer_call ('draw_form_field_file', @_);
}

################################################################################

=head1 draw_form_field_button

Отрисовка поля формы типа 'button'. Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item name

Имя элемента управления<$data>.

=item value

Значение HTML-атрибута C<value>. По умолчанию равно C<name>.

=item onclick

Обработчик события C<onclick>.

=back

=cut

################################################################################

sub draw_form_field_button {
	drawer_call ('draw_form_field_button', @_);
}

################################################################################

=head1 draw_form_field_hgroup

Отрисовка поля формы типа 'text': группа полей, расположенных в одну строку по горизонтали. Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item label

Отображаемое имя.

=item items

Описания полей ввода.

=back

=cut

################################################################################

sub draw_form_field_hgroup {
	drawer_call ('draw_form_field_hgroup', @_);
}

################################################################################

=head1 draw_form_field_text

Отрисовка поля формы типа 'text': C<textarea>. Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item name

Имя CGI-параметра и одновременно ключа в хэшрефе C<$data>.

=item label

Отображаемое имя

=item rows

Количество строк. По умоланию 25.

=item cols

Колчиество столбцов. По умоланию 60.

=item value

Значение по умолчанию.

=back

=cut

################################################################################

sub draw_form_field_text {
	drawer_call ('draw_form_field_text', @_);
}

################################################################################

=head1 draw_form_field_hidden

Отрисовка поля формы типа 'text': C<textarea>. Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item name

Имя CGI-параметра и одновременно ключа в хэшрефе C<$data>.

=item value

Значение на тот случай, если не C<!$data{$$options{name}}>.

=back

=cut

################################################################################

sub draw_form_field_hidden {
	drawer_call ('draw_form_field_hidden', @_);
}

################################################################################

=head1 draw_form_field_checkbox

Отрисовка поля формы типа C<checkbox> со значением 1. Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item name

Имя CGI-параметра и одновременно ключа в хэшрефе C<$data>.

=item label

Отображаемое имя

=item checked

1, если надо форсированно отметить.

=back

=cut

################################################################################

sub draw_form_field_checkbox {
	drawer_call ('draw_form_field_checkbox', @_);
}

################################################################################

=head1 draw_form_field_checkboxes

Отрисовка группы полей формы типа C<checkbox>. Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item name

Имя CGI-параметра и одновременно ключа в хэшрефе C<$data>.

=item label

Отображаемое имя

=item values

Ссылка на список вида:

	[
		{id => 'значение 1', label => 'строка 1'},
		{id => 'значение 2', label => 'строка 2'},
		
		. . .
		
		{id => 'значение n', label => 'строка n'},
	]

=back

=cut

################################################################################

sub draw_form_field_checkboxes {
	drawer_call ('draw_form_field_checkboxes', @_);
}

################################################################################

=head1 draw_form_field_password

Отрисовка поля формы типа 'password'. Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item name

Имя CGI-параметра и одновременно ключа в хэшрефе C<$data>.

=item label

Отображаемое имя

=back

=cut

################################################################################

sub draw_form_field_password {
	drawer_call ('draw_form_field_password', @_);
}

################################################################################

=head1 draw_form_field_static

Отрисовка поля формы типа 'static': собственно, это не поле ввода, а показ значения поля. Нужно в том случае, если часть формы read only. Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item name

Имя CGI-параметра и одновременно ключа в хэшрефе C<$data>.

=item label

Отображаемое имя

=item value

Отображаемое значение (если не определено в $data)

=item hidden_value

Передаваемое значение (должно отличаться от value)

=item values 

Маппинг от hidden_value к value.

=item href 

Гиперссылка.

=item target

Целевое окно гиперссылки.

=item a_class

CSS-класс гиперссылки.

=back

=cut

################################################################################

sub draw_form_field_static {
	drawer_call ('draw_form_field_static', @_);
}

################################################################################

=head1 draw_form_field_radio

Отрисовка группы радиокнопок. Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item name

Имя CGI-параметра и одновременно ключа в хэшрефе C<$data>.

=item label

Отображаемое имя

=item values

Ссылка на список вида:

	[
		{id => 'значение 1', label => 'строка 1'},
		{id => 'значение 2', label => 'строка 2'},
		
		. . .
		
		{id => 'значение n', label => 'строка n'},
	]

=back

=cut

################################################################################

sub draw_form_field_radio {
	drawer_call ('draw_form_field_radio', @_);
}

################################################################################

=head1 draw_form_field_select

Отрисовка dropdown-списка выбора. Вызывается автоматически из-под C<draw_form>.

=head2 Опции

=over

=item name

Имя CGI-параметра и одновременно ключа в хэшрефе C<$data>.

=item label

Отображаемое имя

=item values

Ссылка на список вида:

	[
		{id => 'значение 1', label => 'строка 1'},
		{id => 'значение 2', label => 'строка 2'},
		
		. . .
		
		{id => 'значение n', label => 'строка n'},
	]

=item empty

Если задана, то в начало списка добавляется пустая строка с данной подписью и C<id=0>.

=back

=cut

################################################################################

sub draw_form_field_select {
	drawer_call ('draw_form_field_select', @_);
}

################################################################################

=head1 draw_esc_toolbar

Нижняя панель с кнопкой "Отмена". Рисуется автоматически при вызове 
C<draw_form> при наличии опций C<esc> и C<no_ok>.

=cut

################################################################################

sub draw_esc_toolbar {
	drawer_call ('draw_esc_toolbar', @_);
}

################################################################################

=head1 draw_ok_esc_toolbar

Нижняя панель с кнопками "ОК" и "Отмена". Рисуется автоматически при вызове 
C<draw_form> при наличии опции C<esc>.

Опции:

=over

=item esc

Ссылка с кнопки 'отмена'.

=item name

Имя формы. По умолчанию 'form'.

=back


=cut

################################################################################

sub draw_ok_esc_toolbar {
	drawer_call ('draw_ok_esc_toolbar', @_);
}

################################################################################

=head1 draw_back_next_toolbar

Нижняя панель с кнопками "Назад" и "Далее". Рисуется автоматически при вызове 
C<draw_form> при наличии опции C<back>.

=cut

################################################################################

sub draw_back_next_toolbar {
	drawer_call ('draw_back_next_toolbar', @_);
}

################################################################################

=head1 draw_close_toolbar

Нижняя панель с кнопкой "Закрыть". Рисуется автоматически при вызове 
C<draw_form> при истинном значении параметра C<__no_navigation>.

=cut

################################################################################

sub draw_close_toolbar {
	drawer_call ('draw_close_toolbar', @_);
}

################################################################################

=head1 draw_centered_toolbar_button

Отрисовка кнопки для панели под формой (типа OK/Cancel или Back/Next).

Опции:

=over

=item href

Ссылка с кнопки. Если не указан параметр C<sid> и ссылка не C<javaScript>, то номер сесси приписывается автоматически.

=item onclick

Обработчик события C<onclick>.

=item target

Целевое окно (фрейм) ссылки. В отличие от C<draw_toolbar_button>, по умолчанию не C<invisible>, а пусто.

=item label

Надпись на кнопке.

=item icon

Изображение на кнопке (зарезервировано, не используется).

=back

=cut

################################################################################

sub draw_centered_toolbar_button {
	drawer_call ('draw_centered_toolbar_button', @_);
}

################################################################################

=head1 draw_centered_toolbar

Нижняя панель с кнопками: требуется в тех случаях, когда вместо C<draw_form> 
используется её аналог.


=head2 Параметры

Опции, данные, описания полей.

Опции:

=over

=item action

Значение CGI-параметра action. По умолчанию 'update'.

=item esc

Ссылка, на которую ведёт кнопка 'отмена'.

=back

=head2 Использование

	draw_centered_toolbar ({}, [
		{
			icon => 'ok',     
			label => 'применить', 
			href => '#', 
			onclick => 'document.form.submit()',
		},		
		{	
			icon => 'cancel', 
			label => 'вернуться', 
			href => "/?type=forms",
		},		
		{
			icon => 'tv', 
			label => 'опубликовать', 
			href => "javaScript:..."},
		} 
	])

=cut

################################################################################

sub draw_centered_toolbar {
	drawer_call ('draw_centered_toolbar', @_);	
}

################################################################################

=head1 draw_auth_toolbar

Отрисовка верхней панели с календарём, именем пользователя и кнопкой выхода.
Используется при общей отрисовке страницы, не должна вызываться напрямую.

=cut

################################################################################

sub draw_auth_toolbar {
	drawer_call ('draw_auth_toolbar', @_);	
}

################################################################################

=head1 draw_calendar

Отрисовка календаря на верхней панели.
Используется при общей отрисовке страницы, не должна вызываться напрямую.

=cut

################################################################################

sub draw_calendar {
	drawer_call ('draw_calendar', @_);
}

################################################################################

sub draw_form_field_image {
	drawer_call ('draw_form_field_image', @_);
}

################################################################################

=head1 draw_form_field_string

Отрисовка WYSIWYG-редактора для HTML. Вызывается автоматически из-под C<draw_form>. Работает только для MSIE 5+.

=head2 Опции

=over

=item name

Имя CGI-параметра и одновременно ключа в хэшрефе C<$data>.

=item label

Отображаемое имя

=item width

Ширина

=item height

Высота

=back

=cut

################################################################################

sub draw_form_field_htmleditor {
	drawer_call ('draw_form_field_htmleditor', @_);
}

1;
