--- loncom/interface/loncommon.pm 2007/09/05 05:09:53 1.579 +++ loncom/interface/loncommon.pm 2009/02/17 10:14:56 1.750 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.579 2007/09/05 05:09:53 raeburn Exp $ +# $Id: loncommon.pm,v 1.750 2009/02/17 10:14:56 weissno Exp $ # # Copyright Michigan State University Board of Trustees # @@ -61,12 +61,15 @@ use POSIX qw(strftime mktime); use Apache::lonmenu(); use Apache::lonenc(); use Apache::lonlocal; +use Apache::lonnet(); use HTML::Entities; use Apache::lonhtmlcommon(); use Apache::loncoursedata(); use Apache::lontexconvert(); use Apache::lonclonecourse(); use LONCAPA qw(:DEFAULT :match); +use DateTime::TimeZone; +use DateTime::Locale::Catalog; # ---------------------------------------------- Designs use vars qw(%defaultdesign); @@ -78,6 +81,76 @@ my $readit; ## Global Variables ## + +# ----------------------------------------------- SSI with retries: +# + +=pod + +=head1 Server Side include with retries: + +=over 4 + +=item * &ssi_with_retries(resource,retries form) + +Performs an ssi with some number of retries. Retries continue either +until the result is ok or until the retry count supplied by the +caller is exhausted. + +Inputs: + +=over 4 + +resource - Identifies the resource to insert. + +retries - Count of the number of retries allowed. + +form - Hash that identifies the rendering options. + +=back + +Returns: + +=over 4 + +content - The content of the response. If retries were exhausted this is empty. + +response - The response from the last attempt (which may or may not have been successful. + +=back + +=back + +=cut + +sub ssi_with_retries { + my ($resource, $retries, %form) = @_; + + + my $ok = 0; # True if we got a good response. + my $content; + my $response; + + # Try to get the ssi done. within the retries count: + + do { + ($content, $response) = &Apache::lonnet::ssi($resource, %form); + $ok = $response->is_success; + if (!$ok) { + &Apache::lonnet::logthis("Failed ssi_with_retries on $resource: ".$response->is_success.', '.$response->code.', '.$response->message); + } + $retries--; + } while (!$ok && ($retries > 0)); + + if (!$ok) { + $content = ''; # On error return an empty content. + } + return ($content, $response); + +} + + + # ----------------------------------------------- Filetypes/Languages/Copyright my %language; my %supported_language; @@ -198,7 +271,7 @@ BEGIN { } } &Apache::lonnet::logthis( - "INFO: Read file types"); + "INFO: Read file types"); $readit=1; } # end of unless($readit) @@ -214,14 +287,14 @@ BEGIN { =over 4 -=item * browser_and_searcher_javascript () +=item * &browser_and_searcher_javascript() XXReturns a string containing javascript with two functions, C and C. Returned string does not contain EscriptE tags. -=item * openbrowser(formname,elementname,only,omit) [javascript] +=item * &openbrowser(formname,elementname,only,omit) [javascript] inputs: formname, elementname, only, omit @@ -234,7 +307,7 @@ with the given extension. Can be a comm Specifying 'omit' will restrict the browser to NOT displaying files with the given extension. Can be a comma separated list. -=item * opensearcher(formname, elementname) [javascript] +=item * &opensearcher(formname,elementname) [javascript] Inputs: formname, elementname @@ -257,6 +330,7 @@ sub browser_and_searcher_javascript { } url += 'catalogmode=interactive&'; url += 'mode=$mode&'; + url += 'inhibitmenu=yes&'; url += 'form=' + formname + '&'; if (only != null) { url += 'only=' + only + '&'; @@ -318,7 +392,7 @@ sub storeresurl { unless ($resurl=~/^\/res/) { return 0; } $resurl=~s/\/$//; &Apache::lonnet::put('environment',{'lastresurl' => $resurl}); - &Apache::lonnet::appenv('environment.lastresurl' => $resurl); + &Apache::lonnet::appenv({'environment.lastresurl' => $resurl}); return 1; } @@ -367,7 +441,7 @@ sub selectstudent_link { return ''; } return "".&mt('Select User').""; + '","'.$udomele.'");'."'>".&mt('Select User').""; } if ($env{'request.role'}=~/^(au|dc|su)/) { return " +var stdeditbrowser; + +function openauthorbrowser(formname,udom) { + var url = '/adm/pickauthor?'; + url += 'form='+formname+'&roledom='+udom; + var title = 'Author_Browser'; + var options = 'scrollbars=1,resizable=1,menubar=0'; + options += ',width=700,height=600'; + stdeditbrowser = open(url,title,options,'1'); + stdeditbrowser.focus(); +} + + +ENDAUTHORBRW +} + sub coursebrowser_javascript { my ($domainfilter,$sec_element,$formname)=@_; my $crs_or_grp_alert = &mt('Please select the type of LON-CAPA entity - Course or Group - for which you wish to add/modify a user role'); @@ -407,7 +500,7 @@ sub coursebrowser_javascript { '&cdomelement='+udom+ '&cnameelement='+desc; if (extra_element !=null && extra_element != '') { - if (formname == 'rolechoice') { + if (formname == 'rolechoice' || formname == 'studentform') { url += '&roleelement='+extra_element; if (domainfilter == null || domainfilter == '') { url += '&domainfilter='+extra_element; @@ -471,7 +564,10 @@ sub setsec_javascript { my ($sec_element,$formname) = @_; my $setsections = qq| function setSect(sectionlist) { - var sectionsArray = sectionlist.split(","); + var sectionsArray = new Array(); + if ((sectionlist != '') && (typeof sectionlist != "undefined")) { + sectionsArray = sectionlist.split(","); + } var numSections = sectionsArray.length; document.$formname.$sec_element.length = 0; if (numSections == 0) { @@ -510,6 +606,12 @@ sub selectcourse_link { '","'.$udomele.'","'.$desc.'","'.$extra_element.'","'.$multflag.'","'.$selecttype.'");'."'>".&mt('Select Course').""; } +sub selectauthor_link { + my ($form,$udom)=@_; + return ''. + &mt('Select Author').''; +} + sub check_uncheck_jscript { my $jscript = <<"ENDSCRT"; function checkAll(field) { @@ -535,16 +637,88 @@ ENDSCRT return $jscript; } +sub select_timezone { + my ($name,$selected,$onchange,$includeempty)=@_; + my $output=' menus. The select menus will be linked in that changing the value of the first menu will result in new values being placed in the second menu. The values in the select menu will appear in alphabetical -order. +order unless a defined order is provided. linked_select_forms takes the following ordered inputs: @@ -562,6 +736,8 @@ linked_select_forms takes the following =item * $hashref, a reference to a hash containing the data for the menus. +=item * $menuorder, the order of values in the first menu + =back Below is an example of such a hash. Only the 'text', 'default', and @@ -578,7 +754,8 @@ $menu{$choice1}->{'select2'}. B2 => "Choice B2", B3 => "Choice B3", B4 => "Choice B4" - } + }, + order => ['B4','B3','B1','B2'], }, A2 => { text =>"Choice A2" , default => "C2", @@ -586,7 +763,8 @@ $menu{$choice1}->{'select2'}. C1 => "Choice C1", C2 => "Choice C2", C3 => "Choice C3" - } + }, + order => ['C2','C1','C3'], }, A3 => { text =>"Choice A3" , default => "D6", @@ -598,7 +776,8 @@ $menu{$choice1}->{'select2'}. D5 => "Choice D5", D6 => "Choice D6", D7 => "Choice D7" - } + }, + order => ['D4','D3','D2','D1','D7','D6','D5'], } ); @@ -610,7 +789,8 @@ sub linked_select_forms { $firstdefault, $firstselectname, $secondselectname, - $hashref + $hashref, + $menuorder, ) = @_; my $second = "document.$formname.$secondselectname"; my $first = "document.$formname.$firstselectname"; @@ -624,8 +804,11 @@ sub linked_select_forms { $result.="select2data.d_$s1 = new Object();\n"; $result.="select2data.d_$s1.def = new String('". $hashref->{$s1}->{'default'}."');\n"; - $result.="select2data.d_$s1.values = new Array("; + $result.="select2data.d_$s1.values = new Array("; my @s2values = sort(keys( %{ $hashref->{$s1}->{'select2'} } )); + if (ref($hashref->{$s1}->{'order'}) eq 'ARRAY') { + @s2values = @{$hashref->{$s1}->{'order'}}; + } $result.="\"@s2values\");\n"; $result.="select2data.d_$s1.texts = new Array("; my @s2texts; @@ -663,7 +846,11 @@ function select1_changed() { END # output the initial values for the selection lists $result .= "\n"; my $seconddefault = $hashref->{$firstdefault}->{'default'}; - foreach my $value (sort(keys(%select2))) { + + my @secondorder = sort(keys(%select2)); + if (ref($hashref->{$firstdefault}->{'order'}) eq 'ARRAY') { + @secondorder = @{$hashref->{$firstdefault}->{'order'}}; + } + foreach my $value (@secondorder) { $result.="