[perl]
	my @filters = grep /^ui_filter:/, keys %$CGI;
	foreach my $key (@filters) {
		my $val = delete $CGI->{$key};
		$key =~ s/ui_filter://;
		next unless $val;
		next unless defined $CGI->{$key};
		$CGI->{$key} = $Tag->filter($val, $CGI->{$key}, $key);
	}
	if(! $CGI->{ui_elements}) {
		$CGI->{ui_template} = $Tag->filter('filesafe', $CGI->{ui_template});
		$CGI->{ui_elements} = $Tag->read_ui_template( 
									{
										file => $CGI->{ui_template},
										element => 'ui_template_layout',
									});
		#Log("elements: $CGI->{ui_elements}");
	}
	@layout = split /[\0\s,]+/, $CGI->{ui_elements};
	@insert = split /\0/, ($CGI->{ui_content} || 'Page content.'); 

	for(keys %{$CGI}) {
		next unless /^ui_control_(.*)/;
		my $k = $1;
		unshift @layout, "[set $k]" . $CGI->{$_} . '[/set]';
	}

	my $def_string;
	if($CGI->{ui_save_t_in_page}) {
		$def_string = $CGI->{ui_definition};
	}
	else {
		$def_string = $CGI->{ui_short_definition};
	}
	$def_string =~ s/\r\n?/\n/g;
	unshift @layout, '[' . "comment]\n$def_string\n[" . "/comment]\n";

	foreach $one (@layout) {
		if( $one eq 'UI_CONTENT') {
			my $content = shift @insert;
			$content =~ s/\r?\n/\n/g;
			$content = "\n<!-- BEGIN CONTENT -->\n$content\n<!-- END CONTENT -->\n";
			#Log("inserting $content");
			push @out, $content;
		}
		elsif ($one =~ /^[A-Z]\w+$/) {
			push @out, '@_' . $one . '_@';
			#Log("inserted variable $one");
		}
		else {
			push @out, $one;
			#Log("inserted set $one");
		}
	}
	my $page = $Tag->filter('filesafe', $CGI->{ui_page});
	if( ! $page) {
		$Scratch->{ui_error} = errmsg("No page name given.");
		$Tag->bounce('__UI_BASE__/error');
		return;
	}
	$page = "pages/$page" if $page !~ m{^pages/};
	$page .= $Config->{HTMLsuffix}
		unless $page =~ /$Config->{HTMLsuffix}$/;
#Log("final page=$page");
	push @out, '';
	unless ($Tag->write_relative_file($page, (join "\n", @out))) {
		$Scratch->{ui_error} = errmsg("Couldn't save page %s.", $page);
	}
	$Scratch->{ui_output_page} = $page;
	return;
[/perl]
