--- loncom/interface/lonhtmlcommon.pm 2021/12/31 20:56:46 1.358.2.19.2.1 +++ loncom/interface/lonhtmlcommon.pm 2017/12/18 16:36:34 1.391 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common html routines # -# $Id: lonhtmlcommon.pm,v 1.358.2.19.2.1 2021/12/31 20:56:46 raeburn Exp $ +# $Id: lonhtmlcommon.pm,v 1.391 2017/12/18 16:36:34 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -451,10 +451,12 @@ sub radio { &date_setter returns html and javascript for a compact date-setting form. To retrieve values from it, use &get_date_from_form. -Inputs - =over 4 +=item Inputs + +=over + =item $dname The name to prepend to the form elements. @@ -515,10 +517,12 @@ If true, text boxes for seconds are omit =back -Bugs +=item Bugs The method used to restrict user input will fail in the year 2400. +=back + =cut ############################################## @@ -685,11 +689,13 @@ ENDJS $monthselector,$dayselector,$yearselector, $hourselector). $tzone; + } elsif ($no_ss) { $result .= &mt('[_1] [_2] [_3] [_4] [_5]m', $monthselector,$dayselector,$yearselector, $hourselector,$minuteselector). $tzone; + } else { $result .= &mt('[_1] [_2] [_3] [_4] [_5]m [_6]s ', $monthselector,$dayselector,$yearselector, @@ -741,7 +747,9 @@ sub build_url { get_date_from_form retrieves the date specified in an &date_setter form. -Inputs: +=over + +=item Inputs: =over 4 @@ -755,6 +763,8 @@ The unix time to use as the default in c =back +=back + Returns: Unix time represented in the form. =cut @@ -848,14 +858,13 @@ parameter setting wizard. ############################################## sub pjump_javascript_definition { my $Str = <"); + my $early = '- '.&mt('Submit Early').''; + my $pastdue = '- '.&mt('Past Due').''; + return <<"JAVASCRIPT"; + + var documentReadyTime; + +\$(document).ready(function() { + if (typeof(dueDate) != "undefined") { + documentReadyTime = (new Date()).getTime(); + \$("#duedatecountdown").countdown({until: dueDate, compact: true, + layout: "$dueDateLayout", + onTick: function (periods) { + var latencyEstimate = (documentReadyTime - clientTime) * 2; + if(\$.countdown.periodsToSeconds(periods) < (300 + latencyEstimate)) { + \$("#submitearly").html("$early"); + if (\$.countdown.periodsToSeconds(periods) < 1) { + \$("#submitearly").html("$pastdue"); + } + } + if(\$.countdown.periodsToSeconds(periods) < (60 + latencyEstimate)) { + \$(this).css("color", "red"); //Highlight last minute. + } + } + }); + } +}); + +JAVASCRIPT + +} + # ----------------------------------------- Script to activate only some fields sub htmlareaselectactive { @@ -1531,62 +1629,11 @@ sub htmlareaselectactive { }); '; - $output .= &color_picker; - - # Code to put a due date countdown in 'duedatecountdown' span. - # This is currently located in the breadcrumb headers. - # note that the dueDateLayout is internatinoalized below. - # Here document is used to support the substitution into the javascript below. - # ..which unforunately necessitates escaping the $'s in the javascript. - # There are several times of importance - # - # serverDueDate - The absolute time at which the problem expires. - # serverTime - The server's time when the problem finished computing. - # clientTime - The client's time...as close to serverTime as possible. - # The clientTime will be slightly later due to - # 1. The latency between problem computation and - # the first network action. - # 2. The time required between the page load-start and the actual - # initial javascript execution that got clientTime. - # These are used as follows: - # The difference between clientTime and serverTime are used to - # correct for differences in clock settings between the browser's system and the - # server's. - # - # The difference between clientTime and the time at which the ready() method - # starts executing is used to estimate latencies for page load and submission. - # Since this is an estimate, it is doubled. The latency estimate + one minute - # is used to determine when the countdown timer turns red to warn the user - # to think about submitting. + $output .= &color_picker(); - my $dueDateLayout = &mt('Due in: {dn} {dl} {hnn}{sep}{mnn}{sep}{snn} [_1]', - ""); - my $early = '- '.&mt('Submit Early').''; - my $pastdue = '- '.&mt('Past Due').''; - $output .= <{'main'} eq 'n') { - undef($menulink); - } - } - } - } - if ($menulink) { my $description = 'Menu'; my $no_mt_descr = 0; if ((exists($env{'request.course.id'})) && @@ -1997,7 +2070,9 @@ Adds $html to $category of the breadcrum $html is usually a link to a page that invokes a function on the currently displayed data (e.g. print when viewing a problem) -Currently there are 3 possible values for $category: +=over + +=item Currently there are 3 possible values for $category: =over @@ -2011,7 +2086,9 @@ remaining items in right of breadcrumbs advanced tools shown in a separate box below breadcrumbs line =back - + +=back + returns: nothing =cut @@ -2060,8 +2137,17 @@ returns: a hash containing the current b Creates html for breadcrumb tools (categories navigation and tools) and inserts \$breadcrumbs at the correct position. -input: \$breadcrumbs - a reference to the string containing prepared -breadcrumbs. +=over + +=item input: + +=over + +=item \$breadcrumbs - a reference to the string containing prepared breadcrumbs. + +=back + +=back returns: nothing @@ -2087,8 +2173,17 @@ returns: nothing Creates html for advanced tools (category advtools) and inserts \$breadcrumbs at the correct position. -input: \$breadcrumbs - a reference to the string containing prepared -breadcrumbs (after render_tools call). +=over + +=item input: + +=over + +=item \$breadcrumbs - a reference to the string containing prepared breadcrumbs (after render_tools call). + +=back + +=back returns: nothing @@ -2550,9 +2645,9 @@ sub course_custom_roles { sub resource_info_box { - my ($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp,$divforres)=@_; + my ($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp)=@_; my $return=''; - if (($stuvcurrent ne '') || ($divforres)) { + if ($stuvcurrent ne '') { $return = '
'; } if ($symb) { @@ -2581,7 +2676,7 @@ sub resource_info_box { } else { $return='

'.&mt('No context provided.').'

'; } - if (($stuvcurrent ne '') || ($divforres)) { + if ($stuvcurrent ne '') { $return .= '
'; } return $return; @@ -3312,18 +3407,12 @@ PARAMSONE if (itemid != null) { itemh = itemid.offsetHeight; } - var primaryheight = 0; - if (document.getElementById('LC_nav_bar') != null) { - primaryheight = document.getElementById('LC_nav_bar').offsetHeight; - } - var secondaryheight = 0; + var primaryheight = document.getElementById('LC_nav_bar').offsetHeight; + var secondaryheight; if (document.getElementById('LC_secondary_menu') != null) { secondaryheight = document.getElementById('LC_secondary_menu').offsetHeight; } - var crumbsheight = 0; - if (document.getElementById('LC_breadcrumbs') != null) { - crumbsheight = document.getElementById('LC_breadcrumbs').offsetHeight; - } + var crumbsheight = document.getElementById('LC_breadcrumbs').offsetHeight; var dccidheight = 0; if (document.getElementById('dccid') != null) { dccidheight = document.getElementById('dccid').offsetHeight; @@ -3404,16 +3493,7 @@ function go(url) { currentURL = null; currentSymb= null; var lcHostname = setLCHost(); - if (lcHostname!='' && lcHostname!= null) { - var RegExp = /^https?\:/; - if (RegExp.test(url)) { - window.location.href=url; - } else { - window.location.href=lcHostname+url; - } - } else { - window.location.href=url; - } + window.location.href=lcHostname+url; } } @@ -3453,20 +3533,18 @@ sub jump_to_editres { } } else { unless ($cfile =~ m{^/priv/}) { - if ($cfile =~ m{^(/adm/wrapper/ext/([^#]+))(?:|#([^#]+))$}) { + if ($cfile =~ m{^(/adm/wrapper/ext/([^#]+))#([^#]+)$}) { $cfile = $1; my $extlink = $2; $anchor = $3; $is_ext = 1; if (($extlink !~ /^https:/) && ($ENV{'SERVER_PORT'} == 443)) { - unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) { - $usehttp = 1; - } + $usehttp = 1; } elsif ($env{'request.use_absolute'}) { if ($env{'request.use_absolute'} =~ m{^https://}) { $usehttps = 1; } - } + } } elsif ($cfile =~ m{^/?public/($match_domain)/($match_courseid)/syllabus}) { if ($ENV{'SERVER_PORT'} == 443) { my ($cdom,$cnum) = ($1,$2); @@ -3474,9 +3552,7 @@ sub jump_to_editres { ($env{'course.'.$env{'request.course.id'}.'.num'} eq $cnum) && ($env{'course.'.$env{'request.course.id'}.'.domain'} eq $cdom)) { if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://}) { - unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) { - $usehttp = 1; - } + $usehttp = 1; } } } elsif ($env{'request.use_absolute'}) { @@ -3516,7 +3592,9 @@ sub jump_to_editres { if ($hostname ne '') { $cfile = 'http://'.$hostname.(($cfile =~ /^\//)? '':'/').$cfile; } - $cfile .= (($cfile=~/\?/)?'&':'?').'usehttp=1'; + unless ($is_ext) { + $cfile .= (($cfile=~/\?/)?'&':'?').'usehttp=1'; + } } elsif ($usehttps) { $cfile = $env{'request.use_absolute'}.(($cfile =~ /^\//)? '':'/').$cfile; } @@ -3666,7 +3744,9 @@ sub scripttag { Constructs a XHTML list from \@array. -input: +=over + +=item input: =over @@ -3680,7 +3760,9 @@ Attributes for