[tmp now][time]%Y%m%d%H%M%S[/time][/tmp]
[flag type=write table=backup][perl tables=backup]
#Log("In page save");
	unless($CGI->{ui_page}) {
		# Probably a re-get after the original post, mozilla bug?
#Log("Returning with no ui_page");
		return;
	}
	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);
	}

	sub regular {
		local($_) = shift;
		s/\r\n/\n/g;
		tr/\r/\n/;
		return $_;
	}

	if(! $CGI->{ui_template_layout}) {
		$CGI->{ui_template} = $Tag->filter('filesafe', $CGI->{ui_template});
		$CGI->{ui_template_layout} = $Tag->read_ui_template( 
									{
										file => $CGI->{ui_template},
										element => 'ui_template_layout',
									});
#Log("elements: $CGI->{ui_template_layout}");
	}

	my @keys = keys %$CGI;

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

	if(! $found_set) {
		push @layout, regular($CGI->{ui_page_setting_text});
	}

	push @layout, '';

	@insert = split /\0/, ($CGI->{ui_content} || 'Page content.'); 

	my (@components) = grep /^\d+\.ui_component$/, @keys;
	@components = map { s/^(\d+).*/$1/; $_ } @components;
	@components = sort { $a <=> $b } @components;

	push @layout, '[control reset=1]' if @components;

#Log("components: " . join ",", @components);

	if(! @components) {
		$CGI->{ui_component_text} =~ s/\r\n/\n/g;
		$CGI->{ui_component_text} =~ tr/\r/\n/;
		push @layout, $CGI->{ui_component_text};
		push @layout, '';
	}
	else {
		for(@components) {
			my $digit = $_;
			my $comp = $CGI->{"$digit.ui_component"};

			my $out = "\n  [control-set]\n";
			$out .= "    [component]";
			$out .= $comp;
			$out .= "[/component]\n";

			my @els = grep /^$digit\.ui_control_/, keys %$CGI;
			for (@els) {
				my $val = $CGI->{$_};
				my $name = $_;
				$name =~ s/^\d+\.ui_control_//;
				$out .= "[$name]";
				$out .= $val;
				$out .= "[/$name]\n";
			}
			$out .= "  [/control-set]\n";
			push @layout, $out;
		}
	}

	push @layout, "[control reset=1]\n" if @components;

	if ($CGI->{ui_page_preamble}) {
		my $pre = regular($CGI->{ui_page_preamble});
		push @layout, <<EOF;
<!-- BEGIN PREAMBLE -->
$pre
<!-- END PREAMBLE -->
EOF
	}

	push @layout, split /[\0\s,]+/, $CGI->{ui_template_layout};

	my $def_string;
	if($CGI->{ui_save_t_in_page}) {
		$def_string = $CGI->{ui_definition};
	}
	else {
		$def_string = $CGI->{ui_short_definition};
	}

	$def_string = "ui_template: yes\nui_template_name: $CGI->{ui_template}"
		if $def_string !~ /\S/;

	$def_string =~ s/\r\n?/\n/g;
	unshift @layout, '[' . "comment]\n$def_string\n[" . "/comment]\n";

	if ($CGI->{ui_page_postamble}) {
		my $pre = regular($CGI->{ui_page_postamble});
		push @layout, <<EOF;
<!-- BEGIN POSTAMBLE -->
$pre
<!-- END POSTAMBLE -->
EOF
	}

	foreach $one (@layout) {
		if( $one eq 'UI_CONTENT') {
			my $content = shift @insert;
			if($content !~ /\n/) {
				$content =~ tr/\r/\n/;
			}
			else {
				$content =~ s/\r?\n/\n/g;
			}

			my $before = '';
			my $after = '';
			if($CGI->{ui_template_limit_tag}) {
				$before = "[restrict $CGI->{ui_template_limit_tag}]\n";
				$after  = "\n[/restrict]";
			}
			$content = "\n$before<!-- BEGIN CONTENT -->\n$content\n<!-- END CONTENT -->$after\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");
		}
	}
	delete $Scratch->{ui_output_page};

	my $page = $Tag->filter('filesafe', $CGI->{ui_page});
	if( $CGI->{ui_page_preview} ) {
		$page = "preview.html" unless $page;
		$page =~ s:.*/::;
		$page = "tmp/$Session->{id}.$page";
	}
	elsif( ! $page) {
		$Scratch->{ui_error} = errmsg("No page name given.");
		$Tag->bounce('__UI_BASE__/error');
		return;
	}
	$page .= $Config->{HTMLsuffix}
		unless $page =~ /$Config->{HTMLsuffix}$/;
	$page = "pages/$page" if $page !~ m{^pages/|^tmp/};
#Log("final page=$page");
	push @out, '';

	my $out = join "\n", @out;
	unless ($Tag->write_relative_file($page, $out)) {
#Log("failed to write page=$page");
		$Scratch->{ui_error} = errmsg("Couldn't save page %s.", $page);
	}
	$Scratch->{ui_output_page} = $page; 
	my $bdb = $Db{backup};
	return if $CGI->{ui_page_preview};
	return unless $bdb;
	my  $now = $Scratch->{now};
	my $code = $page;
	$code = substr($code, 0, 240)  if length ($code) > 240;
	$code .= ".$now";
	$bdb->set_slice($code, 
				[
					qw/
					logname
					hostname
					mod_time
					page_name
					page_text
					/
				],
				[
					$Session->{username},
					$Session->{host},
					$now,
					$page,
					$out,
				],
			);
	return;
[/perl]
