use strict;
use DBI;
use CGI;
use HTML::Template::Pro;
use Crypt::CBC;
use Storable qw/freeze thaw/;
use Data::Dumper;

our($dbh, $q, $curruser);
our(%rootlvl, %userlvl);

eval{
  main();
};
if($@){
 warn $@;
}

sub dnice{
 print "Content-type: text/html\n\n";
 my($msg) = @_;
 print $msg;
 die @_;
}

sub main{
  #$dbh ||= DBI->connect('...','','',{RaiseError => 1, AutoCommit => 0});
  $q = new CGI;
  checkuser();

  my $action;
  $action = $q->param('action') || $q->param('action','index');
  dnice('No such action') if $action !~ /^(\w+)$/;
  $action = 'ext_' . $1;
  my($hdrs, $result, $noncacheable);

  dnice 'No access' if !accessallowed($action, $curruser);

  eval{
    ($hdrs, $result, $noncacheable) = __PACKAGE__->$action;
  };
  dnice($@) if $@;

  print $q->header( -type => 'text/html',
                    -charset => 'cp1251',
		    @$hdrs);
  !$result && return;
  !ref $result && print($result) && return;
  
  my $tmpl = HTML::Template::Pro->new( filename          => $q->param('action') . '.tmpl',
				       path              => './tmpl',
				       associate         => $q,
				       loop_context_vars => 1,
				       global_vars       => 1
				       );
  $tmpl->param(@$result);
  print $tmpl->output();
}

#просто выводим страницу
sub ext_example{
 return [], [ dummy=> 1 ];
}

#делаем редирект
sub ext_example_redirect{
 return [ -location => 'http://www.lala.com' ];
}

#вместо запрошенного action делаем другой - н., засабмитили некорректно заполненную форму, надо бы ее еще раз вывести
sub ext_example_substitute{
  $q->param('action', 'example');
  return ext_example();
}

#а вдруг нам надо вернуть картинку?
sub ext_example_plain{
 return [ -content_type => 'application/octet-stream' ], 'plain octet-stream';
}
#######################################################
sub checkuser{
 return 1;
}
sub accessallowed{
 return 1;
}