###############################################################################
# ExtendedProfiles.pl 2.1 #
###############################################################################
# YaBB: Yet another Bulletin Board #
# Open-Source Community Software for Webmasters #
# Version: YaBB 2 #
# Released: December 27, 2004 #
# Distributed by: http://www.yabbforum.com #
# =========================================================================== #
# Copyright (c) 2000-2005 YaBB (www.yabbforum.com) - All Rights Reserved. #
# Software by: The YaBB Development Team #
# with assistance from the YaBB community. #
# Sponsored by: Xnull Internet Media, Inc. - http://www.ximinc.com #
# Your source for web hosting, web design, and domains. #
###############################################################################
# This file is part of the Extended Profiles Mod which has been created by #
# Michael Prager. Last modification: 27.12.05 #
###############################################################################
# file formats used by this code:
#
# username.vars - contains the additional user profile information. Number is field-id
# -------------
# ...
# 'ext_0',"value"
# 'ext_1',"value"
# 'ext_2',"value"
# ...
#
# extended_profiles_order.txt - 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, seperated 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");
$ext_spacer_hr = qq~
~;
$ext_spacer_br = qq~ ~;
$ext_max_email_length = 60;
$ext_max_url_length = 100;
$ext_max_image_length = 100;
# outputs the value of a user's extended profile field
## USAGE: $value = ext_get("admin","my_custom_fieldname");
## 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
sub ext_get {
my ($pusername, $fieldname, $no_parse, @ext_profile, @options, $field, $id, $value, $width, $height, @allowed_extensions, $extension, $match) = (shift, shift, shift);
ext_get_profile($pusername);
$id = ext_get_field_id($fieldname);
$value = ${$uid.$pusername}{'ext_'.$id};
if ($no_parse eq "" || $no_parse == 0) {
$field = ext_get_field($id);
if ($field{'type'} eq "text") {
@options = split(/\^/,$field{'options'});
if ($options[3] ne "" && $value eq "") { $value = $options[3]; }
if ($options[4] == 1) { $value = ext_parse_ubbc($value, $pusername); }
}
elsif ($field{'type'} eq "text_multi" && $value ne "") {
@options = split(/\^/,$field{'options'});
if ($options[3] == 1) { $value = ext_parse_ubbc($value, $pusername); }
}
elsif ($field{'type'} eq "select") {
@options = split(/\^/,$field{'options'});
if ($value > $#options || $value eq "") { $value = 0; }
$value = $options[$value];
}
elsif ($field{'type'} eq "radiobuttons") {
@options = split(/\^/,$field{'options'});
if ($value > $#options || $value eq "") { $value = 0; }
$value = $options[$value];
}
elsif ($field{'type'} eq "date" && $value ne "") {
$value = ext_timeformat($value);
}
elsif ($field{'type'} eq "checkbox") {
if ($value == 1) { $value = $lang_ext{'true'} }
else { $value = $lang_ext{'false'} }
}
elsif ($field{'type'} eq "spacer") {
@options = split(/\^/,$field{'options'});
if ($options[0] == 1) { $value = qq~$ext_spacer_br~; }
else { $value = qq~$ext_spacer_hr~; }
}
# elsif ($field{'type'} eq "email" && $value ne "") { $value = qq~$displayedfieldname$value \n~; }
elsif ($field{'type'} eq "url" && $value ne "") {
if ($value !~ m~\Ahttp://~) { $value = "http://$value"; }
}
elsif ($field{'type'} eq "image" && $value ne "") {
@options = split(/\^/,$field{'options'});
if ($options[2] ne "") {
@allowed_extensions = split(/ /,$options[2]);
$match = 0;
foreach $extension (@allowed_extensions){
if (grep /$extension$/i,$value) { $match = 1; last; }
}
if ($match == 0) { return ""; }
}
if ($options[0] ne "" && $options[0] != 0) { $width = " width=\"".($options[0]+0)."\""; } else { $width = ""; }
if ($options[1] ne "" && $options[1] != 0) { $height = " height=\"".($options[1]+0)."\""; } else { $height = ""; }
if ($value !~ m~\Ahttp://~) { $value = "http://$value"; }
$value = qq~~;
}
}
return $value;
}
# loads the (extended) profile of a user
sub ext_get_profile {
my ($pusername) = (shift);
if (${$uid.$pusername}{'realname'} eq "") {
&LoadUser($pusername);
}
}
# returns all available profile fields
sub ext_get_fields {
my $i;
# only load from file if not already loaded to speed things up
if (!defined @ext_fields) {
fopen(EXT_FILE, "$vardir/extended_profiles_fields.txt") || &fatal_error("$maintxt{'23'} extended_profiles_fields.txt");
@ext_fields = ;
fclose(EXT_FILE);
chomp @ext_fields;
}
return @ext_fields;
}
# returns an array of the form qw(ext_0 ext_1 ext_2 ...)
sub ext_get_fields_array {
my ($count, @result, $line) = (0);
foreach $line (ext_get_fields) {
push(@result,"ext_" . $count);
$count++;
}
return @result;
}
# returns a list of all profile fields, in proper order
sub ext_get_field_order {
my $i;
# only load from file if not already loaded to speed things up
if (!defined @ext_field_order) {
fopen(EXT_FILE, "$vardir/extended_profiles_order.txt") || &fatal_error("$maintxt{'23'} extended_profiles_order.txt");
@ext_field_order = ;
fclose(EXT_FILE);
chomp @ext_field_order;
}
return @ext_field_order;
}
# returns the id of a field through the fieldname
sub ext_get_field_id {
my ($fieldname, $count, $id, $current, $currentname, $dummy) = (shift, 0);
foreach $current (ext_get_fields) {
($currentname, $dummy) = split(/\|/, $current);
if ($currentname eq $fieldname) { $id = $count; last; }
$count++;
}
return $id;
}
# returns all settings of a specifig field
sub ext_get_field {
my ($id, $field, @fields, $dummy) = (shift);
@fields = ext_get_fields;
$field{'id'} = $id;
($field{'name'},
$field{'type'},
$field{'options'},
$field{'active'},
$field{'comment'},
$field{'required_on_reg'},
$field{'visible_in_viewprofile'},
$field{'v_users'},
$field{'v_groups'},
$field{'visible_in_posts'},
$field{'p_users'},
$field{'p_groups'},
$field{'p_displayfieldname'},
$field{'visible_in_memberlist'},
$field{'m_users'},
$field{'m_groups'},
$field{'editable_by_user'},
$field{'visible_in_posts_popup'},
$field{'pp_users'},
$field{'pp_groups'},
$field{'pp_displayfieldname'},
$dummy) = split(/\|/,$fields[$field{'id'}]);
return $field;
}
# 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) {
$newformat = qq~$newmonth/$newday/$newshortyear~;
return $newformat;
} elsif ($mytimeselected == 2) {
$newformat = qq~$newday.$newmonth.$newshortyear~;
return $newformat;
} elsif ($mytimeselected == 3) {
$newformat = qq~$newday.$newmonth.$newyear~;
return $newformat;
} elsif ($mytimeselected == 4) {
$newmonth--;
$newmonth2 = $months[$newmonth];
if( $newday > 10 && $newday < 20 ) { $newday2 = "$timetxt{'4'}"; }
elsif( $newday % 10 == 1 ) { $newday2 = "$timetxt{'1'}"; }
elsif( $newday % 10 == 2 ) { $newday2 = "$timetxt{'2'}"; }
elsif( $newday % 10 == 3 ) { $newday2 = "$timetxt{'3'}"; }
else{ $newday2 = "$timetxt{'4'}"; }
$newformat = qq~$newmonth2 $newday$newday2, $newyear~;
return $newformat;
} elsif ($mytimeselected == 5) {
$newformat = qq~$newmonth/$newday/$newshortyear~;
return $newformat;
} elsif ($mytimeselected == 6) {
$newmonth2 = $months[$newmonth-1];
$newformat = qq~$newday. $newmonth2 $newyear~;
return $newformat;
} 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 = "$timetxt{'4'}"; }
elsif( $newday % 10 == 1 ) { $dayext = "$timetxt{'1'}"; }
elsif( $newday % 10 == 2 ) { $dayext = "$timetxt{'2'}"; }
elsif( $newday % 10 == 3 ) { $dayext = "$timetxt{'3'}"; }
else { $dayext = "$timetxt{'4'}"; }
}
$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;
return $mytimeformat;
}
} else { return ''; }
}
# returns whenever the current user is allowed to view a field or not
sub ext_has_access {
my ($allowed_users, $allowed_groups, $access, $usergroup, $useraddgroup, $postcount, @useraddgroup, $user, @users, $group, @groups, $groupid, $postamount) = (shift, shift, 0, ${$uid.$username}{'position'}, ${$uid.$username}{'addgroups'}, ${$uid.$username}{'postcount'});
if (($allowed_users ne "") || ($allowed_groups ne "")) {
if ($allowed_users ne "") {
@users = split(/\,/,$allowed_users);
foreach $user (@users) {
if ($user eq $username) { $access = 1; return $access; }
}
}
if ($allowed_groups ne "") {
# generate list of allowed groups
# example: @groups = ('Administrator', 'Moderator', 'Global Moderator', 'Post{-1}', 'NoPost{1}');
@groups = split(/\s*\,\s*/,$allowed_groups);
foreach $group (@groups) {
# check if user is in one of these groups
if ($group eq "Administrator" || $group eq "Moderator" || $group eq "Global Moderator") {
if ($group eq $usergroup) { $access = 1; return $access; }
} elsif($group =~ m~^NoPost{(\d+)}$~) {
# check if user is on a post-independend groups
$groupid = $1;
# check if group exists at all
if (exists $NoPost{$groupid} && $groupid ne "") {
# check if group id is in user position or addgroup field
if ($usergroup eq $groupid) { $access = 1; return $access; }
@useraddgroup = split(/\,/,$useraddgroup);
foreach $group (@useraddgroup) {
if ($group eq $groupid) { $access = 1; return $access; }
}
}
} elsif ($group =~ m~^Post{(\d+)}$~) {
# check if user is in one of the post-depending groups...
$groupid = $1;
foreach $postamount (sort { $b <=> $a } keys %Post) {
if ($postcount > $postamount) {
# found the group the user is in
if ($postamount eq $groupid) { $access = 1; return $access; }
}
}
}
}
}
} else { $access = 1; }
return $access;
}
# applies UBBC code to a string
sub ext_parse_ubbc {
my ($source, $pusername, $bak, $bak2) = (shift, shift, $message, $displayname);
$message = $source;
require "$sourcedir/YaBBC.pl";
$displayname = $pusername; # must be set for /me tag
&DoUBBC;
&ToChars($message);
$source = $message;
$message = $bak;
$displayname = $bak2;
return $source;
}
# returns the output for the viewprofile page
sub ext_viewprofile {
my ($pusername, @ext_profile, $field, $id, $output, $fieldname, @options, $value, $previous, @field_order, $count, $last_field_id, $pre_output) = (shift);
@field_order = ext_get_field_order;
if ($#$field_order > 0) {
$last_field_id = ext_get_field_id($field_order[$#$field_order]);
}
foreach $fieldname (ext_get_field_order) {
$id = ext_get_field_id($fieldname);
$field = ext_get_field($id);
$value = ext_get($pusername,$fieldname);
# 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'}) == 1)) {
if ($output eq "" && $previous ne 1) {
$pre_output = qq~
~;
$previous = 1;
}
# format the output dependend of the field type
if (($field{'type'} eq "text" && $value ne "") ||
($field{'type'} eq "text_multi" && $value ne "") ||
$field{'type'} eq "select" ||
$field{'type'} eq "radiobuttons" ||
($field{'type'} eq "date" && $value ne "") ||
$field{'type'} eq "checkbox") {
$output .= qq~
$field{'name'}:
$value
~;
$previous = 0;
}
elsif ($field{'type'} eq "spacer") {
# only print spacer if the previous entry was no spacer of the same type and if this is not the last entry
if (($previous eq 0 || $field{'comment'} ne "") && $id ne $last_field_id) {
if ($value eq $ext_spacer_br) {
$output .= qq~
~;
$previous = 0;
}
}
}
# only add spacer if there there is at least one field displayed
if ($output ne "") {
$output = $pre_output . $output . qq~
~;
}
return $output;
}
# returns the output for the post page
sub ext_viewinposts {
my ($pusername, $popup, @ext_profile, $field, $id, $output, $fieldname, @options, $value, $previous, $pre_output, $visible, $users, $groups, $displayfieldname) = (shift, shift);
if ($pusername ne 'Guest') {
foreach $fieldname (ext_get_field_order) {
$id = ext_get_field_id($fieldname);
$field = ext_get_field($id);
$value = ext_get($pusername,$fieldname);
if ($popup ne "") {
$visible = $field{'visible_in_posts_popup'};
$users = $field{'pp_users'};
$groups = $field{'pp_groups'};
$displayfieldname = $field{'pp_displayfieldname'};
} else {
$visible = $field{'visible_in_posts'};
$users = $field{'p_users'};
$groups = $field{'p_groups'};
$displayfieldname = $field{'p_displayfieldname'};
}
# make sure the field is visible and the user allowed to view the current field
if (($visible == 1) && ($field{'active'} == 1) && (ext_has_access($users,$groups) == 1)) {
if ($displayfieldname == 1) { $displayedfieldname = "$field{'name'}: "; } else { $displayedfieldname = ""; }
if ($output eq "") { $output = qq~$ext_spacer_br\n~; }
# format the output dependend of the field type
if (($field{'type'} eq "text" && $value ne "") ||
($field{'type'} eq "text_multi" && $value ne "") ||
$field{'type'} eq "select" ||
$field{'type'} eq "radiobuttons" ||
($field{'type'} eq "date" && $value ne "") ||
$field{'type'} eq "checkbox") {
$output .= qq~$displayedfieldname$value \n~;
$previous = "";
}
elsif ($field{'type'} eq "spacer") {
# those tags are required to keep the doc XHTML 1.0 valid
if ($previous ne "$value") {
$previous = qq~$value~;
$output .= $previous;
}
}
elsif ($field{'type'} eq "email" && $value ne "") {
$output .= qq~$displayedfieldname$value \n~;
$previous = "";
}
elsif ($field{'type'} eq "url" && $value ne "") {
$output .= qq~$displayedfieldname$value \n~;
$previous = "";
}
elsif ($field{'type'} eq "image" && $value ne "") {
$output .= qq~$displayedfieldname$value \n~;
$previous = "";
}
}
}
}
# check if there we have any output (except spacers) at all. If so, return empty output
$pre_output = $output;
$pre_output =~ s~(?:\(?:(?:$ext_spacer_hr)|(?:$ext_spacer_br)))|\n|(?:\ )~~ig;
if ($pre_output eq "") { $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~$output~;
$ext_usercount++;
} else {
$output = $link;
}
return $output;
}
}
# returns the output for the table header in memberlist
sub ext_memberlist_tableheader {
my ($field, $output, $fieldname);
foreach $fieldname (ext_get_field_order) {
$field = ext_get_field(ext_get_field_id($fieldname));
# 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'}) == 1)) {
#if ($using_yams5 eq "1") {
# $output .= qq~
$field{'name'}
\n~;
#} else {
$output .= qq~
$field{'name'}
\n~;
#}
}
}
return $output;
}
# returns the number of additional fields showed in memberlist
sub ext_memberlist_get_headercount { # count the linebreaks to get the number of additional
s for the memberlist table
my ($headers,$headercount) = (shift, 0);
$headers =~ s~(\n)~$headercount++~eg;
return $headercount;
}
# returns the output for the table tds in memberlist
sub ext_memberlist_tds {
my ($pusername, $usergroup, @ext_profile, $field, $id, $output, $access, @users, $user, @groups, $group, $fieldname, @options, $count, $color, $value) = (shift, ${$uid.$username}{'position'});
$count = 0;
foreach $fieldname (ext_get_field_order) {
$id = ext_get_field_id($fieldname);
$field = ext_get_field($id);
$value = ext_get($pusername,$fieldname);
# 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'}) == 1)) {
$color = $count % 2 == 1 ? "windowbg" : "windowbg2";
#if ($using_yams5 eq "1") {
# $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 {
$td_attributs = qq~class="$color"~;
#}
if ($field{'type'} eq "email") {
if ($value ne "") { $value = qq~$value~; }
}
elsif ($field{'type'} eq "url") {
if ($value ne "") { $value = qq~$value~; }
}
if ($value eq "") { $value .= " "; }
$output .= qq~
$value
\n~;
$count++;
}
}
return $output;
}
# returns the edit mask of a field (used on registration and edit profile page)
sub ext_gen_editfield {
my ($id, $pusername, @ext_profile, $output, $field, @options, $selected, $count, $required_prefix, $dayormonth, $dayormonthd, $dayormonthm, $value, $template1, $template2) = (shift, shift);
LoadLanguage("Profile");
$field = ext_get_field($id);
# if username is obmitted, we'll generate the code for the registration page
if ($pusername ne "") {
# @ext_profile = ext_get_profile($pusername);
$value = ext_get($pusername,$field{'name'},1);
}
#else {
# if ($field{'required_on_reg'} == 1) { $field{'name'} = "* ".$field{'name'}; }
#}
if ($field{'required_on_reg'} == 1) { $field{'name'} = "* ".$field{'name'}; }
&FromHTML($field{'comment'});
$template1 = qq~
$field{'name'}: $field{'comment'}
~;
$template2 = qq~
\n~;
# format the output dependend on field type
if ($field{'type'} eq "text") {
@options = split(/\^/,$field{'options'});
if ($options[0] ne "") { $options[0] = qq~ maxlength="$options[0]"~; }
if ($options[1] ne "") { $options[1] = qq~ size="$options[1]"~; }
if ($options[3] ne "" && $value eq "") { $options[3] = qq~ value="$options[3]"~; } else { $options[3] = qq~ value="$value"~; }
$output .= $template1 . qq~~ . $template2;
}
elsif ($field{'type'} eq "text_multi") {
@options = split(/\^/,$field{'options'});
if ($options[0] ne "" && $options[0] ne 0) { $field{'options'} = qq~
$lang_ext{'max_chars1'}$options[0]$lang_ext{'max_chars2'}
~; }
else { $field{'options'} = ""; }
if ($options[1] ne "") { $options[1] = qq~ rows="$options[1]"~; } else { $options[1] = qq~ rows="4"~; }
if ($options[2] ne "") { $options[2] = qq~ cols="$options[2]"~; } else { $options[2] = qq~ cols="50"~; }
$value =~ s/ /\n/g;
$output .= $template1 . qq~$field{'options'}~ . $template2;
}
elsif ($field{'type'} eq "select") {
$output .= $template1 . qq~~ . $template2;
}
elsif ($field{'type'} eq "radiobuttons") {
$output .= $template1;
@options = split(/\^/,$field{'options'});
if ($value > $#options || $value eq "") { $value = 0; }
$count = 0;
foreach (@options) {
if ($count == $value) { $selected = qq~ checked="checked"~; } else { $selected = ""; }
$output .= qq~$_\n~;
$count++;
}
$output .= $template2;
}
elsif ($field{'type'} eq "date") {
if ($value !~ /[0-9\/]/) { $value = ""; }
@options = split(/\//,$value);
$dayormonthm = qq~ $profile_txt{'564'} ~;
$dayormonthd = qq~ $profile_txt{'565'} ~;
if ((${$uid.$pusername}{'timeselect'} == 2 || ${$uid.$pusername}{'timeselect'} == 3 || ${$uid.$pusername}{'timeselect'} == 6) ||
($timeselected == 2 || $timeselected == 3 || $timeselected == 6)) {
$dayormonth=$dayormonthd.$dayormonthm;
} else {
$dayormonth=$dayormonthm.$dayormonthd;
}
$output .= $template1 . qq~$dayormonth $profile_txt{'566'} ~ . $template2;
}
elsif ($field{'type'} eq "checkbox") {
if ($value == 1) { $value = " checked=\"checked\""; } else { $value = ""; }
# we have to use a little trick here to get a value from a checkbox if it has been unchecked by adding a hidden before it
$output .= $template1 . qq~~ . $template2;
}
elsif ($field{'type'} eq "spacer") {
@options = split(/\^/,$field{'options'});
if ($options[1] == 1) {
#if ($options[0] == 1) { $output .= qq~
\n~; }
#else { $output .= qq~
\n~; }
$output .= qq~
$field{'comment'}
\n~;
}
}
elsif ($field{'type'} eq "email") {
$output .= $template1 . qq~~ . $template2;
}
elsif ($field{'type'} eq "url") {
$output .= $template1 . qq~~ . $template2;
}
elsif ($field{'type'} eq "image") {
if ($value eq "") { $value = "http://"; }
$output .= $template1 . qq~~ . $template2;
}
return $output;
}
# returns the output for the edit profile page
## USAGE: $value = ext_editprofile("admin","required");
sub ext_editprofile {
my ($pusername, $part, $usergroup, $field, $id, $output, $fieldname, @options, $selected, $count) = (shift, shift, ${$uid.$username}{'position'});
if(-e ("$vardir/gmodsettings.txt")) {
require "$vardir/gmodsettings.txt";
}
foreach $fieldname (ext_get_field_order) {
$id = ext_get_field_id($fieldname);
$field = ext_get_field($id);
# make sure the field is visible, the user allowed to edit the current field and only the requested fields are returned
if (($field{'active'} == 1) &&
# (($field{'editable_by_user'} != 0) || ($usergroup eq "Administrator") || $usergroup eq "Global Moderator") &&
(($field{'editable_by_user'} != 0) || ($iamadmin) || ($iamgmod && $allow_gmod_profile)) &&
((($part eq "required") && ($field{'required_on_reg'} == 1)) || # show all required fields
(($part eq "additional") && ($field{'required_on_reg'} != 1)) || # show all additional fields
(($part eq "admin") && ($field{'editable_by_user'} == 0)) || # all fields for "admin edits" page
(($part eq "edit") && ($field{'editable_by_user'} == 1)) || # all fields for "edit profile" page
(($part eq "contact") && ($field{'editable_by_user'} == 2)) || # contact information page
(($part eq "options") && ($field{'editable_by_user'} == 3)) || # options page
(($part eq "im") && ($field{'editable_by_user'} == 4)))) { # im prefs page
$output .= ext_gen_editfield($id, $pusername);
}
}
# if ($output ne "" && $part ne "required") { $output .= qq~
\n~; }
return $output;
}
# returns the output for the registration page
sub ext_register {
my ($field, $id, $output, $fieldname, @options, @selected);
foreach $fieldname (ext_get_field_order) {
$id = ext_get_field_id($fieldname);
$field = ext_get_field($id);
#if ($field{'active'} == 1 && $field{'editable_by_user'} != 0 && $field{'required_on_reg'} != 0) {
if ($field{'active'} == 1 && $field{'required_on_reg'} != 0) {
$output .= ext_gen_editfield($id);
}
}
return $output;
}
# returns if the submitted profile is valid, if not, return error messages
sub ext_validate_submition {
my ($username, $pusername, $usergroup, %newprofile, @oldprofile, $output, $key, $value, $id, $field, @options) = (shift, shift, ${$uid.$username}{'position'}, %FORM);
if(-e ("$vardir/gmodsettings.txt")) {
require "$vardir/gmodsettings.txt";
}
while(($key,$value) = each(%newprofile)) {
# only validate fields with prefix "ext_"
if ($key =~ /^ext_(\d+)/) {
$id = $1;
$field = ext_get_field($id);
if (!$field{'name'}) { $output .= $lang_ext{'field_not_existing1'}.$id.$lang_ext{'field_not_existing2'}." \n"; }
# check if user is allowed to modify this setting
if ($action eq "register2") {
# if we're on registration page, igonre the 'editable_by_user' setting in case that 'required_on_reg' is set
if ($field{'editable_by_user'} == 0 && $field{'required_on_reg'} == 0) {
$output .= $field{'name'}.": ".$lang_ext{'not_allowed_to_modify'}." \n";
}
}
else {
if (($field{'editable_by_user'} == 0 || $username ne $pusername) &&
!$iamadmin && (!$iamgmod || !$allow_gmod_profile)) {
$output .= $field{'name'}.": ".$lang_ext{'not_allowed_to_modify'}." \n";
}
}
# check if setting is valid
if ($field{'type'} ne "text_multi" && $value =~ /[\n\r]/) { $output .= $field{'name'}.": ".$lang_ext{'invalid_char'}." \n"; }
if ($field{'type'} eq "text") {
@options = split(/\^/,$field{'options'});
# don't fill it with default value yet, it might be required on registration
# if ($options[3] ne "" && $value eq "") { $value = $options[3]; $newprofile{'ext_'.$id} = $value; }
if ($options[0]+0 > 0 && length($value) > $options[0]) { $output .= $field{'name'}.": ".$lang_ext{'too_long'}." \n"; }
if ($options[2] == 1 && $value !~ /[0-9\.,]+/ && $value ne "") { $output .= $field{'name'}.": ".$lang_ext{'not_numeric'}." \n"; }
&ToHTML($value);
$newprofile{'ext_'.$id} = $value;
}
elsif ($field{'type'} eq "text_multi") {
@options = split(/\^/,$field{'options'});
if ($options[0]+0 > 0 && length($value) > $options[0]) { $output .= $field{'name'}.": ".$lang_ext{'too_long'}." \n"; }
&ToHTML($value);
$value =~ s/\n/ /g;
$value =~ s/\r//g;
$newprofile{'ext_'.$id} = $value;
}
elsif ($field{'type'} eq "select" || $field{'type'} eq "radiobuttons") {
@options = split(/\^/,$field{'options'});
if ($value !~ /[0-9]/) { $output .= $field{'name'}.": ".$lang_ext{'not_numeric'}." \n"; }
if ($value < 0) { $output .= $field{'name'}.": ".$lang_ext{'too_small'}." \n"; }
if ($value > $#options) { $output .= $field{'name'}.": ".$lang_ext{'option_does_not_exist'}." \n"; }
}
elsif ($field{'type'} eq "date" && $value ne "") {
if ($value !~ /[0-9]/) { $output .= $field{'name'}.": ".$lang_ext{'not_numeric'}." \n"; }
if ($key eq "ext_".$id."_day") {
if ($value < 1) { $output .= $field{'name'}.": ".$lang_ext{'too_small'}." \n"; }
if ($value > 31) { $output .= $field{'name'}.": ".$lang_ext{'too_big'}." \n"; }
if (length($value) == 1) { $newprofile{'ext_'.$id.'_day'} = "0".$value; }
}
elsif ($key eq "ext_".$id."_month") {
if ($value < 1) { $output .= $field{'name'}.": ".$lang_ext{'too_small'}." \n"; }
if ($value > 12) { $output .= $field{'name'}.": ".$lang_ext{'too_big'}." \n"; }
if (length($value) == 1) { $newprofile{'ext_'.$id.'_month'} = "0".$value; }
}
elsif ($key eq "ext_".$id."_year") {
if (length($value) != 4) { $output .= $field{'name'}.": ".$lang_ext{'invalid_year'}." \n"; }
}
$newprofile{'ext_'.$id} = $newprofile{'ext_'.$id.'_month'} ."\/". $newprofile{'ext_'.$id.'_day'} ."\/". $newprofile{'ext_'.$id.'_year'};
if ($newprofile{'ext_'.$id} !~ /^\d\d\/\d\d\/\d\d\d\d$/) { $newprofile{'ext_'.$id} = ""; }
}
elsif ($field{'type'} eq "checkbox") {
if ($value ne "") { $newprofile{'ext_'.$id} = 1; } else { $newprofile{'ext_'.$id} = 0; }
}
elsif ($field{'type'} eq "email" && $value ne "") {
$value = substr($value,0,$ext_max_email_length);
# uses the code from Profile.pl without further checking...
if ($value !~ /[\w\-\.\+]+\@[\w\-\.\+]+\.(\w{2,4}$)/) { $output .= $field{'name'}.": ".$lang_ext{'invalid_char'}." \n"; }
if (($value =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\.$)/) || ($value !~ /^.+@\[?(\w|[-.])+\.[a-zA-Z]{2,4}|[0-9]{1,4}\]?$/)) { $output .= $field{'name'}.": ".$lang_ext{'invalid_char'}." \n"; }
&ToHTML($value);
$newprofile{'ext_'.$id} = $value;
}
elsif ($field{'type'} eq "url" && $value ne "") {
$value = substr($value,0,$ext_max_url_length);
&ToHTML($value);
$newprofile{'ext_'.$id} = $value;
}
elsif ($field{'type'} eq "image" && $value ne "" && $value ne "http://") {
$value = substr($value,0,$ext_max_image_length);
@options = split(/\^/,$field{'options'});
if ($options[2] ne "") {
@allowed_extensions = split(/ /,$options[2]);
$match = 0;
foreach $extension (@allowed_extensions){
if (grep /$extension$/i,$value) { $match = 1; last; }
}
if ($match == 0) { $output .= $field{'name'}.": ".$lang_ext{'invalid_extension'}." \n"; }
}
# filename check from profile.pl:
if ($value !~ m^\A[0-9a-zA-Z_\.\#\%\-\:\+\?\$\&\~\.\,\@/]+\Z^) { $output .= $field{'name'}.": ".$lang_ext{'invalid_char'}." \n"; }
&ToHTML($value);
$newprofile{'ext_'.$id} = $value;
}
## else {
## undef $newprofile{'ext_'.$id};
## }
}
}
# check if required fields are filled and add missing fields to $newprofile, just to be on the saver side
$id = 0;
foreach (ext_get_fields) {
$field = ext_get_field($id);
$value = ext_get($pusername, $field{'name'}, 1);
if (defined $newprofile{'ext_'.$id} && ($field{'type'} eq "checkbox" || $field{'type'} eq "select" || $field{'type'} eq "radiobuttons")) {
if ($newprofile{'ext_'.$id} eq "") { $newprofile{'ext_'.$id} = 0; }
}
if (defined $newprofile{'ext_'.$id} && $field{'type'} eq "image") {
if ($newprofile{'ext_'.$id} eq "http://") { $newprofile{'ext_'.$id} = ""; }
}
# load old settings which where invisible/restricted
if ($action eq "register2") {
if ($field{'editable_by_user'} == 0 && $field{'required_on_reg'} == 0) {
$newprofile{'ext_'.$id} = $value;
}
}
else {
if ($field{'editable_by_user'} == 0 && !$iamadmin && (!$iamgmod || !$allow_gmod_profile)) {
$newprofile{'ext_'.$id} = $value;
}
}
# if setting didn't get submitted or field is disabled, load old value
if (!defined $newprofile{'ext_'.$id} || $field{'active'} == 0) { $newprofile{'ext_'.$id} = $value; }
if ($field{'required_on_reg'} == 1 && $newprofile{'ext_'.$id} eq "") { $output .= $field{'name'}.": ".$lang_ext{'required'}." \n"; }
# only fill with default value AFTER check of requirement
if ($field{'type'} eq "text" && $newprofile{'ext_'.$id} eq "") {
@options = split(/\^/,$field{'options'});
if ($options[3] ne "") { $newprofile{'ext_'.$id} = $options[3] }
}
elsif ($field{'type'} eq "spacer") {
$newprofile{'ext_'.$id} = "";
}
$id++;
}
# write our now validated profile information back into the usually used variable
%FORM = %newprofile;
return $output;
}
# stores the submitted profile on disk
sub ext_saveprofile {
my ($pusername, $id, %newprofile, @fields) = (shift, 0, %FORM);
# note: we expect the new profile to be complete and validated already
foreach (ext_get_fields) {
${$uid.$pusername}{'ext_'.$id} = $newprofile{"ext_".$id};
#push(@fields,'ext_'.$id);
$id++;
}
&UserAccount($user,"update");
#&UserAccount($user,"update",join('+',@fields));
}
# here we define us some ready-to-use html samples to design the input forms for the admin area
# this makes it easier to modify the html code afterwards
sub ext_admin_htmlreq {
$ext_template_blockstart = qq~