--- loncom/homework/daxepage.pm	2016/01/06 16:44:30	1.2
+++ loncom/homework/daxepage.pm	2023/11/27 23:24:04	1.9
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Page with Daxe on the left side and the preview on the right side
 #
-# $Id: daxepage.pm,v 1.2 2016/01/06 16:44:30 damieng Exp $
+# $Id: daxepage.pm,v 1.9 2023/11/27 23:24:04 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -28,45 +28,180 @@
 ###
 
 package Apache::daxepage;
+use strict;
 
-use Apache::Constants;
+use Apache::loncommon();
+use Apache::lonhtmlcommon();
+use Apache::lonxml();
+use Apache::edit();
+use Apache::lonmenu();
+use Apache::lonlocal;
+use Apache::Constants qw(:common);
+use LONCAPA qw(:DEFAULT :match);
+use HTML::Entities();
 
 sub handler {
     my $request = shift;
     my $uri = $request->uri;
-    $uri =~ s/^\/daxepage//;
-    &Apache::loncommon::no_cache($request);
-    if ($uri !~ /\.(task|problem|exam|quiz|assess|survey|library|xml|html|htm|xhtml|xhtm)$/) {
+    $uri =~ s{^/daxepage}{};
+    &Apache::loncommon::content_type($request,'text/html');
+    my ($is_not_assess,$is_assess);
+    if ($uri =~/\.(xml|html|htm|xhtml|xhtm)$/) {
+        $is_not_assess = 1;
+    } elsif ($uri =~ /$LONCAPA::assess_re/) {
+        unless ($uri =~ /\.form$/) {
+            $is_assess = 1;
+        }
+    }
+    unless ($is_not_assess || $is_assess) {
         $request->status(406);
         return OK;
     }
-    my $result = '';
-    $result .= "<!DOCTYPE html>\n";
-    $result .= "<html>\n";
-    $result .= "<head>\n";
+    my %editors = &Apache::loncommon::permitted_editors();
+    unless ($editors{'daxe'}) {
+        my $msg = '<p class="LC_warning">'.
+                  &mt('Daxe editor is not enabled for this Authoring Space.').'</p>';
+        &do_redirect($request,$uri,$msg);
+        return OK;
+    }
+    if ($is_not_assess) {
+        delete($editors{'xml'});
+        $editors{'edit'} = 1;
+    }
+    my %lt = &Apache::lonlocal::texthash(
+                                          'noif' => 'No iframe support.',
+                                          'show' => 'Show content in pop-up window',
+                                          'oeds' => 'other editors',
+                                          'othe' => 'other editor',
+                                          'edit' => 'Edit',
+                                        );
     my $name = $uri;
     $name =~ s/^.*\/([^\/]+)$/$1/;
-    $result .= "  <title>LON-CAPA Daxe: $name</title>\n";
-    $result .= '  <script src="/adm/split.js/split.min.js"></script>'."\n";
-    $result .= '  <link rel="stylesheet" href="/adm/split.js/split.css">'."\n";
-    $result .= "  <style>\n";
-    $result .= "    #daxe, #preview { border: none; }\n";
-    $result .= "  </style>\n";
-    $result .= "</head>\n";
-    $result .= "<body>\n";
-    $result .= '  <div class="split-parent">'."\n";;
-    my $daxeurl = '/adm/daxe/daxe.html?config=config/loncapa_config.xml&amp;file=/daxeopen'.$uri.
-        '&amp;save=/daxesave';
-    $result .= '    <iframe id="daxe" src="'.$daxeurl.'" class="split split-horizontal"></iframe>'."\n";
-    my $previewurl = $uri.'?inhibitmenu=yes';
-    $result .= '    <iframe id="preview" src="'.$previewurl.'" class="split split-horizontal"></iframe>'."\n";
-    $result .= "  </div>\n";
-    $result .= '  <script>Split(["#daxe", "#preview"], {sizes: [75, 25], minSize: [400, 20]});</script>'."\n";
-    $result .= "</body>\n";
-    $result .= "</html>\n";
-    $request->print($result);
+    my $daxeurl = '/adm/daxe/daxe.html?config=config/loncapa_config.xml&save=/daxesave'.
+                  '&file=/daxeopen'.$uri;
+    my $headjs = &Apache::loncommon::iframe_wrapper_headjs().
+                 &toggle_LCmenus_js().
+                 &Apache::edit::js_change_detection();
+    if ($is_assess) {
+        $headjs .= &Apache::lonxml::setmode_javascript();
+    } else {
+        $headjs .= &Apache::lonxml::seteditor_javascript();
+    }
+    my $form_events = &Apache::edit::form_change_detection();
+    my $editheader = '<form '.$form_events.' method="post" name="daxeedit" action="'.$uri.'">'.
+                     '<input type="hidden" name="problemmode" value="daxe" />'."\n".
+                     '<div class="LC_edit_problem_editxml_header">'."\n";
+    if ($editors{'edit'} || $editors{'xml'}) {
+        my $other = (($editors{'edit'} && $editors{'xml'})? $lt{'oeds'} : $lt{'othe'});
+        $editheader .= '<table class="LC_edit_problem_header_title"><tr><td>'.
+                       $uri.
+                       '</td><td align="right"><span class="LC_nobreak">'.$other.': ';
+        if ($is_not_assess) {
+            $editheader .= '<input type="hidden" name="editmode" value="" />'."\n".
+                           '<input type="button" name="editordefault" value="'.$lt{'edit'}.
+                           '" onclick="seteditmode(this.form,'."'edit'".');" />'."\n";
+        } else {
+            if ($editors{'edit'}) {
+                $editheader .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.
+                               'onclick="javascript:setmode(this.form,'."'edit'".')" />'."\n";
+            }
+            if ($editors{'xml'}) {
+                $editheader .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.
+                               'onclick="javascript:setmode(this.form,'."'editxml'".')" />'."\n";
+            }
+        }
+        $editheader .= '</span></td></tr></table>';
+    } else {
+        $editheader .= '<table class="LC_edit_problem_header_title"><tr><td>'.
+                       $uri.
+                       '</td></tr></table>';
+    }
+    $editheader .= '</div></form>'."\n";
+    my $args = {
+                'collapsible_header' => $editheader,
+               };
+    my $startpage = &Apache::loncommon::start_page('Daxe: '.$name,$headjs,$args).
+                    &Apache::lonmenu::constspaceform();
+    my $endpage = &Apache::loncommon::end_page();
+
+    # javascript will position the iframe if window was resized (or zoomed)
+    my $script = &Apache::loncommon::iframe_wrapper_resizejs();
+    my $dest = &HTML::Entities::encode($daxeurl,'&<>"');
+    my $noiframe = &Apache::loncommon::modal_link($dest,$lt{'show'},500,400);
+
+    $request->print(<<"ENDFRAME");
+$startpage
+$script
+<div class="LC_iframecontainer" style="padding-right: 5px">
+<iframe src="$dest">$lt{'noif'} $noiframe</iframe>
+</div>
+$endpage
+ENDFRAME
     return OK;
 }
 
+sub toggle_LCmenus_js {
+    my %lt = &Apache::lonlocal::texthash(
+                                         altc => 'menu state: collapsed',
+                                         alte => 'menu state: explanded',
+                                         ttlc => 'display standard menus',
+                                         ttle => 'hide standard menus',
+    );
+    return <<"ENDJS";
+<script type="text/javascript">
+//<![CDATA[
+\$(document).ready (function () {
+    \$(".LC_collapse_trigger").on("click", function (e) {
+        var id = this.id;
+        var \$content = \$(this).next (".LC_menus_content");
+        var expanded = \$content.hasClass ("shown");
+        if (expanded) {
+            \$content.removeClass ("shown");
+            \$content.addClass ("hidden");
+        } else {
+            \$content.removeClass ("hidden");
+            \$content.addClass ("shown");
+        }
+
+        \$(this).find ("[aria-expanded]")
+        .attr ("aria-expanded", !expanded);
+
+        \$(this).find ("[aria-pressed]")
+        .attr ("aria-pressed", !expanded);
+
+        \$(this).find (".LC_collapsible_indicator").attr ({
+        "src":
+        (expanded)? "/res/adm/pages/collapsed.png" : "/res/adm/pages/expanded.png",
+        "alt":
+        (expanded)? "$lt{altc}" : "$lt{alte}",
+        "title":
+        (expanded)? "$lt{ttlc}" : "$lt{ttle}"
+        });
+
+        \$(window).trigger('resize');
+        \$(this).focus ();
+    });
+
+    \$("#LC_expandingContainer").attr ("aria-live", "off");
+});
+//]]>
+</script>
+ENDJS
+
+}
+
+sub do_redirect {
+    my ($request,$uri,$msg) = @_;
+    &Apache::lonhtmlcommon::clear_breadcrumbs();
+    $request->print(
+        &Apache::loncommon::start_page('Authoring Space',undef,
+                                       {'redirect'       => [2,$uri]}).
+
+        '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n".
+        "$msg\n".
+        &Apache::loncommon::end_page());
+    return;
+}
+
 1;
 __END__