+$access = (
+ $password_ok || (
+ (int($state{'state'}) >= STATE->{'waiting'}) &&
+ ($frame <= int($state{'last'})) &&
+ ($frame >= 0)
+ )
+);
+
+if ($access) {
+ if ($no_cgi) {
+ # no CGI - static page is OK
+ if ($frame == 0) {
+ exit redirect($method, CGI_PATH(), HTTP_STATUS->{'see_other'});
+ }
+ elsif ($frame < int($state{'last'})) {
+ my $page_file;
+ if ($frame_data{'page'} ne '') {
+ $page_file = $frame_data{'page'};
+ }
+ else {
+ $page_file = sprintf(
+ $settings{'frame'},
+ $frame, 'htm'
+ );
+ }
+ if (_x_encoded('-f',
+ join_path(PATH_SEPARATOR(), WWW_PATH() , $page_file)
+ )) {
+ my $static_url = merge_url(
+ {'path' => CGI_PATH()},
+ {'path' => $page_file}
+ );
+ exit redirect($method, $static_url, HTTP_STATUS->{'see_other'});
+ }
+ }
+ }
+ if ($force_redirect) {
+ my $redirect_url = merge_url(
+ {'path' => CGI_VIEWER_PATH()},
+ {'path' => $frame}
+ );
+ unless ($no_cgi) {
+ $redirect_url = merge_url(
+ {'path' => $redirect_url},
+ {'query' => \%cgi}
+ );
+ }
+ exit redirect($method, $redirect_url, HTTP_STATUS->{'see_other'});
+ }
+
+ if ($frame > 0) {
+ $prev_frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame-1);
+ %prev_frame_data = read_data_file($prev_frame_data_path);
+ }
+ $next_frame_data_path = join_path(PATH_SEPARATOR(), DATA_PATH(), $frame+1);
+ %next_frame_data = read_data_file($next_frame_data_path);
+
+ %frame_data = merge_settings(\%default, \%frame_data);
+ %prev_frame_data = merge_settings(\%default, \%prev_frame_data);
+ %next_frame_data = merge_settings(\%default, \%next_frame_data);
+}
+else {
+ # replace frame data with fail state replacement
+ %frame_data = read_data_file(DATA_NOACCESS_PATH());
+ %frame_data = merge_settings(\%default, \%frame_data);
+}
+