1###############################################################################
2# UserSelect.pm                                                               #
3# $Date: 12.02.14 $                                                           #
4###############################################################################
5# YaBB: Yet another Bulletin Board                                            #
6# Open-Source Community Software for Webmasters                               #
7# Version:        YaBB 2.6.11                                                 #
8# Packaged:       December 2, 2014                                            #
9# Distributed by: http://www.yabbforum.com                                    #
10# =========================================================================== #
11# Copyright (c) 2000-2014 YaBB (www.yabbforum.com) - All Rights Reserved.     #
12# Software by:  The YaBB Development Team                                     #
13#               with assistance from the YaBB community.                      #
14###############################################################################
15our $VERSION = '2.6.11';
16
17$userselectpmver = 'YaBB 2.6.11 $Revision: 1611 $';
18if ( $action eq 'detailedversion' ) { return 1; }
19
20if ( $iamguest && $INFO{'toid'} ne 'userspec' && $action ne 'checkavail' ) {
21    fatal_error('members_only');
22}
23LoadLanguage('UserSelect');
24get_template('Memberlist');
25
26$MembersPerPage = 10;
27
28sub FindMem {
29    if ( -e "$memberdir/$username.usctmp" ) {
30        unlink "$memberdir/$username.usctmp";
31    }
32
33    $SearchStr = $FORM{'member'};
34
35    if ( $SearchStr eq q{} || $SearchStr eq q{*} ) {
36        $INFO{'sort'}  = 'username';
37        $INFO{'start'} = 0;
38    }
39    elsif ( $SearchStr =~ /\*/xsm ) {
40        $SearchStr =~ s/\*+/\*/gxsm;
41        if ( $SearchStr =~ /\*\$/xsm ) {
42            $SearchStr = substr $SearchStr, 0, length($SearchStr) - 1;
43            $LookFor = qq~\^$SearchStr~;
44        }
45        elsif ( $SearchStr =~ /^\*/xsm ) {
46            $SearchStr = substr $SearchStr, 1;
47            $LookFor = qq~$SearchStr\$~;
48        }
49        else {
50            ( $before, $after ) = split /\*/xsm, $SearchStr;
51            $LookFor = qq~\^($before).*?($after)\$~;
52        }
53    }
54    else {
55        $LookFor = qq~\^$SearchStr\$~;
56    }
57
58    MemberList();
59    return;
60}
61
62sub MemberList {
63    if ( $iamguest && $INFO{'toid'} ne 'userspec' ) {
64        fatal_error('members_only');
65    }
66    if ( -e "$memberdir/$username.usctmp" && $INFO{'sort'} ne 'pmsearch' ) {
67        unlink "$memberdir/$username.usctmp";
68    }
69
70    if   ( $INFO{'start'} eq q{} ) { $start = 0; }
71    else                           { $start = $INFO{'start'}; }
72
73    $to_id        = $INFO{'toid'};
74    $radiobuttons = q{};
75    my ( $tosel, $ccsel, $bccsel );
76    if ( $to_id =~ /toshow/sm ) {
77        $page_title     = qq~$usersel_txt{'pmpagetitle'}~;
78        $instruct_start = qq~$usersel_txt{'instruct'}~;
79        $instruct_end   = qq~$usersel_txt{'reciepientlist'}~;
80
81        if    ( $to_id eq 'toshowcc' )  { $ccsel  = q~ checked="checked"~; }
82        elsif ( $to_id eq 'toshowbcc' ) { $bccsel = q~ checked="checked"~; }
83        else                            { $tosel  = q~ checked="checked"~; }
84        if ( $PMenable_cc || $PMenable_bcc ) {
85            $my_radio_to = qq~
86            <label for="toshow" class="small">$usersel_txt{'pmto'}</label><input type="radio" name="selreciepients" id="toshow" value="toshow" class="windowbg" onclick="location.href='$scripturl?action=imlist;sort=$INFO{'sort'};toid=toshow;start=$start;letter=$INFO{'letter'}';"$tosel />
87            ~;
88            if ($PMenable_cc) {
89                $my_radio_cc = qq~
90                <label for="toshowcc" class="small">$usersel_txt{'pmcc'}</label><input type="radio" name="selreciepients" id="toshowcc" value="toshowcc" class="windowbg" onclick="location.href='$scripturl?action=imlist;sort=$INFO{'sort'};toid=toshowcc;start=$start;letter=$INFO{'letter'}';"$ccsel />
91                ~;
92            }
93            if ($PMenable_bcc) {
94                $my_radio_bcc = qq~
95                <label for="toshowpmbcc" class="small">$usersel_txt{'pmbcc'}</label><input type="radio" name="selreciepients" id="toshowpmbcc" value="toshowbcc" class="windowbg" onclick="location.href='$scripturl?action=imlist;sort=$INFO{'sort'};toid=toshowbcc;start=$start;letter=$INFO{'letter'}';"$bccsel />
96                ~;
97            }
98            $radiobuttons = $my_bcc_radio;
99            $radiobuttons =~ s/{yabb my_radio_to}/$my_radio_to/sm;
100            $radiobuttons =~ s/{yabb my_radio_cc}/$my_radio_cc/sm;
101            $radiobuttons =~ s/{yabb my_radio_bcc}/$my_radio_bcc/sm;
102        }
103    }
104    if ( $to_id =~ /moderators\d/xsm ) {
105        $page_title     = qq~$usersel_txt{'modpagetitle'}~;
106        $instruct_start = qq~$usersel_txt{'instruct'}~;
107        $instruct_end   = qq~$usersel_txt{'moderatorlist'}~;
108    }
109    if ( $to_id =~ /ignore/sm ) {
110        $page_title     = qq~$usersel_txt{'ignorepagetitle'}~;
111        $instruct_start = qq~$usersel_txt{'instruct'}~;
112        $instruct_end   = qq~$usersel_txt{'ignorelist'}~;
113    }
114    if ( $to_id =~ /userspec/sm ) {
115        $page_title     = qq~$usersel_txt{'searchpagetitle'}~;
116        $instruct_start = qq~$usersel_txt{'instruct1'}~;
117        $instruct_end   = qq~$usersel_txt{'searchlist'}~;
118    }
119    if ( $to_id =~ /buddylist/sm ) {
120        $page_title     = qq~$usersel_txt{'buddypagetitle'}~;
121        $instruct_start = qq~$usersel_txt{'instruct'}~;
122        $instruct_end   = qq~$usersel_txt{'buddylist'}~;
123    }
124    if ( $to_id =~ /groups/sm ) {
125        $page_title     = qq~$usersel_txt{'grouppagetitle'}~;
126        $instruct_start = qq~$usersel_txt{'instruct'}~;
127        $instruct_end   = qq~$usersel_txt{'groups'}~;
128    }
129    $page     = 'a';
130    $showpage = 'A';
131
132    while ( $page ne 'z' ) {
133        if ( $INFO{'letter'} && $page eq $INFO{'letter'} ) {
134            $LetterLinks .=
135qq~<div class="letterlinks_a"><span class="small"><b>$showpage</b></span></div>~;
136        }
137        else {
138            $LetterLinks .=
139qq~<div class="letterlinks_b"><a href="$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=$page"><span class="small"><b>$showpage</b></span></a></div>~;
140        }
141        $page++;
142        $showpage++;
143    }
144    if ( $INFO{'letter'} && $INFO{'letter'} eq 'z' ) {
145        $LetterLinks .=
146q~<div class="letterlinks_a"><span class="small"><b>Z</b></span></div>~;
147    }
148    else {
149        $LetterLinks .=
150qq~<div class="letterlinks_b"><a href="$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=z"><span class="small"><b>Z</b></span></a></div>~;
151    }
152    if ( $INFO{'letter'} && $INFO{'letter'} eq 'other' ) {
153        $LetterLinks .=
154qq~<div class="letterlinks_c"><span class="small"><b>$usersel_txt{'other'}</b></span></div>~;
155    }
156    else {
157        $LetterLinks .=
158qq~<div class="letterlinks_d"><a href="$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=other"><span class="small"><b>$usersel_txt{'other'}</b></span></a></div>~;
159    }
160
161    if ( $INFO{'sort'} eq 'pmsearch' ) {
162        if ( $INFO{'letter'} && $INFO{'letter'} eq 'all' ) {
163            $LetterLinks .=
164qq~<div class="letterlinks_c"><span class="small"><b>$usersel_txt{'allsearch'}</b></span></div>~;
165        }
166        else {
167            $LetterLinks .=
168qq~<div class="letterlinks_d"><a href="$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=all"><span class="small"><b>$usersel_txt{'allsearch'}</b></span></a></div>~;
169        }
170    }
171    if ( $to_id eq 'groups' ) { $LetterLinks = q{}; }
172    if ( $INFO{'letter'} ne 'all' ) { $letter = lc $INFO{'letter'}; }
173
174    $i            = 0;
175    $recent_exist = 1;
176    @recentUsers  = ();
177
178    if (   $to_id =~ /toshow/sm
179        || $to_id =~ /buddylist/sm
180        || $to_id =~ /ignore/sm )
181    {
182        loadRecentPMs();
183    }
184    if ( !@recentUsers ) {
185        $recent_exist = 0;
186        if ( $INFO{'sort'} eq 'recentpm' ) { $INFO{'sort'} = 'username'; }
187    }
188    $myRealname = ${ $uid . $username }{'realname'};
189    $myEmail    = ${ $uid . $username }{'email'};
190    if ( $INFO{'sort'} eq 'recentpm' ) {
191        foreach my $recentname (@recentUsers) {
192            if ( !${ $uid . $recentname }{'password'} ) {
193                LoadUser($recentname);
194            }
195            if ( ${ $uid . $recentname}{'realname'} ) {
196                $memberinf{$recentname} =
197                  qq~${$uid.$recentname}{'realname'}|${$uid.$recentname}{'email'}~;
198            }
199        }
200    }
201    elsif ( $INFO{'sort'} eq 'pmsearch' ) {
202        if ( !-e "$memberdir/$username.usctmp" ) {
203            ManageMemberinfo('load');
204            fopen( FILE, ">$memberdir/$username.usctmp" );
205            foreach my $membername (
206                sort { lc $memberinf{$a} cmp lc $memberinf{$b} }
207                keys %memberinf
208              )
209            {
210                ( $memrealname, $mememail, undef ) =
211                  split /\|/xsm, $memberinf{$membername}, 3;
212                ## do not find own name - unless for search or board mods!
213                if ( $to_id !~ /moderators\d/xsm && $to_id !~ /userspec/sm ) {
214                    if (   $memrealname =~ /$LookFor/igxsm
215                        && $membername ne $username )
216                    {
217                        print {FILE} "$membername,$memrealname|$mememail\n"
218                          or croak "$croak{'print'} FILE";
219                    }
220                    elsif ($mememail =~ /$LookFor/igxsm
221                        && $membername ne $username )
222                    {
223                        print {FILE} "$membername,$memrealname|$mememail\n"
224                          or croak "$croak{'print'} FILE";
225                    }
226                }
227                else {
228                    if ( $memrealname =~ /$LookFor/igxsm ) {
229                        print {FILE} "$membername,$memrealname|$mememail\n"
230                          or croak "$croak{'print'} FILE";
231                    }
232                    elsif ( $mememail =~ /$LookFor/igxsm ) {
233                        print {FILE} "$membername,$memrealname|$mememail\n"
234                          or croak "$croak{'print'} FILE";
235                    }
236                }
237            }
238            fclose(FILE);
239            undef %memberinf;
240        }
241        fopen( FILE, "$memberdir/$username.usctmp" );
242        while ( $line = <FILE> ) {
243            chomp $line;
244            ( $recentname, $realinfo ) = split /\,/xsm, $line;
245            $memberinf{$recentname} = $realinfo;
246        }
247        fclose(FILE);
248
249    }
250    elsif ( $to_id eq 'groups' ) {
251        $ToShow[0] = 'bmallmembers';
252        $ToShow[1] = q{};
253        $ToShow[2] = 'bmadmins';
254        $ToShow[3] = 'bmgmods';
255        $ToShow[4] = 'bmfmods';
256        $ToShow[5] = 'bmmods';
257        $ToShow[6] = q{};
258        my $x = 6;
259
260        foreach (@nopostorder) {
261            $ToShow[$x] = $_;
262            $x++;
263        }
264
265    }
266    elsif ( $INFO{'sort'} eq 'mlletter' || $INFO{'sort'} eq 'username' ) {
267        ManageMemberinfo('load');
268    }
269
270    if   ( $INFO{'sort'} eq 'recentpm' ) { $selRecent = q~class="windowbg recentpm"~; }
271    else                                 { $selRecent = q~class="windowbg2 recentpm"~; }
272
273    if ( $INFO{'sort'} eq 'mlletter' || $INFO{'sort'} eq 'username' ) {
274        $selUser = q~class="windowbg recentpm"~;
275    }
276    else { $selUser = q~class="windowbg2 recentpm"~; }
277
278    if (
279        (
280            $to_id !~ /toshow/sm || ( $PM_level
281                && ( $PM_level != 2 || $staff )
282                && ( $PM_level != 3 || $iamadmin || $iamgmod )
283                && ( $PM_level != 4 || $iamadmin || $iamgmod || $iamfmod ) )
284        )
285        or (
286            $to_id !~ /userspec/sm
287            || (   ( $ML_Allowed != 1 || !$iamguest )
288                && ( $ML_Allowed != 2 || $staff )
289                && ( $ML_Allowed != 3 || $iamadmin || $iamgmod )
290                && ( $ML_Allowed != 4 || $iamadmin || $iamgmod || $iamfmod ) )
291        )
292      )
293    {
294        foreach my $membername (
295            sort { lc $memberinf{$a} cmp lc $memberinf{$b} }
296            keys %memberinf
297          )
298        {
299            if ( $to_id =~ /toshow/sm ) {
300                if ( $PM_level == 2 ) {
301                    CheckUserPM_Level($membername);
302                    next if $UserPM_Level{$membername} < 2;
303                }
304                elsif ( $PM_level == 3 ) {
305                    CheckUserPM_Level($membername);
306                    next if $UserPM_Level{$membername} != 3;
307                }
308                elsif ( $PM_level == 4 ) {
309                    CheckUserPM_Level($membername);
310                    next if $UserPM_Level{$membername} != 4;
311                }
312            }
313            ( $memrealname, $mememail, undef ) =
314              split /\|/xsm, $memberinf{$membername}, 3;
315            if ($letter) {
316                $SearchName = lc( substr $memrealname, 0, 1 );
317                if (
318                    $SearchName eq $letter
319                    && (
320                        $membername ne $username
321                        || (   $to_id =~ /moderators\d/xsm
322                            || $to_id =~ /userspec/sm )
323                    )
324                  )
325                {
326                    $ToShow[$i] = $membername;
327                }
328                elsif (
329                       $letter eq 'other'
330                    && ( ( $SearchName lt 'a' ) || ( $SearchName gt 'z' ) )
331                    && (
332                        $membername ne $username
333                        || (   $to_id =~ /moderators\d/xsm
334                            || $to_id =~ /userspec/sm )
335                    )
336                  )
337                {
338                    $ToShow[$i] = $membername;
339                }
340            }
341            else {
342                if ( $to_id =~ /moderators\d/xsm || $to_id =~ /userspec/sm ) {
343                    $ToShow[$i] = $membername;
344                }
345                elsif ( $membername ne $username ) {
346                    $ToShow[$i] = $membername;
347                }
348            }
349            if ( $ToShow[$i] ) { $i++; }
350        }
351        undef %UserPM_Level;
352    }
353    undef %memberinf;
354
355    $memcount = @ToShow;
356    if ( $memcount < $MembersPerPage ) { $MembersPerPage = $memcount; }
357    if ( !$memcount && $letter ) {
358        $pageindex = q{};
359    }
360    else {
361        buildIndex();
362    }
363    buildPages(1);
364    $bb       = $start;
365    $numshown = 0;
366    if ($memcount) {
367        $yymain_inner .= qq~
368            $radiobuttons
369        ~;
370        if ( $to_id =~ /userspec/sm ) {
371            $yymain_inner .= qq~
372            <select name="rec_list" id="rec_list" size="10" class="reclist" ondblclick="copy_option('$to_id')">\n
373        ~;
374        }
375        else {
376            $yymain_inner .= qq~
377            <select name="rec_list" id="rec_list" multiple="multiple" size="10" class="reclist" ondblclick="copy_option('$to_id')">\n
378        ~;
379        }
380        while ( $numshown < $MembersPerPage ) {
381            $user = $ToShow[$bb];
382            if ( $to_id ne 'groups' ) {
383                my $cloakedUserName;
384                if ( $user ne q{} ) {
385                    $color      = q{};
386                    $colorstyle = q~ style="font-weight: bold;~;
387                    !${ $uid . $user }{'password'}
388                      ? LoadUser($user)
389                      : LoadMiniUser($user);
390                    if ($color) { $colorstyle .= qq~ color: $color;~; }
391                    $colorstyle .= q~"~;
392                    if ( ${ $uid . $user }{'realname'} eq q{} ) {
393                        ${ $uid . $user }{'realname'} = $user;
394                    }
395                    if   ($do_scramble_id) { $cloakedUserName = cloak($user); }
396                    else                   { $cloakedUserName = $user; }
397                    $yymain_inner .=
398qq~<option value="$cloakedUserName"$colorstyle>${$uid.$user}{'realname'}</option>\n~;
399                }
400            }
401            else {
402                my $groupName     = q{};
403                my $groupdisabled = q{};
404                if ( $user ne q{} ) {
405                    $groupName = $usersel_txt{$user};
406                    if ( $groupName eq q{} ) {
407                        $groupName = ( split /\|/xsm, $NoPost{$user} )[0];
408                    }
409                    $user =
410                      $user eq 'bmallmembers' ? 'all'
411                      : (
412                        $user eq 'bmadmins' ? 'admins'
413                        : (
414                            $user eq 'bmgmods' ? 'gmods'
415                            : (
416                                $user eq 'bmfmods' ? 'fmods'
417                                : ( $user eq 'bmmods' ? 'mods' : $user )
418                            )
419                        )
420                      );
421                    $yymain_inner .=
422                      qq~<option value="$user">$groupName</option>\n~;
423                }
424                else {
425                    $groupName = q~-------~;
426                    $yymain_inner .=
427                      qq~<optgroup label="$groupName"></optgroup>\n~;
428                }
429            }
430            $numshown++;
431            $bb++;
432        }
433        $yymain_inner .= qq~
434        </select>\n
435        <input type="button" class="button reclist_sub" onclick="copy_option('$to_id')" value="$usersel_txt{'addselected'}" /><input type="button" class="button reclist_sub" onclick="window.close()" value="$usersel_txt{'pageclose'}" />
436        ~;
437    }
438    else {
439        $yymain_inner .= q~
440        <div class="reclist_no">
441        <br /><br />
442        ~;
443        if ($letter) {
444            $yymain_inner .= qq~<b>$usersel_txt{'noentries'}</b><br />~;
445        }
446        elsif ( $INFO{'sort'} eq 'pmsearch' ) {
447            $yymain_inner .=
448              qq~<b>$usersel_txt{'nofound'} <i>$SearchStr</i></b>~;
449        }
450        $yymain_inner .= qq~
451        </div>
452        <input type="button" class="button reclist_b" onclick="window.close()" value="$usersel_txt{'pageclose'}" />
453        ~;
454    }
455    $yymain .= $my_sel_box;
456    $yymain =~ s/{yabb yymain_inner}/$yymain_inner/sm;
457
458    undef @ToShow;
459    buildPages(0);
460    $yytitle = $page_title;
461    userselectTemplate();
462    return;
463}
464
465sub buildIndex {
466    if ( $memcount != 0 ) {
467        if ( !$iamguest ) {
468            ( undef, undef, $usermemberpage, undef ) =
469              split /\|/xsm, ${ $uid . $username }{'pageindex'};
470        }
471        my ( $pagetxtindex, $pagedropindex, $all, $allselected );
472        $indexdisplaynum = 3;
473        $dropdisplaynum  = 10;
474        if ( $FORM{'sortform'} eq q{} ) { $FORM{'sortform'} = $INFO{'sort'}; }
475        $postdisplaynum = 3;
476        $startpage      = 0;
477        $max            = $memcount;
478
479        if ( $INFO{'start'} eq 'all' ) {
480            $MembersPerPage = $max;
481            $all            = 1;
482            $allselected    = q~ selected="selected"~;
483            $start          = 0;
484        }
485        else { $start = $INFO{'start'} || 0; }
486        $start    = $start > $memcount - 1 ? $memcount - 1 : $start;
487        $start    = ( int( $start / $MembersPerPage ) ) * $MembersPerPage;
488        $tmpa     = 1;
489        $pagenumb = int( ( $memcount - 1 ) / $MembersPerPage ) + 1;
490
491        if ( $start >= ( ( $postdisplaynum - 1 ) * $MembersPerPage ) ) {
492            $startpage = $start - ( ( $postdisplaynum - 1 ) * $MembersPerPage );
493            $tmpa = int( $startpage / $MembersPerPage ) + 1;
494        }
495        if ( $memcount >= $start + ( $postdisplaynum * $MembersPerPage ) ) {
496            $endpage = $start + ( $postdisplaynum * $MembersPerPage );
497        }
498        else { $endpage = $memcount }
499        $lastpn = int( ( $memcount - 1 ) / $MembersPerPage ) + 1;
500        $lastptn = ( $lastpn - 1 ) * $MembersPerPage;
501        $pageindex =
502qq~<span class="small pgindex">$usersel_txt{'pages'}: $pagenumb</span>~;
503        if ( $pagenumb > 1 || $all ) {
504            if ( $usermemberpage == 1 || $iamguest ) {
505                $pagetxtindexst = q~<span class="small pgindex">~;
506                $pagetxtindexst .= qq~ $usersel_txt{'pages'}: ~;
507                if ( $startpage > 0 ) {
508                    $pagetxtindex =
509qq~<a href="$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=$letter"><span class="small">1</span></a>&nbsp;...&nbsp;~;
510                }
511                if ( $startpage == $MembersPerPage ) {
512                    $pagetxtindex =
513qq~<a href="$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=$letter"><span class="small">1</span></a>&nbsp;~;
514                }
515                for my $counter ( $startpage .. ( $endpage - 1 ) ) {
516                    if ( $counter % $MembersPerPage == 0 ) {
517                        $pagetxtindex .=
518                          $start == $counter
519                          ? qq~<b>[$tmpa]</b>&nbsp;~
520                          : qq~<a href="$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=$letter;start=$counter"><span class="small">$tmpa</span></a>&nbsp;~;
521                        $tmpa++;
522                    }
523                }
524                if ( $endpage < $memcount - $MembersPerPage ) {
525                    $pageindexadd = q~...&nbsp;~;
526                }
527                if ( $endpage != $memcount ) {
528                    $pageindexadd .=
529qq~<a href="$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=$letter;start=$lastptn"><span class="small">$lastpn</span></a>~;
530                }
531                $pagetxtindex .= qq~$pageindexadd~;
532                $pageindex = qq~$pagetxtindexst$pagetxtindex</span>~;
533            }
534            else {
535                $pagedropindex =
536q~<div class="pagedrp">~;
537                $tstart = $start;
538                if ( substr( $INFO{'start'}, 0, 3 ) eq 'all' ) {
539                    ( $tstart, $start ) = split /\-/xsm, $INFO{'start'};
540                }
541                $d_indexpages = $pagenumb / $dropdisplaynum;
542                $i_indexpages = int( $pagenumb / $dropdisplaynum );
543                if ( $d_indexpages > $i_indexpages ) {
544                    $indexpages = int( $pagenumb / $dropdisplaynum ) + 1;
545                }
546                else { $indexpages = int( $pagenumb / $dropdisplaynum ) }
547                $selectedindex =
548                  int( ( $start / $MembersPerPage ) / $dropdisplaynum );
549
550                if ( $pagenumb > $dropdisplaynum ) {
551                    $pagedropindex .=
552qq~<div class="decselector"><select size="1" name="decselector" id="decselector" class="decselector_sel" onchange="if(this.options[this.selectedIndex].value) SelDec(this.options[this.selectedIndex].value, 'xx')">\n~;
553                }
554                for my $i ( 0 .. ( $indexpages - 1 ) ) {
555                    $indexpage  = ( $i * $dropdisplaynum ) * $MembersPerPage;
556                    $indexstart = ( $i * $dropdisplaynum ) + 1;
557                    $indexend   = $indexstart + ( $dropdisplaynum - 1 );
558                    if ( $indexend > $pagenumb ) { $indexend = $pagenumb; }
559                    if ( $indexstart == $indexend ) {
560                        $indxoption = qq~$indexstart~;
561                    }
562                    else { $indxoption = qq~$indexstart-$indexend~; }
563                    $selected = q{};
564                    if ( $i == $selectedindex ) {
565                        $selected = q~ selected="selected"~;
566                        $pagejsindex =
567                          qq~$indexstart|$indexend|$MembersPerPage|$indexpage~;
568                    }
569                    if ( $pagenumb > $dropdisplaynum ) {
570                        $pagedropindex .=
571qq~<option value="$indexstart|$indexend|$MembersPerPage|$indexpage"$selected>$indxoption</option>\n~;
572                    }
573                }
574                if ( $pagenumb > $dropdisplaynum ) {
575                    $pagedropindex .= qq~</select>\n~;
576                }
577                $pagedropindex .=
578q~<div id="ViewIndex" class="droppageindex pages" style="visibility: hidden; padding-bottom:5px">&nbsp;</div>~;
579                $tmpMembersPerPage = $MembersPerPage;
580                if ( substr( $INFO{'start'}, 0, 3 ) eq 'all' ) {
581                    $MembersPerPage = $MembersPerPage * $dropdisplaynum;
582                }
583                $prevpage = $start - $tmpMembersPerPage;
584                $nextpage = $start + $MembersPerPage;
585                $pagedropindexpvbl =
586qq~<img src="$imagesdir/$ml_index_left0" height="14" width="13" alt="" />~;
587                $pagedropindexnxbl =
588qq~<img src="$imagesdir/$ml_index_right0" height="14" width="13" alt="" />~;
589                if ( $start < $MembersPerPage ) {
590                    $pagedropindexpv .=
591qq~<img src="$imagesdir/$ml_index_left0" height="14" width="13" alt="" />~;
592                }
593                else {
594                    $pagedropindexpv .=
595qq~<img src="$imagesdir/$ml_index_left" height="14" width="13" alt="$pidtxt{'02'}" title="$pidtxt{'02'}" class="cursor" onclick="location.href=\\'$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=$letter;start=$prevpage\\'" ondblclick="location.href=\\'$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=$letter;start=0\\'" />~;
596                }
597                if ( $nextpage > $lastptn ) {
598                    $pagedropindexnx .=
599qq~<img src="$imagesdir/$ml_index_right0" height="14" width="13" alt="" />~;
600                }
601                else {
602                    $pagedropindexnx .=
603qq~<img src="$imagesdir/$ml_index_right" height="14" width="13" alt="$pidtxt{'03'}" title="$pidtxt{'03'}" class="cursor" onclick="location.href=\\'$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=$letter;start=$nextpage\\'" ondblclick="location.href=\\'$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=$letter;start=$lastptn\\'" />~;
604                }
605                $pageindex = qq~$pagedropindex</div>~;
606
607                $pageindexjs = qq~
608<script type="text/javascript">
609    function SelDec(decparam, visel) {
610        splitparam = decparam.split("|");
611        var vistart = parseInt(splitparam[0]);
612        var viend = parseInt(splitparam[1]);
613        var maxpag = parseInt(splitparam[2]);
614        var pagstart = parseInt(splitparam[3]);
615        var allpagstart = parseInt(splitparam[3]);
616        if(visel == 'xx' && decparam == '$pagejsindex') visel = '$tstart';
617        var pagedropindex = '$visel_0';
618        for(i=vistart; i<=viend; i++) {
619            if(visel == pagstart) pagedropindex += '$visel_1a<b>' + i + '<\/b>$visel_1b';
620            else pagedropindex += '$visel_2a<a href="$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=$letter;start=' + pagstart + '">' + i + '<\/a>$visel_1b';
621            pagstart += maxpag;
622        }
623        ~;
624                if ($showpageall) {
625                    $pageindexjs .= qq~
626            if (vistart != viend) {
627                if(visel == 'all') pagedropindex += '$visel_1a<b>$pidtxt{"01"}<\/b>$visel_1b';
628                else pagedropindex += '$visel_2a<a href="$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=$letter;start=all-' + allpagstart + '">$pidtxt{"01"}<\/a>$visel_1b';
629            }
630            ~;
631                }
632                $pageindexjs .= qq~
633        if(visel != 'xx') pagedropindex += '$visel_3a$pagedropindexpv$pagedropindexnx$visel_1b';
634        else pagedropindex += '$visel_3a$pagedropindexpvbl$pagedropindexnxbl$visel_1b';
635        pagedropindex += '$visel_4';
636        document.getElementById("ViewIndex").innerHTML=pagedropindex;
637        document.getElementById("ViewIndex").style.visibility = "visible";
638        ~;
639                if ( $pagenumb > $dropdisplaynum ) {
640                    $pageindexjs .= q~
641        document.getElementById("decselector").value = decparam;
642        ~;
643                }
644                $pageindexjs .= qq~
645    }
646    document.onload = SelDec('$pagejsindex', '$tstart');
647</script>
648~;
649            }
650        }
651    }
652    return;
653}
654
655sub buildPages {
656    my @x = @_;
657    if ( $to_id eq 'groups' ) { $instructtext = $usersel_txt{'instruct4'}; }
658    else {
659        $instructtext =
660          qq~<label for="member">$usersel_txt{'instruct2'}</label>~;
661    }
662    if ( $to_id ne 'groups' ) {
663        $not_groups = qq~
664            <form action="$scripturl?action=findmember;sort=pmsearch;toid=$to_id" method="post" id="form1" name="form1" enctype="application/x-www-form-urlencoded" style="display:inline; vertical-align:middle;" accept-charset="$yymycharset">
665                <input type="text" name="member" id="member" value="$usersel_txt{'wildcardinfo'}" onfocus="txtInFields(this, '$usersel_txt{'wildcardinfo'}');" onblur="txtInFields(this, '$usersel_txt{'wildcardinfo'}')" class="wildcard" />
666                <input type="submit" class="button" style="font-size: 10px;" value="$usersel_txt{'gobutton'}" />
667            </form>~;
668    }
669    if ( $recent_exist && $to_id =~ /toshow/sm ) {
670        $not_groups_b = qq~
671            <div $selRecent onclick="location.href='$scripturl?action=imlist;sort=recentpm;toid=$to_id';"><b>$usersel_txt{'recentlist'}</b></div>
672            <div $selUser onclick="location.href='$scripturl?action=imlist;sort=username;toid=$to_id';"><b>$usersel_txt{'alllist'}</b></div>
673        ~;
674    }
675    elsif ( $to_id ne 'groups' ) {
676        $not_groups_b = qq~
677            <div $selUser onclick="location.href='$scripturl?action=imlist;sort=username;toid=$to_id';" style="width: 454px;"><b>$usersel_txt{'alllist'}</b></div>
678        ~;
679    }
680    elsif ( $to_id eq 'groups' ) {
681        $not_groups_b = qq~
682            <div $selUser onclick="location.href='$scripturl?action=imlist;sort=username;toid=$to_id';" style="width: 454px;"><b>$usersel_txt{'groups'}</b></div>
683        ~;
684    }
685    if ( $LetterLinks ne q{} ) {
686        $TableHeader_lt .= $my_tableHeader_lt;
687        $TableHeader_lt =~ s/{yabb LetterLinks}/$LetterLinks/sm;
688    }
689
690    $TableHeader .= $my_tableHeader;
691    $TableHeader =~ s/{yabb instructtext}/$instructtext/sm;
692    $TableHeader =~ s/{yabb not_groups}/$not_groups/sm;
693    $TableHeader =~ s/{yabb not_groups_b}/$not_groups_b/sm;
694    $TableHeader =~ s/{yabb TableHeader_lt}/$TableHeader_lt/sm;
695
696    $numbegin = ( $start + 1 );
697    $numend   = ( $start + $MembersPerPage );
698    if ( $numend > $memcount ) { $numend  = $memcount; }
699    if ( $memcount == 0 )      { $numshow = q{}; }
700    else { $numshow = qq~($numbegin - $numend $usersel_txt{'of'} $memcount)~; }
701
702    if ( $x[0] ) {
703        $yymain .= $my_usersel;
704        $yymain =~ s/{yabb TableHeader}/$TableHeader/sm;
705        $yymain =~ s/{yabb pageindex}/$pageindex/sm;
706    }
707    else {
708        if ( $to_id ne 'groups' ) {
709            $my_inst3 = $usersel_txt{'instruct3'};
710        }
711        $yymain .= $my_usersel_inst;
712        $yymain =~ s/{yabb instruct_start}/$instruct_start/sm;
713        $yymain =~ s/{yabb instruct_end}/$instruct_end/sm;
714        $yymain =~ s/{yabb pageindexjs}/$pageindexjs/sm;
715    }
716    return;
717}
718
719sub userselectTemplate {
720    print_output_header();
721
722    $show_cc = q{};
723    if ( $to_id ne 'groups' ) {
724        if ( $PMenable_cc && $PMenable_bcc ) {
725            $show_cc .= q~
726            alt_select1 = 'toshowcc'; alt_select2 = 'toshowbcc'; pmtoshow = true;
727            if (to_select == 'toshowcc') { alt_select1 = 'toshow'; alt_select2 = 'toshowbcc'; }
728            if (to_select == 'toshowbcc') { alt_select1 = 'toshow'; alt_select2 = 'toshowcc'; }
729            ~;
730        }
731        elsif ($PMenable_cc) {
732            $show_cc .= q~
733            alt_select1 = 'toshowcc'; pmtoshow = true;
734            if (to_select == 'toshowcc') { alt_select1 = 'toshow'; pmtoshow = true; }
735            ~;
736        }
737        elsif ($PMenable_bcc) {
738            $show_cc .= q~
739            alt_select1 = 'toshowbcc'; pmtoshow = true;
740            if (to_select == 'toshowbcc') { alt_select1 = 'toshow'; pmtoshow = true; }
741            ~;
742        }
743    }
744
745    $output = $my_usersel_tem;
746    $output =~ s/{yabb noresults}/$usersel_txt{'noresults'}/sm;
747    $output =~ s/{yabb title}/$yytitle/sm;
748    $output =~ s/{yabb show_cc}/$show_cc/sm;
749    $output =~ s/{yabb main}/$yymain/sm;
750
751    $addsession =
752qq~<input type="hidden" name="formsession" value="$formsession" /></form>~;
753    $output =~ s/<\/form>/$addsession/gxsm;
754
755    print_HTML_output_and_finish();
756    return;
757}
758
759sub loadRecentPMs {
760    my ( $pack, $file, $line ) = caller;
761    $yytrace .=
762qq~<br />loadrecentpms from ($pack, $file, $line)<br />=========================~;
763
764    ## put simple, this reads the msg , outbox and storage files to
765    ## harvest already-used membernames
766    my ( @userinbox, @useroutbox, @userstore, @usermessages );
767    if ( -e "$memberdir/$username.msg" ) {
768        fopen( USERMSG, "$memberdir/$username.msg" );
769        @userinbox = <USERMSG>;
770        fclose(USERMSG);
771        if (@userinbox) { push @usermessages, @userinbox; }
772        undef @userinbox;
773    }
774    if ( -e "$memberdir/$username.outbox" ) {
775        fopen( USEROUT, "$memberdir/$username.outbox" );
776        @useroutbox = <USEROUT>;
777        fclose(USEROUT);
778        if (@useroutbox) { push @usermessages, @useroutbox; }
779        undef @useroutbox;
780    }
781    if ( -e "$memberdir/$username.imstore" ) {
782        fopen( USERSTR, "$memberdir/$username.imstore" );
783        @userstore = <USERSTR>;
784        fclose(USERSTR);
785        if (@userstore) { push @usermessages, @userstore; }
786        undef @userstore;
787    }
788    if ( !@usermessages ) { return; }
789    @recentUsers = ();
790    foreach my $usermessage (@usermessages) {
791        ## split down to all strings of names
792        my (
793            $messid, $fromName,   $toNames, $toCCNames, $toBCCNames,
794            undef,   undef,       undef,    undef,      undef,
795            undef,   $messStatus, undef
796        ) = split /\|/xsm, $usermessage;    # pull name from PM
797        if ( $messStatus =~ m/b/sm || $messStatus =~ m/g/sm ) { next; }
798        ## push all name strings
799        if ( $fromName && $fromName ne $username ) {
800            push @recentUsers, $fromName;
801        }
802        if ($toNames) {
803            foreach my $listItem ( split /\,/xsm, $toNames ) {
804                if ( $listItem ne $username ) { push @recentUsers, $listItem; }
805            }
806        }
807        if ($toCCNames) {
808            foreach my $listItem ( split /\,/xsm, $toCCNames ) {
809                if ( $listItem ne $username ) {
810                    push @recentUsers, $listItem;
811                }
812            }
813        }
814        if ($toBCCNames) {
815            foreach my $listItem ( split /\,/xsm, $toBCCNames ) {
816                if ( $listItem ne $username ) {
817                    push @recentUsers, $listItem;
818                }
819            }
820        }
821    }
822    @recentUsers = undupe(@recentUsers);
823    @recentUsers = sort @recentUsers;
824    return @recentUsers;
825}
826
827sub quickSearch {
828    if ( !$iamadmin && !$iamgmod ) { fatal_error('no_access'); }
829
830    $to_id  = $INFO{'toid'};
831    $yymain = $my_quickSearch;
832    $yymain =~ s/{yabb to_id}/$to_id/gsm;
833
834    $yytitle = $usersel_txt{'modpagetitle'};
835    userselectTemplate();
836    return;
837}
838
839sub doquicksearch {
840    if ( !$iamadmin && !$iamgmod ) { fatal_error('no_access'); }
841
842    ManageMemberinfo('load');
843    my (@matches);
844    foreach my $membername (
845        sort { lc $memberinf{$a} cmp lc $memberinf{$b} }
846        keys %memberinf
847      )
848    {
849        my ( $realname, undef ) = split /\|/xsm, $memberinf{$membername}, 2;
850        if ( $realname =~ /^$INFO{'letter'}/ixsm ) {
851            push @matches, $realname, $membername;
852        }
853    }
854    print "Content-type: text/plain\n\n"
855      or croak "$croak{'print'} content-type";
856    print join q{,}, @matches or croak "$croak{'print'} matches";
857
858    CORE::exit;    # This is here only to avoid server error log entries!
859    return;
860}
861
862sub checkUserAvail {
863    LoadLanguage('Register');
864    my $taken = 'false';
865
866    fopen( RESERVE, "$vardir/reserve.txt" )
867      or fatal_error( 'cannot_open', "$vardir/reserve.txt", 1 );
868    @reserve = <RESERVE>;
869    fclose(RESERVE);
870    fopen( RESERVECFG, "$vardir/reservecfg.txt" )
871      or fatal_error( 'cannot_open', "$vardir/reservecfg.txt", 1 );
872    @reservecfg = <RESERVECFG>;
873    fclose(RESERVECFG);
874
875    for my $i ( 0 .. ( @reservecfg - 1 ) ) {
876        chomp $reservecfg[$i];
877    }
878    $matchword = $reservecfg[0] eq 'checked';
879    $matchcase = $reservecfg[1] eq 'checked';
880    $matchuser = $reservecfg[2] eq 'checked';
881    $matchname = $reservecfg[3] eq 'checked';
882    $namecheck = $matchcase eq 'checked' ? $INFO{'user'} : lc $INFO{'user'};
883    $realnamecheck =
884      $matchcase eq 'checked' ? $INFO{'display'} : lc $INFO{'display'};
885
886    if ( $INFO{'type'} eq 'email' ) {
887        $INFO{'email'} =~ s/\A\s+|\s+\z//gxsm;
888        $type = $register_txt{'112'};
889        if (
890            lc $INFO{'email'} eq lc MemberIndex( 'check_exist', $INFO{'email'}, 2 )
891          )
892        {
893            $taken = 'true';
894        }
895    }
896    elsif ( $INFO{'type'} eq 'display' ) {
897        $INFO{'display'} =~ s/\A\s+|\s+\z//gxsm;
898        $type = $register_txt{'111'};
899        if (
900            (
901                lc $INFO{'display'} eq
902                lc MemberIndex( 'check_exist', $INFO{'display'}, 1 )
903            )
904            && ( lc $INFO{'display'} ne lc ${ $uid . $username }{'realname'} )
905          )
906        {
907            $taken = 'true';
908        }
909        if ($matchname) {
910            foreach my $reserved (@reserve) {
911                chomp $reserved;
912                $reservecheck = $matchcase ? $reserved : lc $reserved;
913                if ($matchword) {
914                    if ( $realnamecheck eq $reservecheck ) {
915                        $taken = 'reg';
916                        break;
917                    }
918                }
919                else {
920                    if ( $realnamecheck =~ $reservecheck ) {
921                        $taken = 'reg';
922                        break;
923                    }
924                }
925            }
926        }
927    }
928    elsif ( $INFO{'type'} eq 'user' ) {
929        $INFO{'user'} =~ s/\A\s+|\s+\z//gxsm;
930        $INFO{'user'} =~ s/\s/_/gxsm;
931        $type = $register_txt{'110'};
932        if (
933            lc $INFO{'user'} eq lc MemberIndex( 'check_exist', $INFO{'user'}, 0 ) )
934        {
935            $taken = 'true';
936        }
937        if ($matchuser) {
938            foreach my $reserved (@reserve) {
939                chomp $reserved;
940                $reservecheck = $matchcase ? $reserved : lc $reserved;
941                if ($matchword) {
942                    if ( $namecheck eq $reservecheck ) {
943                        $taken = 'reg';
944                        break;
945                    }
946                }
947                else {
948                    if ( $namecheck =~ $reservecheck ) {
949                        $taken = 'reg';
950                        break;
951                    }
952                }
953            }
954        }
955    }
956
957    if ( $taken eq 'false' ) {
958        $avail =
959qq~<img src="$imagesdir/check.png">&nbsp;&nbsp;<span style="color:#00dd00">$type$register_txt{'114'}</span>~;
960    }
961    elsif ( $taken eq 'true' ) {
962        $avail =
963qq~<img src="$imagesdir/cross.png">&nbsp;&nbsp;<span style="color:#dd0000">$type$register_txt{'113'}</span>~;
964    }
965    else {
966        $avail =
967qq~<img src="$imagesdir/cross.png">&nbsp;&nbsp;<span style="color:#dd0000">$type$register_txt{'115'}</span>~;
968    }
969
970    print "Content-type: text/plain;charset=$yymycharset;\n\n$INFO{'type'}|$avail"
971      or croak "$croak{'print'} avail";
972
973    CORE::exit;    # This is here only to avoid server error log entries!
974    return;
975}
976
9771;
978