# Virtualmin Framed heme # Icons copyright David Vignoni, all other theme elements copyright 2005-2007 # Virtualmin, Inc. $default_domains_to_show = 10; # Global state for wrapper # if 0, wrapper isn't on, add one and open it, if 1 close it, if 2+, subtract # but don't close $WRAPPER_OPEN = 0; # theme_ui_post_header([subtext]) # Returns HTML to appear directly after a standard header() call sub theme_ui_post_header { local ($text) = @_; my $rv; $rv .= "
$text
\n" if (defined($text)); #$rv .= "
\n"; $rv .= "

" if (!defined($text)); return $rv; } # theme_ui_pre_footer() # Returns HTML to appear directly before a standard footer() call sub theme_ui_pre_footer { my $rv; $rv .= "

\n"; return $rv; } # ui_print_footer(args...) # Print HTML for a footer with the pre-footer line. Args are the same as those # passed to footer() sub theme_ui_print_footer { local @args = @_; print &ui_pre_footer(); &footer(@args); } sub theme_icons_table { my ($i, $need_tr); my $cols = $_[3] ? $_[3] : 4; my $per = int(100.0 / $cols); print "

\n"; print "\n"; for($i=0; $i<@{$_[0]}; $i++) { if ($i%$cols == 0) { print "\n"; } print "\n"; if ($i%$cols == $cols-1) { print "\n"; } } while($i++%$cols) { print "\n"; $need_tr++; } print "\n" if ($need_tr); print "
\n"; &generate_icon($_[2]->[$i], $_[1]->[$i], $_[0]->[$i], $_[4], $_[5], $_[6], $_[7]->[$i], $_[8]->[$i]); print "
\n"; print "
\n"; } sub theme_generate_icon { my $w = !defined($_[4]) ? "width=48" : $_[4] ? "width=$_[4]" : ""; my $h = !defined($_[5]) ? "height=48" : $_[5] ? "height=$_[5]" : ""; if ($tconfig{'noicons'}) { if ($_[2]) { print "$_[6]$_[1]$_[7]\n"; } else { print "$_[6]$_[1]$_[7]\n"; } } elsif ($_[2]) { print "
\n", "\"\"
\n"; print "$_[6]$_[1]$_[7]\n"; } else { print "
\n", "\"\"", "
\n$_[6]$_[1]$_[7]\n"; } } sub theme_post_change_modules { print < var url = '' + top.left.location; top.left.location = url; EOF } sub theme_prebody { my $module_name = &get_module_name(); if ($script_name =~ /session_login.cgi/) { # Generate CSS link print "\n"; } } sub theme_prehead { print "\n"; print "\n"; print "\n"; print "\n"; } sub theme_popup_prehead { return &theme_prehead(); } # ui_table_start(heading, [tabletags], [cols], [&default-tds], [right-heading]) # A table with a heading and table inside sub theme_ui_table_start { my ($heading, $tabletags, $cols, $tds, $rightheading) = @_; if (! $tabletags =~ /width/) { $tabletages .= " width=100%"; } if (defined($main::ui_table_cols)) { # Push on stack, for nested call push(@main::ui_table_cols_stack, $main::ui_table_cols); push(@main::ui_table_pos_stack, $main::ui_table_pos); push(@main::ui_table_default_tds_stack, $main::ui_table_default_tds); } my $rv; my $colspan = 1; if (!$WRAPPER_OPEN) { $rv .= "\n"; $rv .= "\n"; $rv .= "
\n"; } $WRAPPER_OPEN++; $rv .= "\n"; if (defined($heading) || defined($rightheading)) { $rv .= ""; if (defined($heading)) { $rv .= "" } if (defined($rightheading)) { $rv .= ""; $colspan++; } $rv .= "\n"; } $rv .= "
$heading$rightheading
". "\n"; $main::ui_table_cols = $cols || 4; $main::ui_table_pos = 0; $main::ui_table_default_tds = $tds; return $rv; } # ui_table_end() # The end of a table started by ui_table_start sub theme_ui_table_end { my $rv; if ($main::ui_table_cols == 4 && $main::ui_table_pos) { # Add an empty block to balance the table $rv .= &ui_table_row(" ", " "); } if (@main::ui_table_cols_stack) { $main::ui_table_cols = pop(@main::ui_table_cols_stack); $main::ui_table_pos = pop(@main::ui_table_pos_stack); $main::ui_table_default_tds = pop(@main::ui_table_default_tds_stack); } else { $main::ui_table_cols = undef; $main::ui_table_pos = undef; $main::ui_table_default_tds = undef; } $rv .= "
\n"; if ($WRAPPER_OPEN==1) { #$rv .= "\n"; $rv .= "
\n"; } $WRAPPER_OPEN--; return $rv; } # theme_ui_tabs_start(&tabs, name, selected, show-border) # Render a row of tabs from which one can be selected. Each tab is an array # ref containing a name, title and link. sub theme_ui_tabs_start { my ($tabs, $name, $sel, $border) = @_; my $rv; if (!$main::ui_hidden_start_donejs++) { $rv .= &ui_hidden_javascript(); } # Build list of tab titles and names my $tabnames = "[".join(",", map { "\""."e_escape($_->[0])."\"" } @$tabs)."]"; my $tabtitles = "[".join(",", map { "\""."e_escape($_->[1])."\"" } @$tabs)."]"; $rv .= "\n"; # Output the tabs my $imgdir = "@{[&get_webprefix()]}/images"; $rv .= &ui_hidden($name, $sel)."\n"; $rv .= "\n"; $rv .= "\n"; $rv .= "\n"; $rv .= "\n"; foreach my $t (@$tabs) { if ($t ne $tabs[0]) { # Spacer $rv .= "\n"; } my $tabid = "tab_".$t->[0]; $rv .= "\n"; } $rv .= "\n"; $rv .= "
"; if ($ENV{'HTTP_USER_AGENT'} !~ /msie/i) { # For some reason, the 1-pixel space above the tabs appears huge on IE! $rv .= ""; } $rv .= "
". ""; $rv .= ""; if ($t->[0] eq $sel) { # Selected tab $rv .= ""; $rv .= ""; $rv .= ""; } else { # Other tab (which has a link) $rv .= ""; $rv .= ""; $rv .= ""; $rv .= "\n"; } $rv .= "
". "\"\"". " $t->[1] ". "\"\"". "\"\"". " ". "$t->[1] ". "
"; $rv .= "
\n"; if ($border) { # All tabs are within a grey box $rv .= "\n"; $rv .= "\n"; $rv .= "\n"; $rv .= "\n"; $rv .= "". "\n"; } $rv .= "\n"; my $i; for($i=0; $i<@$heads; $i++) { $rv .= "\n"; } $rv .= "\n"; $theme_ui_columns_count++; return $rv; } # theme_ui_columns_row(&columns, &tdtags) # Returns HTML for a row in a multi-column table sub theme_ui_columns_row { $theme_ui_columns_row_toggle = $theme_ui_columns_row_toggle ? '0' : '1'; local ($cols, $tdtags) = @_; my $rv; $rv .= "\n"; my $i; for($i=0; $i<@$cols; $i++) { $rv .= "\n"; } $rv .= "\n"; return $rv; } # theme_ui_columns_end() # Returns HTML to end a table started by ui_columns_start sub theme_ui_columns_end { my $rv; $rv = "
"; } $main::ui_tabs_selected = $sel; return $rv; } # theme_ui_columns_start(&headings, [width-percent], [noborder], [&tdtags], [heading]) # Returns HTML for a multi-column table, with the given headings sub theme_ui_columns_start { my ($heads, $width, $noborder, $tdtags, $heading) = @_; my ($href) = grep { $_ =~ /\n"; $rv .= "
\n"; } if (!$noborder) { $WRAPPER_OPEN++; } local @classes; push(@classes, "ui_table") if (!$noborder); push(@classes, "sortable") if (!$href); $rv .= "\n"; if ($heading) { $rv .= "
$heading
[$i].">". ($heads->[$i] eq "" ? "
" : $heads->[$i])."
[$i].">". ($cols->[$i] !~ /\S/ ? "
" : $cols->[$i])."
\n"; if ($WRAPPER_OPEN == 1) { # Last wrapper $rv .= " \n"; } $WRAPPER_OPEN--; return $rv; } # theme_ui_grid_table(&elements, columns, [width-percent], [tds], [tabletags], # [title]) # Given a list of HTML elements, formats them into a table with the given # number of columns. However, themes are free to override this to use fewer # columns where space is limited. sub theme_ui_grid_table { my ($elements, $cols, $width, $tds, $tabletags, $title) = @_; return "" if (!@$elements); my $rv = "\n"; $rv .= "
\n"; $rv .= "\n"; if ($title) { $rv .= " ". "\n"; } $rv .= "\n"; my $i; for($i=0; $i<@$elements; $i++) { $rv .= "" if ($i%$cols == 0); $rv .= "\n"; $rv .= "" if ($i%$cols == $cols-1); } if ($i%$cols) { while($i%$cols) { $rv .= "\n"; $i++; } $rv .= "\n"; } $rv .= "
$title
[$i%$cols]." valign=top class='ui_grid_cell'>". $elements->[$i]."
[$i%$cols]." class='ui_grid_cell'>
\n"; $rv .= "
\n"; # wrapper return $rv; } # theme_ui_hidden_table_start(heading, [tabletags], [cols], name, status, # [&default-tds], [rightheading]) # A table with a heading and table inside, and which is collapsible sub theme_ui_hidden_table_start { my ($heading, $tabletags, $cols, $name, $status, $tds, $rightheading) = @_; my $rv; if (!$main::ui_hidden_start_donejs++) { $rv .= &ui_hidden_javascript(); } my $divid = "hiddendiv_$name"; my $openerid = "hiddenopener_$name"; my $defimg = $status ? "open.gif" : "closed.gif"; my $defclass = $status ? 'opener_shown' : 'opener_hidden'; my $text = defined($tconfig{'cs_text'}) ? $tconfig{'cs_text'} : defined($gconfig{'cs_text'}) ? $gconfig{'cs_text'} : "000000"; if (!$WRAPPER_OPEN) { # If we're not already inside of a wrapper, wrap it $rv .= "\n"; $rv .= "
\n"; } $WRAPPER_OPEN++; my $colspan = 1; $rv .= "\n"; if (defined($heading) || defined($rightheading)) { $rv .= ""; if (defined($heading)) { $rv .= ""; } if (defined($rightheading)) { $rv .= ""; $colspan++; } $rv .= "\n"; } $rv .= "
$heading$rightheading
\n"; $main::ui_table_cols = $cols || 4; $main::ui_table_pos = 0; $main::ui_table_default_tds = $tds; return $rv; } # ui_hidden_table_end(name) # Returns HTML for the end of table with hiding, as started by # ui_hidden_table_start sub theme_ui_hidden_table_end { my ($name) = @_; local $rv = "
\n"; if ( $WRAPPER_OPEN == 1 ) { $WRAPPER_OPEN--; #$rv .= "\n"; $rv .= "
\n"; } elsif ($WRAPPER_OPEN) { $WRAPPER_OPEN--; } return $rv; } # theme_select_all_link(field, form, text) # Adds support for row highlighting to the normal select all sub theme_select_all_link { local ($field, $form, $text) = @_; $form = int($form); $text ||= $text{'ui_selall'}; return "$text"; } # theme_select_invert_link(field, form, text) # Adds support for row highlighting to the normal invert selection sub theme_select_invert_link { local ($field, $form, $text) = @_; $form = int($form); $text ||= $text{'ui_selinv'}; return "$text"; } sub theme_select_rows_link { local ($field, $form, $text, $rows) = @_; $form = int($form); my $js = "var sel = { ".join(",", map { "\""."e_escape($_)."\":1" } @$rows)." }; "; $js .= "for(var i=0; i$text"; } sub theme_ui_checked_columns_row { $theme_ui_columns_row_toggle = $theme_ui_columns_row_toggle ? '0' : '1'; local ($cols, $tdtags, $checkname, $checkvalue, $checked, $disabled, $tags) = @_; my $rv; my $cbid = "e_escape(quotemeta("${checkname}_${checkvalue}")); my $rid = "e_escape(quotemeta("row_${checkname}_${checkvalue}")); my $ridtr = "e_escape("row_${checkname}_${checkvalue}"); my $mycb = $cb; if ($checked) { $mycb =~ s/mainbody/mainsel/g; } $mycb =~ s/class='/class='row$theme_ui_columns_row_toggle ui_checked_columns /; $rv .= "\n"; $rv .= "[0]." class='ui_checked_checkbox'>". &ui_checkbox($checkname, $checkvalue, undef, $checked, $tags." "."onClick=\"document.getElementById('$rid').className = this.checked ? 'mainhighsel' : 'mainhigh';\"", $disabled). "\n"; my $i; for($i=0; $i<@$cols; $i++) { $rv .= "[$i+1].">"; if ($cols->[$i] !~ /"; } $rv .= ($cols->[$i] !~ /\S/ ? "
" : $cols->[$i]); if ($cols->[$i] !~ /\n"; $rv .= "[0]." class='ui_radio_radio'>". &ui_oneradio($checkname, $checkvalue, undef, $checked, $tags." "."onClick=\"for(i=0; i\n"; my $i; for($i=0; $i<@$cols; $i++) { $rv .= "[$i+1].">"; if ($cols->[$i] !~ /"; } $rv .= ($cols->[$i] !~ /\S/ ? "
" : $cols->[$i]); if ($cols->[$i] !~ /'; if ($disabled) { return "\"$alt\"\n"; } else { return "\"$alt\"\n"; } } # theme_footer([page, name]+, [noendbody]) # Output a footer for returning to some page sub theme_footer { my $i; my $count = 0; my $module_name = &get_module_name(); my %module_info = &get_module_info($module_name); for($i=0; $i+1<@_; $i+=2) { local $url = $_[$i]; if ($url ne '/' || !$tconfig{'noindex'}) { if ($url eq '/') { $url = "/?cat=$module_info{'category'}"; } elsif ($url eq '' && $module_name) { $url = "/$module_name/$module_info{'index_link'}"; } elsif ($url =~ /^\?/ && $module_name) { $url = "/$module_name/$url"; } $url = "@{[&get_webprefix()]}$url" if ($url =~ /^\//); if ($count++ == 0) { print theme_ui_nav_link("left", $url); } else { print " |\n"; } print " ",&text('main_return', $_[$i+1]),"\n"; } } print "
\n"; if (!$_[$i]) { print "\n"; } } # theme_ui_hidden_javascript() # Returns EOF } 1;