F:\WEBSITES\testbed\zipped\yabb_svn_new\branches\2.5.2\cgi-bin\yabb2\Sources\ExtendedProfiles.pl F:\WEBSITES\testbed\zipped\yabb_svn_new\trunk\cgi-bin\yabb2\Sources\ExtendedProfiles.pm
############################################################################### ###############################################################################
# ExtendedProfiles.pl                                                         # # ExtendedProfiles.pm                                                         #
  # $Date: 01.05.16 $                                                           #
############################################################################### ###############################################################################
# YaBB: Yet another Bulletin Board                                            # # YaBB: Yet another Bulletin Board                                            #
# Version:        YaBB 2.5.2                                                  # # Version:        YaBB 2.6.12                                                 #
# Packaged:       October 21, 2012                                            # # Packaged:       January 5, 2016                                             #
# Distributed by: http://www.yabbforum.com                                    # # Distributed by: http://www.yabbforum.com                                    #
# =========================================================================== # # =========================================================================== #
# Copyright (c) 2000-2012 YaBB (www.yabbforum.com) - All Rights Reserved.     # # Copyright (c) 2000-2016 YaBB (www.yabbforum.com) - All Rights Reserved.     #
# Software by:  The YaBB Development Team                                     # # Software by:  The YaBB Development Team                                     #
#               with assistance from the YaBB community.                      # #               with assistance from the YaBB community.                      #
############################################################################### ###############################################################################
   
$extendedprofilesplver = 'YaBB 2.5.2 $Revision: 1.2 $';  
if ($action eq 'detailedversion') { return 1; }  
   
###############################################################################  
# This file was part of the Extended Profiles Mod which has been created by   # # This file was part of the Extended Profiles Mod which has been created by   #
# Michael Prager. Last modification by him: 15.11.07                          # # Michael Prager. Last modification by him: 15.11.07                          #
# Added to the YaBB default code on 07. September 2008                        # # Added to the YaBB default code on 07. September 2008                        #
############################################################################### ###############################################################################
# file formats used by this code:  our $VERSION = '2.6.12'; 
#  
#  username.vars - contains the additional user profile information. Number is field-id  
#  -------------  
#  ...  
#  'ext_0',"value"  
#  'ext_1',"value"  
#  'ext_2',"value"  
#  ...  
#  
#  @ext_prof_order - contains the order in which the fields will be displayed  
#  ---------------------------  
#  ("name","name","name",....)  
#  
#  extended_profiles_fields.txt - defines the new profile fields. Uses line number as field-id  
#  ----------------------------  
#  ("name|type|options|active|comment|required_on_reg|visible_in_viewprofile|v_users|v_groups|visible_in_posts|p_users|p_groups|p_displayfieldname|visible_in_memberlist|m_users|m_groups|editable_by_user|visible_in_posts_popup|pp_users|pp_groups|pp_displayfieldname","name|type|options|active|comment|required_on_reg|visible_in_viewprofile|v_users|v_groups|visible_in_posts|p_users|p_groups|p_displayfieldname|visible_in_memberlist|m_users|m_groups|editable_by_user|visible_in_posts_popup|pp_users|pp_groups|pp_displayfieldname","name|type|options|active|comment|required_on_reg|visible_in_viewprofile|v_users|v_groups|visible_in_posts|p_users|p_groups|p_displayfieldname|visible_in_memberlist|m_users|m_groups|editable_by_user|visible_in_posts_popup|pp_users|pp_groups|pp_displayfieldname",....)  
#  
#  Here are all types with their possible type-specific options. If options contain multiple entries, separated by ^  
#  - text       limit_len^width^is_numberic^default_value^allow_ubbc  
#  - text_multi     limit_len^rows^cols^allow_ubbc  
#  - select     option1^option2^option3... (first option is default)  
#  - radiobuttons   option1^option2^option3... (first option is default)  
#  - spacer     br_or_hr^visible_in_editprofile  
#  - checkbox       -  
#  - date       -  
#  - emial      -  
#  - url        -  
#  - image      width^height^allowed_extensions  
#  
#  required_on_reg can have value 0 (disabled), 1 (required on registration) and 2 (not req. but display on reg. page anyway)  
#  editable_by_user can have value 0 (will only show on the "admin edits" page), 1 ("edit profile" page), 2 ("contact information" page), 3 ("Options" page) and 4 ("PM Preferences" page)  
#  allowed_extensions is a space-seperated list of file extensions, example: "jpg jpeg gif bmp png"  
#  v_groups, p_groups, m_groups, pp_groups format: "Administrator" or "Moderator" or "Global Moderator" or NoPost{...} or Post{...}  
#  
# NOTE: use prefix "ext_" in sub-, variable- and formnames to prevent conflicts with other mods  
#  
# easy mod integration: use &ext_get($username,"fieldname") go get user's field value  
#  
###############################################################################  
   
&LoadLanguage("ExtendedProfiles");  $extendedprofilespmver = 'YaBB 2.6.12 $Revision: 1651 $'; 
  if ( $action eq 'detailedversion' ) { return 1; }
   
$ext_spacer_hr = qq~<hr size="1" width="100%" class="hr" />~;  LoadLanguage('ExtendedProfiles'); 
$ext_spacer_br = qq~<br />~;  
  $ext_spacer_hr        = q~<hr class="hr" />~;
  $ext_spacer_br        = q~<br />~;
$ext_max_email_length = 60; $ext_max_email_length = 60;
$ext_max_url_length = 100; $ext_max_url_length   = 100;
$ext_max_image_length = 100; $ext_max_image_length = 100;
   
my %field; my %field;
   
# outputs the value of a user's extended profile field # outputs the value of a user's extended profile field
## USAGE: $value = ext_get("admin","my_custom_fieldname"); ## USAGE: $value = ext_get("admin","my_custom_fieldname");
##  or    $value_raw = ext_get("admin","my_custom_fieldname",1); ##  or    $value_raw = ext_get("admin","my_custom_fieldname",1);
## pass the third argument if you want to get the raw content e.g. an unformated date ## pass the third argument if you want to get the raw content e.g. an unformatted date
sub ext_get { sub ext_get {
   my ($pusername, $fieldname, $no_parse, @ext_profile, @options, $id, $value, $width, $height, @allowed_extensions, $extension, $match) = (shift, shift, shift);     my ( 
   &ext_get_profile($pusername);         $pusername, $fieldname, $no_parse,           @ext_profile, 
   $id = &ext_get_field_id($fieldname);         @options,   $field,     $id,                 $value, 
   $value = ${$uid.$pusername}{'ext_'.$id};         $width,     $height,    @allowed_extensions, $extension, 
   if ($no_parse eq "" || $no_parse == 0) {         $match 
       &ext_get_field($id);     ) = ( shift, shift, shift ); 
       if ($field{'type'} eq "text") {     ext_get_profile($pusername); 
           @options = split(/\^/,$field{'options'});     $id    = ext_get_field_id($fieldname); 
           if ($options[3] ne "" && $value eq "") { $value = $options[3]; }     $value = ${ $uid . $pusername }{ 'ext_' . $id }; 
           if ($options[4] == 1) { $value = &ext_parse_ubbc($value, $pusername); }     if ( $no_parse eq q{} || $no_parse == 0 ) { 
         $field = ext_get_field($id);
       } elsif ($field{'type'} eq "text_multi" && $value ne "") {        if ( $field{'type'} eq 'text' ) {
           @options = split(/\^/,$field{'options'});             @options = split /\^/xsm, $field{'options'}; 
           if ($options[3] == 1) { $value = &ext_parse_ubbc($value, $pusername); }            if ( $options[3] ne q{} && $value eq q{} ) { $value = $options[3]; }
             if ( $options[4] == 1 ) {
       } elsif ($field{'type'} eq "select") {                 $value = ext_parse_ubbc( $value, $pusername ); 
           @options = split(/\^/,$field{'options'});             } 
           if ($value > $#options || $value eq "") { $value = 0; }  
           $value = $options[$value];         } 
         elsif ( $field{'type'} eq 'text_multi' && $value ne q{} ) {
       } elsif ($field{'type'} eq "radiobuttons") {             @options = split /\^/xsm, $field{'options'}; 
           @options = split(/\^/,$field{'options'});             if ( $options[3] == 1 ) { 
           if ($value > $#options) { $value = 0; }                 $value = ext_parse_ubbc( $value, $pusername ); 
           if(!$field{'radiounselect'} && $value eq "") { $value = 0; }            }
           if($value ne "") { $value = $options[$value]; }  
         }
       } elsif ($field{'type'} eq "date" && $value ne "") {        elsif ( $field{'type'} eq 'select' ) {
           $value = &ext_timeformat($value);             @options = split /\^/xsm, $field{'options'}; 
             if ( $value > $#options || $value eq q{} ) { $value = 0; }
       } elsif ($field{'type'} eq "checkbox") {             $value = $options[$value]; 
           if ($value == 1) { $value = $lang_ext{'true'} }  
           else { $value = $lang_ext{'false'} }        }
         elsif ( $field{'type'} eq 'radiobuttons' ) {
       } elsif ($field{'type'} eq "spacer") {             @options = split /\^/xsm, $field{'options'}; 
           @options = split(/\^/,$field{'options'});             if ( $value > $#options ) { $value = 0; } 
           if ($options[0] == 1) { $value = qq~$ext_spacer_br~; }            if ( !$field{'radiounselect'} && $value eq q{} ) { $value = 0; }
           else { $value = qq~$ext_spacer_hr~; }            if ( $value ne q{} ) { $value = $options[$value]; }
   
       } elsif ($field{'type'} eq "url" && $value ne "") {         } 
           if ($value !~ m~\Ahttp://~) { $value = "http://$value"; }         elsif ( $field{'type'} eq 'date' && $value ne q{} ) { 
             @mytime = split /\//xsm, $value;
       } elsif ($field{'type'} eq "image" && $value ne "") {             $mytime = timelocal(0,0,0, $mytime[1],$mytime[0]-1,$mytime[2]); 
           @options = split(/\^/,$field{'options'});             $mytime =  timeformatcal($mytime); 
           if ($options[2] ne "") {             $value = dtonly ($mytime); 
               @allowed_extensions = split(/ /,$options[2]);         } 
               $match = 0;         elsif ( $field{'type'} eq 'checkbox' ) { 
               foreach $extension (@allowed_extensions){             if   ( $value == 1 ) { $value = $lang_ext{'true'} } 
                   if (grep /$extension$/i,$value) { $match = 1; last; }            else                 { $value = $lang_ext{'false'} }
               }  
               if ($match == 0) { return ""; }        }
           }         elsif ( $field{'type'} eq 'spacer' ) { 
           if ($options[0] ne "" && $options[0] != 0) { $width = " width=\"".($options[0]+0)."\""; } else { $width = ""; }             @options = split /\^/xsm, $field{'options'}; 
           if ($options[1] ne "" && $options[1] != 0) { $height = " height=\"".($options[1]+0)."\""; } else { $height = ""; }             if   ( $options[0] == 1 ) { $value = qq~$ext_spacer_br~; } 
           if ($value !~ m~\Ahttp://~) { $value = "http://$value"; }            else                      { $value = qq~$ext_spacer_hr~; }
           $value = qq~<img src="$value" align="top"$width$height alt="" />~;  
       }        }
   }         elsif ( $field{'type'} eq 'url' && $value ne q{} ) { 
             if ( $value !~ m{\Ahttp://}sm ) { $value = "http://$value"; }
   
         }
         elsif ( $field{'type'} eq 'image' && $value ne q{} ) {
             @options = split /\^/xsm, $field{'options'};
             if ( $options[2] ne q{} ) {
                 @allowed_extensions = split /\ /xsm, $options[2];
                 $match = 0;
                 foreach my $extension (@allowed_extensions) {
                     if ( grep { /$extension$/ism } $value ) {
                         $match = 1;
                         last;
                     }
                 }
                 if ( $match == 0 ) { return q{}; }
             }
             if ( $options[0] ne q{} && $options[0] != 0 ) {
                 $width = q~ width="~ . ( $options[0] + 0 ) . q~"~;
             }
             else { $width = q{}; }
             if ( $options[1] ne q{} && $options[1] != 0 ) {
                 $height = q~ height="~ . ( $options[1] + 0 ) . q~"~;
             }
             else { $height = q{}; }
             if ( $value !~ m{\Ahttp://}sm ) { $value = "http://$value"; }
             $value = qq~<img src="$value" class="vtop"$width$height alt=q{} />~;
         }
     }
   
   $value;    return $value;
} }
   
# loads the (extended) profile of a user # loads the (extended) profile of a user
sub ext_get_profile { sub ext_get_profile {
   &LoadUser(shift);     LoadUser(shift); 
     return;
} }
   
# returns an array of the form qw(ext_0 ext_1 ext_2 ...) # returns an array of the form qw(ext_0 ext_1 ext_2 ...)
sub ext_get_fields_array { sub ext_get_fields_array {
   my ($count, @result) = (0);    my ( $count, @result ) = (0);
   foreach (@ext_prof_fields) {    foreach (@ext_prof_fields) {
       push(@result, "ext_$count");         push @result, "ext_$count"; 
       $count++;        $count++;
   }    }
   @result;    return @result;
} }
   
# returns the id of a field through the fieldname # returns the id of a field through the fieldname
sub ext_get_field_id { sub ext_get_field_id {
   my ($fieldname, $count, $id, $current, $currentname, $dummy) = (shift, 0);     my ( $fieldname, $count, $id, $current, $currentname, $dummy ) = 
   foreach $current (@ext_prof_fields) {       ( shift, 0 ); 
       ($currentname, $dummy) = split(/\|/, $current);     foreach my $current (@ext_prof_fields) { 
       if ($currentname eq $fieldname) { $id = $count; last; }         ( $currentname, $dummy ) = split /\|/xsm, $current; 
       $count++;         if ( $currentname eq $fieldname ) { $id = $count; last; } 
   }         $count++; 
   $id;     } 
     return $id;
} }
   
# returns all settings of a specific field # returns all settings of a specific field
sub ext_get_field { sub ext_get_field {
   $field{'id'} = shift;    $field{'id'} = shift;
   
   ($field{'name'},     ( 
    $field{'type'},        $field{'name'},                   $field{'type'},
    $field{'options'},         $field{'options'},                $field{'active'}, 
    $field{'active'},         $field{'comment'},                $field{'required_on_reg'}, 
    $field{'comment'},         $field{'visible_in_viewprofile'}, $field{'v_users'}, 
    $field{'required_on_reg'},         $field{'v_groups'},               $field{'visible_in_posts'}, 
    $field{'visible_in_viewprofile'},         $field{'p_users'},                $field{'p_groups'}, 
    $field{'v_users'},         $field{'p_displayfieldname'},     $field{'visible_in_memberlist'}, 
    $field{'v_groups'},         $field{'m_users'},                $field{'m_groups'}, 
    $field{'visible_in_posts'},         $field{'editable_by_user'},       $field{'visible_in_posts_popup'}, 
    $field{'p_users'},         $field{'pp_users'},               $field{'pp_groups'}, 
    $field{'p_groups'},         $field{'pp_displayfieldname'},    $field{'radiounselect'}, 
    $field{'p_displayfieldname'},         undef 
    $field{'visible_in_memberlist'},     ) = split /\|/xsm, $ext_prof_fields[ $field{'id'} ]; 
    $field{'m_users'},     return; 
    $field{'m_groups'},  
    $field{'editable_by_user'},  
    $field{'visible_in_posts_popup'},  
    $field{'pp_users'},  
    $field{'pp_groups'},  
    $field{'pp_displayfieldname'},  
    $field{'radiounselect'},  
    undef) = split(/\|/, $ext_prof_fields[$field{'id'}]);  
}  
   
# formats a MM/DD/YYYY string to the user's prefered format, ignores time completely!  
sub ext_timeformat {  
   my ($mytimeselected,$oldformat,$newformat,$mytimeformat,$newday,$newday2,$newmonth,$newmonth2,$newyear,$newshortyear,$oldmonth,$oldday,$oldyear,$newweekday,$newyearday,$newweek,$dummy,$usefullmonth);  
   
   if (${$uid.$username}{'timeselect'} > 0) { $mytimeselected = ${$uid.$username}{'timeselect'}; } else { $mytimeselected = $timeselected; }  
   
   $oldformat = shift;  
   if ($oldformat eq '' || $oldformat eq "\n") { return $oldformat; }  
   
   $oldmonth = substr($oldformat,0,2);  
   $oldday = substr($oldformat,3,2);  
   $oldyear = substr($oldformat,6,4);  
   
   if ($oldformat ne '') {  
       $newday = $oldday+0;  
       $newmonth = $oldmonth+0;  
       $newyear = $oldyear+0;  
       $newshortyear = substr($newyear,2,2);  
       if ($newmonth < 10) { $newmonth = "0$newmonth"; }  
       if ($newday < 10 && $mytimeselected != 4) { $newday = "0$newday"; }  
   
       if ($mytimeselected == 1) {  
           qq~$newmonth/$newday/$newshortyear~;  
   
       } elsif ($mytimeselected == 2) {  
           qq~$newday.$newmonth.$newshortyear~;  
   
       } elsif ($mytimeselected == 3) {  
           qq~$newday.$newmonth.$newyear~;  
   
       } elsif ($mytimeselected == 4 || $mytimeselected == 8 ) {  
           $newmonth--;  
           $newmonth2 = $months[$newmonth];  
           if( $newday > 10 && $newday < 20 ) { $newday2 = "<sup>$timetxt{'4'}</sup>"; }  
           elsif( $newday % 10 == 1 ) { $newday2 = "<sup>$timetxt{'1'}</sup>"; }  
           elsif( $newday % 10 == 2 ) { $newday2 = "<sup>$timetxt{'2'}</sup>"; }  
           elsif( $newday % 10 == 3 ) { $newday2 = "<sup>$timetxt{'3'}</sup>"; }  
           else{ $newday2 = "<sup>$timetxt{'4'}</sup>"; }  
           qq~$newmonth2 $newday$newday2, $newyear~;  
   
       } elsif ($mytimeselected == 5) {  
           qq~$newmonth/$newday/$newshortyear~;  
   
       } elsif ($mytimeselected == 6) {  
           $newmonth2 = $months[$newmonth-1];  
           qq~$newday. $newmonth2 $newyear~;  
   
       } elsif ($mytimeselected == 7) {  
           ($dummy,$dummy,$dummy,$dummy,$dummy,$dummy,$newweekday,$newyearday,$dummy) = gmtime($oldformat);  
           $newweek = int(( $newyearday + 1 - $newweekday ) / 7 )+1;  
   
           $mytimeformat = ${$uid.$username}{'timeformat'};  
           if ($mytimeformat =~ m/MM/) {$usefullmonth = 1;}  
           $mytimeformat =~ s/(?:\s)*\@(?:\s)*//g;  
           $mytimeformat =~ s/HH(?:\s)?//g;  
           $mytimeformat =~ s/mm(?:\s)?//g;  
           $mytimeformat =~ s/ss(?:\s)?//g;  
           $mytimeformat =~ s/://g;  
           $mytimeformat =~ s/ww(?:\s)?//g;  
           $mytimeformat =~ s/(.*?)(?:\s)*$/$1/g;  
   
           if ($mytimeformat =~ m/\+/) {  
               if( $newday > 10 && $newday < 20 ) { $dayext = "<sup>$timetxt{'4'}</sup>"; }  
               elsif( $newday % 10 == 1 ) { $dayext = "<sup>$timetxt{'1'}</sup>"; }  
               elsif( $newday % 10 == 2 ) { $dayext = "<sup>$timetxt{'2'}</sup>"; }  
               elsif( $newday % 10 == 3 ) { $dayext = "<sup>$timetxt{'3'}</sup>"; }  
               else { $dayext = "<sup>$timetxt{'4'}</sup>"; }  
           }  
           $mytimeformat =~ s/YYYY/$newyear/g;  
           $mytimeformat =~ s/YY/$newshortyear/g;  
           $mytimeformat =~ s/DD/$newday/g;  
           $mytimeformat =~ s/D/$newday/g;  
           $mytimeformat =~ s/\+/$dayext/g;  
           if ($usefullmonth == 1){  
               $mytimeformat =~ s/MM/$months[$newmonth-1]/g;  
           } else {  
               $mytimeformat =~ s/M/$newmonth/g;  
           }  
   
           $mytimeformat =~ s/\*//g;  
           $mytimeformat;  
       }  
   } else { ''; }  
} }
   
# returns whenever the current user is allowed to view a field or not # returns whenever the current user is allowed to view a field or not
sub ext_has_access { sub ext_has_access {
   my ($allowed_users, $allowed_groups, $usergroup, $useraddgroup, $postcount, $groupid) = (shift, shift, 0, ${$uid.$username}{'position'}, ${$uid.$username}{'addgroups'}, ${$uid.$username}{'postcount'}, undef);     my ( 
         $allowed_users, $allowed_groups, $access,  $usergroup,
   if ($allowed_users ne "" || $allowed_groups ne "") {         $useraddgroup,  $postcount,      $user,    @users, 
       foreach (split(/,/, $allowed_users)) { return 1 if $_ eq $username; }         $group,         @groups,         $groupid, $postamount 
       )
       = (
         shift, shift, 0,
         ${ $uid . $username }{'position'},
         ${ $uid . $username }{'addgroups'},
         ${ $uid . $username }{'postcount'}, undef,
       );
   
     if ( ( $allowed_users ne q{} ) || ( $allowed_groups ne q{} ) ) {
         if ( $allowed_users ne q{} ) {
             @users = split /\,/xsm, $allowed_users;
             foreach my $user (@users) {
                 if ( $user eq $username ) { $access = 1; return $access; }
             }
         }
         if ( $allowed_groups ne q{} ) {
   
  # generate list of allowed groups
  # example: @groups = ('Administrator', 'Moderator', 'Global Moderator', 'Post{-1}', 'NoPost{1}');
             @groups = split /\s*\,\s*/xsm, $allowed_groups;
             for my $group (@groups) {
   
                 # check if user is in one of these groups
             if (   $group eq 'Administrator' 
                 || $group eq 'Moderator' 
                 || $group eq 'Mid Moderator' 
                 || $group eq 'Global Moderator' )
                 {
                     if ( $group eq $usergroup ) { $access = 1; return $access; }
                 }
                 elsif ( $group =~ m/^NoPost\{(\d+)}$/sm ) {
   
                     # check if user is on a post-independent group
                     $groupid = $1;
   
                     # check if group exists at all
                     if ( exists $NoPost{$groupid} && $groupid ne q{} ) {
   
                        # check if group id is in user position or addgroup field
                         if ( $usergroup eq $groupid ) {
                             $access = 1;
                             return $access;
                         }
                         foreach my $group ( split /,/xsm, $useraddgroup ) {
                             if ( $group eq $groupid ) {
                                 $access = 1;
                                 return $access;
                             }
                         }
                     }
                 }
                 elsif ( $group =~ m/^Post\{(\d+)}$/sm ) {
   
                     # check if user is in one of the post-depending groups...
                     $groupid = $1;
                     foreach my $postamount ( reverse sort { $a <=> $b } keys %Post ) {
                         if ( $postcount > $postamount ) {
   
                             # found the group the user is in
                             if ( $postamount eq $groupid ) {
                                 $access = 1;
                                 return $access;
                             }
                         }
                     }
                 }
             }
         }
     }
     else { $access = 1; }
   
       # example list of allowed groups:     return $access; 
       # ('Administrator', 'Moderator', 'Global Moderator', 'Post{-1}', 'NoPost{1}')  
       foreach my $group (split(/\s*,\s*/, $allowed_groups)) {  
           # check if user is in one of these groups  
           if ($group eq "Administrator" || $group eq "Moderator" || $group eq "Global Moderator") {  
               if ($usergroup eq $group) { return 1; }  
   
           # check if user is on a post-independent group  
           } elsif ($group =~ m~^NoPost{(\d+)}$~) {  
               $groupid = $1;  
               # check if group exists at all  
               if ($groupid ne "" && exists $NoPost{$groupid}) {  
                   # check if group id is in user position or addgroup field  
                   if ($usergroup eq $groupid) { return 1; }  
                   foreach (split(/,/,$useraddgroup)) {  
                       if ($_ eq $groupid) { return 1; }  
                   }  
               }  
   
           # check if user is in one of the post-depending groups...  
           } elsif ($group =~ m~^Post{(\d+)}$~) {  
               $groupid = $1;  
               foreach (sort { $b <=> $a } keys %Post) {  
                   if ($postcount > $_) {  
                       # found the group the user is in  
                       if ($_ eq $groupid) { return 1; }  
                   }  
               }  
           }  
       }  
       return 0;  
   }  
   return 1;  
} }
   
# applies UBBC code to a string # applies UBBC code to a string
sub ext_parse_ubbc { sub ext_parse_ubbc {
   my ($source, $temp);     my ( $source, $displayname ) = @_; 
   ($source, $displayname, $temp) = ($_[0], $_[1], $message);     my $temp = $message; 
   $message = $source;    $message = $source;
   require "$sourcedir/YaBBC.pl";     require Sources::YaBBC; 
   &DoUBBC;     $displayname = $pusername;    # must be set for /me tag 
   &ToChars($message);     DoUBBC(); 
   $source = $message;     ToChars($message); 
   $message = $temp;     $source  = $message; 
   $source;     $message = $temp; 
     return $source;
} }
   
# returns the output for the viewprofile page # returns the output for the viewprofile page
sub ext_viewprofile { sub ext_viewprofile {
   my ($pusername, @ext_profile, $id, $output, $fieldname, @options, $value, $previous, $count, $last_field_id, $pre_output) = (shift);     my ( 
         $pusername, @ext_profile, $field,         $id,
   if ($#ext_prof_order > 0) { $last_field_id = &ext_get_field_id($ext_prof_order[$#ext_prof_order]); }         $output,    $fieldname,   @options,       $value, 
         $previous,  $count,       $last_field_id, $pre_output
   foreach $fieldname (@ext_prof_order) {     ) = (shift); 
       $id = &ext_get_field_id($fieldname);  
       &ext_get_field($id);     if ( $#ext_prof_order > 0 ) { 
       $value = &ext_get($pusername,$fieldname);         $last_field_id = ext_get_field_id( $ext_prof_order[-1] ); 
     }
       # make sure the field is visible and the user allowed to view the current field  
       if ($field{'visible_in_viewprofile'} == 1 && $field{'active'} == 1 && &ext_has_access($field{'v_users'},$field{'v_groups'})) {    foreach my $fieldname (@ext_prof_order) {
           if ($output eq "" && $previous ne 1) {         $id = ext_get_field_id($fieldname); 
               $pre_output = qq~         ext_get_field($id); 
   <tr>         $value = ext_get( $pusername, $fieldname ); 
       <td class="windowbg2" align="left" valign="top">~;  
               $previous = 1;  # make sure the field is visible and the user allowed to view the current field 
           }         if (   $field{'visible_in_viewprofile'} == 1 
           # format the output dependend of the field type             && $field{'active'} == 1 
           if (($field{'type'} eq "text" && $value ne "") ||             && ext_has_access( $field{'v_users'}, $field{'v_groups'} ) ) 
               ($field{'type'} eq "text_multi" && $value ne "") ||         { 
               ($field{'type'} eq "select" && $value ne " ") ||             if ( $output eq q{} && $previous != 1 ) { 
               ($field{'type'} eq "radiobuttons" && $value ne "") ||                 $pre_output = $ext_pre_output; 
               ($field{'type'} eq "date" && $value ne "") ||                 $previous   = 1; 
               $field{'type'} eq "checkbox") {             } 
               $output .= qq~  
           <div style="float: left; width: 30%; padding-top: 5px;  padding-bottom: 5px;">             # format the output dependend of the field type 
           <b>$field{'name'}:</b>             if (   ( $field{'type'} eq 'text' && $value ne q{} ) 
           </div>                 || ( $field{'type'} eq 'text_multi'   && $value ne q{} ) 
           <div style="float: left; width: 70%; padding-top: 5px;  padding-bottom: 5px;">                 || ( $field{'type'} eq 'select'       && $value ne q{ } ) 
           $value&nbsp;                 || ( $field{'type'} eq 'radiobuttons' && $value ne q{} ) 
           </div>~;                 || ( $field{'type'} eq 'date'         && $value ne q{} ) 
               $previous = 0;                 || $field{'type'} eq 'checkbox' ) 
             {
           } elsif ($field{'type'} eq "spacer") {                 $output .= qq~ 
               # only print spacer if the previous entry was no spacer of the same type and if this is not the last entry             <div class="ext_lft"> 
               if (($previous eq 0 || $field{'comment'} ne "") && $id ne $last_field_id) {             <b>$field{'name'}:</b> 
                   if ($value eq $ext_spacer_br) {             </div> 
                       $output .= qq~             <div class="ext_rgt"> 
           <div style="float: left; width: 100%; padding-top: 5px;  padding-bottom: 5px;">             $value&nbsp; 
           $ext_spacer_br             </div>~; 
           </div>~;                 $previous = 0; 
                       $previous = 0;  
                   } else {             } 
                       $output .= qq~             elsif ( $field{'type'} eq 'spacer' ) { 
       </td>  
   </tr>  # only print spacer if the previous entry was no spacer of the same type and if this is not the last entry 
   <tr>~;                 if ( ( $previous == 0 || $field{'comment'} ne q{} ) 
                       if ($field{'comment'} ne "") {                     && $id ne $last_field_id ) 
                           $output .= qq~                 { 
       <td class="catbg" align="left">                     if ( $value eq $ext_spacer_br ) { 
           <img src="$imagesdir/profile.gif" alt="" border="0" style="vertical-align: middle;" />&nbsp;                         $output .= qq~ 
           <span class="text1"><b>$field{'comment'}</b></span>             <div class="ext_100"> 
       </td>             $ext_spacer_br 
   </tr>             </div>~; 
   <tr>                         $previous = 0; 
       <td class="windowbg2" align="left" valign="top">~;                     } 
                       } else {                    else {
                           $output .= qq~                         $output .= $ext_output_a; 
       <td class="windowbg2" align="left" valign="top">~;                         if ( $field{'comment'} ne q{} ) { 
                       }                             $output .= $ext_output_c; 
                       $previous = 1;                         } 
                   }                         else { 
               }                             $output .= $ext_output_b; 
                         }
           } elsif ($field{'type'} eq "email" && $value ne "") {                         $previous = 1; 
               $output .= qq~                     } 
           <div style="float: left; width: 30%; padding-top: 5px;  padding-bottom: 5px;">                 } 
           <b>$field{'name'}:</b>  
           </div>             } 
           <div style="float: left; width: 70%; padding-top: 5px;  padding-bottom: 5px;">             elsif ( $field{'type'} eq 'email' && $value ne q{} ) { 
           ~ . &enc_eMail($img_txt{'69'},$value,'','') . qq~                $output .= qq~
           </div>~;             <div class="ext_lft"> 
               $previous = 0;             <b>$field{'name'}:</b> 
             </div>
           } elsif ($field{'type'} eq "url" && $value ne "") {             <div class="ext_rgt"> 
               $output .= qq~             ~ . enc_eMail( $img_txt{'69'}, $value, q{}, q{} ) . q~ 
           <div style="float: left; width: 30%; padding-top: 5px;  padding-bottom: 5px;">             </div>~; 
           <b>$field{'name'}:</b>                 $previous = 0; 
           </div>  
           <div style="float: left; width: 70%; padding-top: 5px;  padding-bottom: 5px;">             } 
           <a href="$value" target="_blank">$value</a>             elsif ( $field{'type'} eq 'url' && $value ne q{} ) { 
           </div>~;                 $output .= qq~ 
               $previous = 0;             <div class="ext_lft"> 
             <b>$field{'name'}:</b>
           } elsif ($field{'type'} eq "image" && $value ne "") {             </div> 
               $output .= qq~             <div class="ext_rgt"> 
           <div style="float: left; width: 30%; padding-top: 5px;  padding-bottom: 5px;">             <a href="$value" target="_blank">$value</a> 
           <b>$field{'name'}:</b>             </div>~; 
           </div>                 $previous = 0; 
           <div style="float: left; width: 70%; padding-top: 5px;  padding-bottom: 5px;">  
           $value             } 
           </div>~;             elsif ( $field{'type'} eq 'image' && $value ne q{} ) { 
               $previous = 0;                 $output .= qq~ 
           }             <div class="ext_lft"> 
       }             <b>$field{'name'}:</b> 
   }             </div> 
   # only add spacer if there there is at least one field displayed             <div class="ext_rgt"> 
   if ($output ne "") {             $value 
       $output = $pre_output . $output . qq~             </div>~; 
       </td>                 $previous = 0; 
   </tr>~;             } 
   }        }
   $output;     } 
   
     # only add spacer if there there is at least one field displayed
     if ( $output ne q{} ) {
         $output = $pre_output . $output . q~
         </td>
     </tr>~;
     }
     return $output;
} }
   
# returns the output for the post page # returns the output for the post page
sub ext_viewinposts { sub ext_viewinposts {
   my ($pusername, $popup, @ext_profile, $id, $output, $fieldname, @options, $value, $previous, $pre_output, $visible, $users, $groups, $displayfieldname) = (shift, shift);     my ( 
         $pusername, $popup,    @ext_profile, $field,
   if ($pusername ne 'Guest') {         $id,        $output,   $fieldname,   @options, 
       foreach $fieldname (@ext_prof_order) {         $value,     $previous, $pre_output,  $visible, 
           $id = &ext_get_field_id($fieldname);         $users,     $groups,   $displayfieldname 
           &ext_get_field($id);     ) = ( shift, shift ); 
           $value = &ext_get($pusername,$fieldname);  
     if ( $pusername ne 'Guest' ) {
           if ($popup ne "") {        foreach my $fieldname (@ext_prof_order) {
               $visible = $field{'visible_in_posts_popup'};             $id    = ext_get_field_id($fieldname); 
               $users = $field{'pp_users'};             $field = ext_get_field($id); 
               $groups = $field{'pp_groups'};             $value = ext_get( $pusername, $fieldname ); 
               $displayfieldname = $field{'pp_displayfieldname'};  
           } else {            if ( $popup ne q{} ) {
               $visible = $field{'visible_in_posts'};                 $visible          = $field{'visible_in_posts_popup'}; 
               $users = $field{'p_users'};                 $users            = $field{'pp_users'}; 
               $groups = $field{'p_groups'};                 $groups           = $field{'pp_groups'}; 
               $displayfieldname = $field{'p_displayfieldname'};                 $displayfieldname = $field{'pp_displayfieldname'}; 
           }            }
             else {
           # make sure the field is visible and the user allowed to view the current field                 $visible          = $field{'visible_in_posts'}; 
           if ($visible == 1 && $field{'active'} == 1 && &ext_has_access($users,$groups)) {                 $users            = $field{'p_users'}; 
               if ($displayfieldname == 1) { $displayedfieldname = "$field{'name'}: "; } else { $displayedfieldname = ""; }                 $groups           = $field{'p_groups'}; 
               if ($output eq "") { $output = qq~$ext_spacer_br\n~; }                 $displayfieldname = $field{'p_displayfieldname'}; 
               # format the output dependend of the field type             } 
               if (($field{'type'} eq "text" && $value ne "") ||  
                   ($field{'type'} eq "text_multi" && $value ne "") ||  # make sure the field is visible and the user allowed to view the current field 
                   ($field{'type'} eq "select" && $value ne " ") ||             if (   $visible == 1 
                   ($field{'type'} eq "radiobuttons" && $value ne "") ||                 && $field{'active'} == 1 
                   ($field{'type'} eq "date" && $value ne "") ||                 && ext_has_access( $users, $groups ) ) 
                   $field{'type'} eq "checkbox") {            {
                   $output .= qq~$displayedfieldname$value<br />\n~;                 if ( $displayfieldname == 1 ) { 
                   $previous = "";                     $displayedfieldname = "$field{'name'}: "; 
               } elsif ($field{'type'} eq "spacer") {                 } 
                   # those tags are required to keep the doc XHTML 1.0 valid                 else { $displayedfieldname = q{}; } 
                   if ($previous ne "</small>$value<small>") {                 if ( $output eq q{} ) { $output = qq~$ext_spacer_br\n~; } 
                       $previous = qq~</small>$value<small>~;  
                       $output .= $previous;                 # format the output depending on the field type 
                   }                 if (   ( $field{'type'} eq 'text' && $value ne q{} ) 
               } elsif ($field{'type'} eq "email" && $value ne "") {                     || ( $field{'type'} eq 'text_multi'   && $value ne q{} ) 
                   $output .= $displayedfieldname . &enc_eMail($img_txt{'69'},$value,'','') . qq~<br />\n~;                     || ( $field{'type'} eq 'select'       && $value ne q{ } ) 
                   $previous = "";                     || ( $field{'type'} eq 'radiobuttons' && $value ne q{} ) 
               } elsif ($field{'type'} eq "url" && $value ne "") {                     || ( $field{'type'} eq 'date'         && $value ne q{} ) 
                   $output .= qq~$displayedfieldname<a href="$value" target="_blank">$value</a><br />\n~;                     || $field{'type'} eq 'checkbox' ) 
                   $previous = "";                 { 
               } elsif ($field{'type'} eq "image" && $value ne "") {                     $output .= qq~$displayedfieldname$value<br />\n~; 
                   $output .= qq~$displayedfieldname$value<br />\n~;                     $previous = q{}; 
                   $previous = "";                 } 
               }                 elsif ( $field{'type'} eq 'spacer' ) { 
           }  
       }                     # those tags are required to keep the doc XHTML 1.0 valid 
   }                     if ( $previous ne "</small>$value<small>" ) { 
   # check if there we have any output (except spacers) at all. If so, return empty output                         $previous = qq~</small>$value<small>~; 
   $pre_output = $output;                         $output .= $previous; 
   $pre_output =~ s~(?:\</small>(?:(?:$ext_spacer_hr)|(?:$ext_spacer_br))<small>)|\n|(?:\<br(?: /)?>)~~ig;                     } 
   if ($pre_output eq "") { $output = ""; }                }
                 elsif ( $field{'type'} eq 'email' && $value ne q{} ) {
                     $output .=
                         $displayedfieldname
                       . enc_eMail( $img_txt{'69'}, $value, q{}, q{} )
                       . qq~<br />\n~;
                     $previous = q{};
                 }
                 elsif ( $field{'type'} eq 'url' && $value ne q{} ) {
                     $output .=
  qq~$displayedfieldname<a href="$value" target="_blank">$value</a><br />\n~;
                     $previous = q{};
                 }
                 elsif ( $field{'type'} eq 'image' && $value ne q{} ) {
                     $output .= qq~$displayedfieldname$value<br />\n~;
                     $previous = q{};
                 }
             }
         }
     }
   
  # check if there we have any output (except spacers) at all. If so, return empty output
     $pre_output = $output;
     $pre_output =~
  s/(?:\<\/small>(?:(?:$ext_spacer_hr)|(?:$ext_spacer_br))<small>)|\n|(?:\<br(?: \/)?>)//igsm;
     if ( $pre_output eq q{} ) { $output = q{}; }
   
   $output;    return $output;
} }
   
{ {
   # we need a "static" variable to produce unique element ids  
   my $ext_usercount = 0;  
   # returns the output for the post page (popup box)  
   sub ext_viewinposts_popup {  
       my ($pusername,$link,$output) = (shift,shift);  
       $output = &ext_viewinposts($pusername, "popup");  
       $output =~ s~^$ext_spacer_br\n~~ig;  
       if ($output ne "") {  
           $link =~ s~<a ~<a onmouseover="document.getElementById('ext_$ext_usercount').style.visibility = 'visible'" onmouseout="document.getElementById('ext_$ext_usercount').style.visibility = 'hidden'" ~ig;  
           $output = qq~$link<div id="ext_$ext_usercount" class="code" style="visibility:hidden; position:absolute; z-index:1; width:auto;">$output</div>~;  
           $ext_usercount++;  
       } else {  
           $output = $link;  
       }  
   
       $output;     # we need a "static" variable to produce unique element ids 
   }     my $ext_usercount = 0; 
   
     # returns the output for the post page (popup box)
     sub ext_viewinposts_popup {
         my ( $pusername, $link, $output ) = ( shift, shift );
         $output = ext_viewinposts( $pusername, 'popup' );
         $output =~ s/^$ext_spacer_br\n//igxsm;
         if ( $output ne q{} ) {
             $link =~
  s/<a /<a onmouseover="document.getElementById('ext_$ext_usercount').style.visibility = 'visible'" onmouseout="document.getElementById('ext_$ext_usercount').style.visibility = 'hidden'" /igsm;
             $output =
  qq~$link<div id="ext_$ext_usercount" class="code" style="visibility:hidden; position:absolute; z-index:1; width:auto;">$output</div>~;
             $ext_usercount++;
         }
         else {
             $output = $link;
         }
   
         return $output;
     }
} }
   
# returns the output for the table header in memberlist # returns the output for the table header in memberlist
sub ext_memberlist_tableheader { sub ext_memberlist_tableheader {
   my ($output, $fieldname);     my ( $output, $fieldname ); 
   
   foreach $fieldname (@ext_prof_order) {    foreach my $fieldname (@ext_prof_order) {
       &ext_get_field(&ext_get_field_id($fieldname));         $field = ext_get_field( ext_get_field_id($fieldname) ); 
   
       # make sure the field is visible and the user allowed to view the current field # make sure the field is visible and the user allowed to view the current field
       if ($field{'visible_in_memberlist'} == 1 && $field{'active'} == 1 && &ext_has_access($field{'m_users'},$field{'m_groups'})) {         if (   $field{'visible_in_memberlist'} == 1 
           $output .= qq~<td class="catbg" align="center">$field{'name'}</td>\n~;             && $field{'active'} == 1 
       }             && ext_has_access( $field{'m_users'}, $field{'m_groups'} ) ) 
   }         { 
             $output .= $ext_memberlist_tableheader;
             $output =~ s/{yabb ext_fieldname}/$field{'name'}/sm;
         }
     }
   
   $output;    return $output;
} }
   
# returns the number of additional fields showed in memberlist # returns the number of additional fields showed in memberlist
sub ext_memberlist_get_headercount { # count the linebreaks to get the number of additional <td>s for the memberlist table  sub ext_memberlist_get_headercount { 
   my ($headers,$headercount) = (shift, 0);  
   $headers =~ s~(\n)~ $headercount++ ~eg;  # count the linebreaks to get the number of additional <td>s for the memberlist table 
   $headercount;     my ( $headers, $headercount ) = ( shift, 0 ); 
     $headers =~ s/(\n)/ $headercount++ /egm;
     return $headercount;
} }
   
# returns the output for the table tds in memberlist # returns the output for the table tds in memberlist
sub ext_memberlist_tds { sub ext_memberlist_tds {
   my ($pusername, $usergroup, @ext_profile, $id, $output, $access, @users, $user, @groups, $group, $fieldname, @options, $count, $color, $value) = (shift, ${$uid.$username}{'position'});     my ( 
         $pusername, $usergroup, @ext_profile, $field,
   $count = 0;         $id,        $output,    $access,      @users, 
   foreach $fieldname (@ext_prof_order) {         $user,      @groups,    $group,       $fieldname, 
       $id = &ext_get_field_id($fieldname);         @options,   $count,     $color,       $value 
       &ext_get_field($id);     ) = ( shift, ${ $uid . $username }{'position'} ); 
       $value = &ext_get($pusername,$fieldname);  
     $count = 0;
       # make sure the field is visible and the user allowed to view the current field     foreach my $fieldname (@ext_prof_order) { 
       if ($field{'visible_in_memberlist'} == 1 && $field{'active'} == 1 && &ext_has_access($field{'m_users'},$field{'m_groups'})) {         $id    = ext_get_field_id($fieldname); 
           $color = $count % 2 == 1 ? "windowbg" : "windowbg2";         $field = ext_get_field($id); 
           #if ($using_yams5 eq "1") {         $value = ext_get( $pusername, $fieldname ); 
           #   $td_attributs = qq~class="windowbg2" style="border-top: #6394BD 1px solid; border-right: #6394BD 1px solid; padding: 2px" bgcolor="#F8F8F8" align="center" valign="middle"~;  
           #} else {  # make sure the field is visible and the user allowed to view the current field 
               $td_attributs = qq~class="$color"~;         if (   $field{'visible_in_memberlist'} == 1 
           #}             && $field{'active'} == 1 
           if ($field{'type'} eq "email") {             && ext_has_access( $field{'m_users'}, $field{'m_groups'} ) == 1 ) 
               if ($value ne "") { $value = &enc_eMail($img_txt{'69'},$value,'',''); }         { 
           } elsif ($field{'type'} eq "url") {             $color = $count % 2 == 1 ? 'windowbg' : 'windowbg2'; 
               if ($value ne "") { $value = qq~<a href="$value" target="_blank">$value</a>~; }  
           }             $td_attributs = qq~class="$color"~; 
           if ($value eq "") { $value .= "&nbsp;"; }  
           $output .= qq~<td $td_attributs>$value</td>\n~;             #} 
           $count++;             if ( $field{'type'} eq 'email' ) { 
       }                 if ( $value ne q{} ) { 
   }                     $value = enc_eMail( $img_txt{'69'}, $value, q{}, q{} ); 
                 }
   $output;             } 
             elsif ( $field{'type'} eq 'url' ) {
                 if ( $value ne q{} ) {
                     $value = qq~<a href="$value" target="_blank">$value</a>~;
                 }
             }
             if ( $value eq q{} ) { $value .= '&nbsp;'; }
             $output .= $ext_memberlist_td;
             $output =~ s/{yabb ext_td_attributs}/$td_attributs/sm;
             $output =~ s/{yabb ext_value}/$value/sm;
             $count++;
         }
     }
     return $output;</