1###############################################################################
2# ViewMembers.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###############################################################################
15# use strict;
16our $VERSION = '2.6.11';
17
18$viewmemberspmver = 'YaBB 2.6.11 $Revision: 1611 $';
19if ( $action eq 'detailedversion' ) { return 1; }
20
21LoadLanguage('MemberList');
22
23is_admin_or_gmod();
24
25my ( $sortmode, $sortorder, $spages );
26
27$MembersPerPage = $TopAmmount;
28$maxbar         = 100;
29
30sub Ml {
31
32    # Decides how to sort memberlist, and gives default sort order
33    if ( !$barmaxnumb ) { $barmaxnumb = 500; }
34    if ( $barmaxdepend == 1 ) {
35        $barmax = 1;
36        ManageMemberinfo('load');
37        while ( ( $key, $value ) = each %memberinf ) {
38            ( undef, undef, undef, $memposts ) = split /\|/xsm, $value;
39            if ( $memposts > $barmax ) { $barmax = $memposts; }
40        }
41        undef %memberinf;
42    }
43    else {
44        $barmax = $barmaxnumb;
45    }
46
47    $FORM{'sortform'} ||= $INFO{'sortform'};
48    if ( !$INFO{'sort'} && !$FORM{'sortform'} ) {
49        $INFO{'sort'}     = $defaultml;
50        $FORM{'sortform'} = $defaultml;
51    }
52
53    if (   $FORM{'sortform'} eq 'username'
54        || $INFO{'sort'} eq 'mlletter'
55        || $INFO{'sort'} eq 'username' )
56    {
57        $page     = 'a';
58        $showpage = 'A';
59        while ( $page ne 'z' ) {
60            $LetterLinks .=
61qq(<a href="$adminurl?action=ml;sort=mlletter;letter=$page" class="catbg a"><b>$showpage&nbsp;</b></a> );
62            $page++;
63            $showpage++;
64        }
65        $LetterLinks .=
66qq(<a href="$adminurl?action=ml;sort=mlletter;letter=z" class="catbg a"><b>Z</b></a>  <a href="$adminurl?action=ml;sort=mlletter;letter=other" class="catbg a"><b>$ml_txt{'800'}</b></a> );
67    }
68
69    if ( $INFO{'start'} eq q{} ) { $start = 0; }
70    else { $start = $INFO{'start'}; $spages = ";start=$start"; }
71
72    if ( $INFO{'sort'} ne q{} ) { $sortmode = ';sort=' . $INFO{'sort'}; }
73    elsif ( $FORM{'sortform'} ne q{} ) {
74        $sortmode = ';sort=' . $FORM{'sortform'};
75    }
76    if ( $INFO{'reversed'} || $FORM{'reversed'} ) {
77        $selReversed = q~ checked="checked"~;
78        $sortorder   = ';reversed=1';
79    }
80
81    $actualnum = 0;
82    $numshown  = 0;
83    $selPost_a = q~windowbg2~;
84    $selReg_a = q~windowbg2~;
85    $selPos_a = q~windowbg2~;
86    $selLastOn_a = q~windowbg2~;
87    $selLastPost_a = q~windowbg2~;
88    $selLastIM_a = q~windowbg2~;
89    $selUser_a = q~windowbg2~;
90    if ( $FORM{'sortform'} eq 'posts' || $INFO{'sort'} eq 'posts' ) {
91        $selPost_a = q~windowbg~;
92        $selPost .= q~ selected="selected"~;
93        MLTop();
94    }
95    if ( $FORM{'sortform'} eq 'regdate' || $INFO{'sort'} eq 'regdate' ) {
96        $selReg .= q~ selected="selected"~;
97        $selReg_a = q~windowbg~;
98        MLDate();
99    }
100    if ( $FORM{'sortform'} eq 'position' || $INFO{'sort'} eq 'position' ) {
101        $selPos .= q~ selected="selected"~;
102        $selPos_a = q~windowbg~;
103        MLPosition();
104    }
105    if ( $FORM{'sortform'} eq 'lastonline' || $INFO{'sort'} eq 'lastonline' ) {
106        $selLastOn .= q~ selected="selected"~;
107        $selLastOn_a = q~windowbg~;
108        MLLastOnline();
109    }
110    if ( $FORM{'sortform'} eq 'lastpost' || $INFO{'sort'} eq 'lastpost' ) {
111        $selLastPost .= q~ selected="selected"~;
112        $selLastPost_a = q~windowbg~;
113        MLLastPost();
114    }
115    if ( $FORM{'sortform'} eq 'lastim' || $INFO{'sort'} eq 'lastim' ) {
116        $selLastIm .= q~ selected="selected"~;
117        $selLastIM_a = q~windowbg~;
118        MLLastIm();
119    }
120    if ( $FORM{'sortform'} eq 'memsearch' || $INFO{'sort'} eq 'memsearch' ) {
121        FindMembers();
122    }
123    if (   $INFO{'sort'} eq q{}
124        || $INFO{'sort'} eq 'mlletter'
125        || $INFO{'sort'} eq 'username' )
126    {
127        $selUser .= q~ selected="selected"~;
128        $selUser_a = q~windowbg~;
129        MLByLetter();
130    }
131    return;
132}
133
134sub MLByLetter {
135    $letter = lc $INFO{'letter'};
136    $i      = 0;
137    ManageMemberinfo('load');
138    foreach my $membername (
139        sort { lc $memberinf{$a} cmp lc $memberinf{$b} }
140        keys %memberinf
141      )
142    {
143        ( $memrealname, $mememail, undef, undef ) =
144          split /\|/xsm, $memberinf{$membername};
145        if ($letter) {
146            $SearchName = lc( substr $memrealname, 0, 1 );
147            if ( $SearchName eq $letter ) { $ToShow[$i] = $membername; $i++; }
148            elsif ( $letter eq 'other'
149                && ( ( $SearchName lt 'a' ) || ( $SearchName gt 'z' ) ) )
150            {
151                $ToShow[$i] = $membername;
152                $i++;
153            }
154        }
155        else {
156            $ToShow[$i] = $membername;
157            $i++;
158        }
159    }
160    undef %memberinf;
161
162    $memcount = @ToShow;
163    if ( !$memcount && $letter ) {
164        $pageindex1 =
165qq~<span class="index-togl small">$admin_img{'index_togl'}</span>~;
166        $pageindex2 =
167qq~<span class="index-togl small">$admin_img{'index_togl'}</span>~;
168    }
169    else {
170        buildIndex();
171    }
172    buildPages(1);
173    $bb = $start;
174
175    if ($memcount) {
176        while ( $numshown < $MembersPerPage ) {
177            showRows( $ToShow[$bb] );
178            $numshown++;
179            $bb++;
180        }
181    }
182    else {
183        if ($letter) {
184            $yymain .= qq~<tr>
185    <td class="windowbg center" colspan="7">
186        <div class="pad-more"><b>$ml_txt{'760'}</b></div>
187    </td>
188</tr>~;
189        }
190    }
191
192    undef @ToShow;
193    buildPages(0);
194    $yytitle     = "$ml_txt{'312'} $numshow";
195    $action_area = 'viewmembers';
196    AdminTemplate();
197    return;
198}
199
200sub MLTop {
201    %top_list = ();
202
203    ManageMemberinfo('load');
204    while ( ( $membername, $value ) = each %memberinf ) {
205        ( $memrealname, undef, undef, $memposts ) = split /\|/xsm, $value;
206        $memposts = sprintf '%06d', ( 999_999 - $memposts );
207        $top_list{$membername} = qq~$memposts|$memrealname~;
208    }
209    undef %memberinf;
210    my @toplist = sort { lc $top_list{$a} cmp lc $top_list{$b} } keys %top_list;
211
212    if ( $FORM{'reversed'} || $INFO{'reversed'} ) {
213        @toplist = reverse @toplist;
214    }
215
216    $memcount = @toplist;
217    buildIndex();
218    buildPages(1);
219    $bb = $start;
220
221    while ( $numshown < $MembersPerPage ) {
222        showRows( $toplist[$bb] );
223        $numshown++;
224        $bb++;
225    }
226
227    undef @toplist;
228    buildPages(0);
229    $yytitle     = "$ml_txt{'313'} $ml_txt{'314'} $numshow";
230    $action_area = 'viewmembers';
231    AdminTemplate();
232    return;
233}
234
235sub MLPosition {
236    %TopMembers = ();
237
238    ManageMemberinfo('load');
239    while ( ( $membername, $value ) = each %memberinf ) {
240        ( $memberrealname, undef, $memposition, $memposts ) =
241          split /\|/xsm, $value;
242        $pstsort    = 99_999_999 - $memposts;
243        $sortgroups = q{};
244        foreach my $key ( keys %Group ) {
245            if ( $memposition eq $key ) {
246                if ( $key eq 'Administrator' ) {
247                    $sortgroups = "aaa.$pstsort.$memberrealname";
248                }
249                elsif ( $key eq 'Global Moderator' ) {
250                    $sortgroups = "bbb.$pstsort.$memberrealname";
251                }
252                elsif ( $key eq 'Mid Moderator' ) {
253                    $sortgroups = "bcc.$pstsort.$memberrealname";
254                }
255            }
256        }
257        if ( !$sortgroups ) {
258            foreach ( sort { $a <=> $b } keys %NoPost ) {
259                if ( $memposition eq $_ ) {
260                    $sortgroups = "ddd.$memposition.$pstsort.$memberrealname";
261                }
262            }
263        }
264        if ( !$sortgroups ) {
265            $sortgroups = "eee.$pstsort.$memposition.$memberrealname";
266        }
267        $TopMembers{$membername} = $sortgroups;
268    }
269    my @toplist =
270      sort { lc $TopMembers{$a} cmp lc $TopMembers{$b} } keys %TopMembers;
271
272    if ( $FORM{'reversed'} || $INFO{'reversed'} ) {
273        @toplist = reverse @toplist;
274    }
275
276    $memcount = @toplist;
277    buildIndex();
278    buildPages(1);
279    $bb = $start;
280
281    while ( $numshown < $MembersPerPage ) {
282        showRows( $toplist[$bb] );
283        $numshown++;
284        $bb++;
285    }
286
287    undef @toplist;
288    undef %memberinf;
289    buildPages(0);
290    $yytitle     = "$ml_txt{'313'} $ml_txt{'4'} $ml_txt{'87'} $numshow";
291    $action_area = 'viewmembers';
292    AdminTemplate();
293    return;
294}
295
296sub MLDate {
297    fopen( MEMBERLISTREAD, "$memberdir/memberlist.txt" );
298    @tempmemlist = <MEMBERLISTREAD>;
299    fclose(MEMBERLISTREAD);
300    if ( $FORM{'reversed'} || $INFO{'reversed'} ) {
301        @tempmemlist = reverse @tempmemlist;
302    }
303
304    $memcount = @tempmemlist;
305    buildIndex();
306    buildPages(1);
307    $bb = $start;
308
309    while ( $numshown < $MembersPerPage ) {
310        ( $membername, undef ) = split /\t/xsm, $tempmemlist[$bb], 2;
311        showRows($membername);
312        $numshown++;
313        $bb++;
314    }
315
316    $yymain .= $TableFooter;
317    buildPages(0);
318    $yytitle     = "$ml_txt{'313'} $ml_txt{'4'} $ml_txt{'233'}";
319    $action_area = 'viewmembers';
320    AdminTemplate();
321    return;
322}
323
324sub showRows {
325    my ($user) = @_;
326    if ( $user ne q{} ) {
327        LoadUser($user);
328        $date2 = $date;
329
330        my $userlastonline = ${ $uid . $user }{'lastonline'};
331        my $userlastpost   = ${ $uid . $user }{'lastpost'};
332        my $userlastim     = ${ $uid . $user }{'lastim'};
333
334        $date1 = stringtotime( ${ $uid . $user }{'regdate'} );
335        calcdifference();
336        $days_reg = $result;
337
338        my ( $tmpa, $tmpb, $tmpc );
339        if ( $userlastonline eq q{} ) { $userlastonline = q{-};
340             $date1 = stringtotime( ${ $uid . $user }{'regdate'} );
341            calcdifference();
342            $tmpa = $result;
343            }
344        else {
345            $date1 = $userlastonline;
346            calcdifference();
347            $userlastonline = $result;
348            $tmpa           = $userlastonline;
349        }
350        if ( $userlastpost eq q{} ) { $userlastpost = q{-};
351             $date1 = stringtotime( ${ $uid . $user }{'regdate'} );
352            calcdifference();
353            $tmpb = $result;
354            }
355        else {
356            $date1 = $userlastpost;
357            calcdifference();
358            $userlastpost = $result;
359             $tmpb         = $userlastpost;
360        }
361        if ( $userlastim eq q{} ) { $userlastim = q{-};
362            $date1 = stringtotime( ${ $uid . $user }{'regdate'} );
363            calcdifference();
364            $tmpc = $result;
365            }
366        else {
367            $date1 = $userlastim;
368            calcdifference();
369            $userlastim = $result;
370            $tmpc       = $userlastim;
371        }
372        $userlastonline = NumberFormat($userlastonline);
373        $userlastpost   = NumberFormat($userlastpost);
374        $userlastim     = NumberFormat($userlastim);
375        $userpostcount  = NumberFormat( ${ $uid . $user }{'postcount'} );
376
377        if ( $user ne 'admin' ) {
378            $CheckingAll .=
379qq~"$days_reg|${$uid.$user}{'postcount'}|$tmpa|$tmpb|$tmpc|$user", ~;
380        }
381
382        $barchart = ${ $uid . $user }{'postcount'};
383        $bartemp  = ( ${ $uid . $user }{'postcount'} * $maxbar );
384        $barwidth = ( $bartemp / $barmax );
385        $barwidth = ( $barwidth + 0.5 );
386        $barwidth = int $barwidth;
387        if ( $barwidth > $maxbar ) { $barwidth = $maxbar }
388        if ( $barchart < 1 )       { $Bar      = '&nbsp;'; }
389        else {
390            $Bar =
391qq~<img src="$imagesdir/bar.gif" width="$barwidth" height="10" alt="" />~;
392        }
393
394        $dr_regdate = timeformat( ${ $uid . $user }{'regtime'} );
395        $dr_regdate =~ s/(.*)(, 1?[0-9]):[0-9][0-9].*/$1/sm;
396
397        my $memberinfo = '&nbsp;';
398        if ( ${ $uid . $user }{'realname'} eq q{} ) {
399            ${ $uid . $user }{'realname'} = $user;
400        }
401        if ( ${ $uid . $user }{'position'} eq q{} && $showallgroups ) {
402            foreach my $postamount ( reverse sort { $a <=> $b } keys %Post ) {
403                if ( ${ $uid . $user }{'postcount'} > $postamount ) {
404                    (
405                        $memberinfo, $stars,     $starpic,    $color,
406                        $noshow,     $viewperms, $topicperms, $replyperms,
407                        $pollperms,  $attachperms
408                    ) = split /\|/xsm, $Post{$postamount};
409                    last;
410                }
411            }
412        }
413        elsif ( ${ $uid . $user }{'position'} ne q{} ) {
414            $tempgroups = 0;
415            foreach ( keys %Group ) {
416                if ( ${ $uid . $user }{'position'} eq $_ ) {
417                    (
418                        $memberinfo, $stars,     $starpic,    $color,
419                        $noshow,     $viewperms, $topicperms, $replyperms,
420                        $pollperms,  $attachperms
421                    ) = split /\|/xsm, $Group{$_};
422                    $tempgroups = 1;
423                    last;
424                }
425            }
426            if ( !$tempgroups ) {
427                foreach ( sort { $a <=> $b } keys %NoPost ) {
428                    if ( ${ $uid . $user }{'position'} eq $_ ) {
429                        (
430                            $memberinfo, $stars,      $starpic,
431                            $color,      $noshow,     $viewperms,
432                            $topicperms, $replyperms, $pollperms,
433                            $attachperms
434                        ) = split /\|/xsm, $NoPost{$_};
435                        $tempgroups = 1;
436                        last;
437                    }
438                }
439            }
440            if ( !$tempgroups ) {
441                $memberinfo = ${ $uid . $user }{'position'};
442            }
443        }
444
445        $yymain .= qq~<tr>
446        <td class="windowbg">$link{$user}</td>~;
447
448        if ( $user eq 'admin' ) {
449            $addel = q~&nbsp;~;
450        }
451        else {
452            $addel =
453qq~<input type="checkbox" name="member$numshown" value="$user" class="windowbg" style="border: 0; vertical-align: middle;" />~;
454            $actualnum++;
455        }
456
457        $yymain .= qq~
458        <td class="windowbg">$memberinfo</td>
459        <td class="windowbg2 center">$userpostcount</td>
460        <td class="windowbg">$Bar</td>
461        <td class="windowbg">$dr_regdate &nbsp;</td>
462        <td class="windowbg2 center">$userlastonline</td>
463        <td class="windowbg2 center">$userlastpost</td>
464        <td class="windowbg2 center">$userlastim</td>
465        <td class="windowbg center">$addel</td>
466    </tr>~;
467    }
468    return;
469}
470
471sub buildIndex {
472    if ( $memcount != 0 ) {
473
474        ( undef, undef, $usermemberpage ) =
475          split /\|/xsm, ${ $uid . $username }{'pageindex'};
476
477        # Build the page links list.
478        my ( $pagetxtindex, $pagedropindex1, $pagedropindex2, $all,
479            $allselected );
480        $indexdisplaynum = 3;
481        $dropdisplaynum  = 10;
482        if ( $FORM{'sortform'} eq q{} ) { $FORM{'sortform'} = $INFO{'sort'}; }
483        $postdisplaynum = 3;
484        $startpage      = 0;
485        $max            = $memcount;
486        if ( $INFO{'start'} eq 'all' ) {
487            $MembersPerPage = $max;
488            $all            = 1;
489            $allselected    = q~ selected="selected"~;
490            $start          = 0;
491        }
492        else { $start = $INFO{'start'} || 0; }
493        $start    = $start > $memcount - 1 ? $memcount - 1 : $start;
494        $start    = ( int( $start / $MembersPerPage ) ) * $MembersPerPage;
495        $tmpa     = 1;
496        $pagenumb = int( ( $memcount - 1 ) / $MembersPerPage ) + 1;
497
498        if ( $start >= ( ( $postdisplaynum - 1 ) * $MembersPerPage ) ) {
499            $startpage = $start - ( ( $postdisplaynum - 1 ) * $MembersPerPage );
500            $tmpa = int( $startpage / $MembersPerPage ) + 1;
501        }
502        if ( $memcount >= $start + ( $postdisplaynum * $MembersPerPage ) ) {
503            $endpage = $start + ( $postdisplaynum * $MembersPerPage );
504        }
505        else { $endpage = $memcount }
506        $lastpn = int( ( $memcount - 1 ) / $MembersPerPage ) + 1;
507        $lastptn = ( $lastpn - 1 ) * $MembersPerPage;
508        $pageindex1 =
509qq~<span class="index-togl small">$admin_img{'index_togl'} $ml_txt{'139'}: $pagenumb</span>~;
510        $pageindex2 =
511qq~<span class="index-togl small">$admin_img{'index_togl'} $ml_txt{'139'}: $pagenumb</span>~;
512        if ( $pagenumb > 1 || $all ) {
513
514            if ( $usermemberpage == 1 ) {
515                $pagetxtindexst =
516qq~<span class="index-togl small"><a href="$scripturl?action=memberpagedrop;from=admin;sort=$INFO{'sort'};letter=$INFO{'letter'};start=$INFO{'start'}$sortorder"><img src="$imagesdir/index_togl.png" alt="$ml_txt{'19'}" title="$ml_txt{'19'}" /></a> $ml_txt{'139'}: ~;
517                if ( $startpage > 0 ) {
518                    $pagetxtindex =
519qq~<a href="$adminurl?action=ml;sort=$FORM{'sortform'};letter=$letter$sortorder" class="norm">1</a>&nbsp;...&nbsp;~;
520                }
521                if ( $startpage == $MembersPerPage ) {
522                    $pagetxtindex =
523qq~<a href="$adminurl?action=ml;sort=$FORM{'sortform'};letter=$letter$sortorder" class="norm">1</a>&nbsp;~;
524                }
525                foreach my $counter ( $startpage .. ( $endpage - 1 ) ) {
526                    if ( $counter % $MembersPerPage == 0 ) {
527                        $pagetxtindex .=
528                          $start == $counter
529                          ? qq~<b>[$tmpa]</b>&nbsp;~
530                          : qq~<a href="$adminurl?action=ml;sort=$FORM{'sortform'};letter=$letter;start=$counter$sortorder" class="norm">$tmpa</a>&nbsp;~;
531                        $tmpa++;
532                    }
533                }
534                if ( $endpage < $memcount - $MembersPerPage ) {
535                    $pageindexadd = q~...&nbsp;~;
536                }
537                if ( $endpage != $memcount ) {
538                    $pageindexadd .=
539qq~<a href="$adminurl?action=ml;sort=$FORM{'sortform'};letter=$letter;start=$lastptn$sortorder" class="norm">$lastpn</a>~;
540                }
541                $pagetxtindex .= qq~$pageindexadd~;
542                $pageindex1 = qq~$pagetxtindexst$pagetxtindex</span>~;
543                $pageindex2 = qq~$pagetxtindexst$pagetxtindex</span>~;
544            }
545            else {
546                $pagedropindex1 =
547q~<span style="float: left; width: 350px; margin: 2px 0 0 0; border: 0;">~;
548                $pagedropindex1 .=
549qq~<span style="float: left; height: 21px; margin: 0 4px 0 0;"><a href="$scripturl?action=memberpagetext;from=admin;sort=$INFO{'sort'};letter=$INFO{'letter'};start=$INFO{'start'}$sortorder"><img src="$imagesdir/index_togl.png" alt="$ml_txt{'19'}" title="$ml_txt{'19'}" /></a></span>~;
550                $pagedropindex2 = $pagedropindex1;
551                $tstart         = $start;
552                if ( substr( $INFO{'start'}, 0, 3 ) eq 'all' ) {
553                    ( $tstart, $start ) = split /\-/xsm, $INFO{'start'};
554                }
555                $d_indexpages = $pagenumb / $dropdisplaynum;
556                $i_indexpages = int( $pagenumb / $dropdisplaynum );
557                if ( $d_indexpages > $i_indexpages ) {
558                    $indexpages = int( $pagenumb / $dropdisplaynum ) + 1;
559                }
560                else { $indexpages = int( $pagenumb / $dropdisplaynum ) }
561                $selectedindex =
562                  int( ( $start / $MembersPerPage ) / $dropdisplaynum );
563
564                if ( $pagenumb > $dropdisplaynum ) {
565                    $pagedropindex1 .=
566qq~<span style="float: left; height: 21px; margin: 0;"><select size="1" name="decselector1" id="decselector1" onchange="if(this.options[this.selectedIndex].value) SelDec(this.options[this.selectedIndex].value, 'xx')">\n~;
567                    $pagedropindex2 .=
568qq~<span style="float: left; height: 21px; margin: 0;"><select size="1" name="decselector2" id="decselector2" onchange="if(this.options[this.selectedIndex].value) SelDec(this.options[this.selectedIndex].value, 'xx')">\n~;
569                }
570                for my $i ( 0 .. ( $indexpages - 1 ) ) {
571                    $indexpage  = ( $i * $dropdisplaynum ) * $MembersPerPage;
572                    $indexstart = ( $i * $dropdisplaynum ) + 1;
573                    $indexend   = $indexstart + ( $dropdisplaynum - 1 );
574                    if ( $indexend > $pagenumb ) { $indexend = $pagenumb; }
575                    if ( $indexstart == $indexend ) {
576                        $indxoption = qq~$indexstart~;
577                    }
578                    else { $indxoption = qq~$indexstart-$indexend~; }
579                    $selected = q{};
580                    if ( $i == $selectedindex ) {
581                        $selected = q~ selected="selected"~;
582                        $pagejsindex =
583                          qq~$indexstart|$indexend|$MembersPerPage|$indexpage~;
584                    }
585                    if ( $pagenumb > $dropdisplaynum ) {
586                        $pagedropindex1 .=
587qq~<option value="$indexstart|$indexend|$MembersPerPage|$indexpage"$selected>$indxoption</option>\n~;
588                        $pagedropindex2 .=
589qq~<option value="$indexstart|$indexend|$MembersPerPage|$indexpage"$selected>$indxoption</option>\n~;
590                    }
591                }
592                if ( $pagenumb > $dropdisplaynum ) {
593                    $pagedropindex1 .= qq~</select>\n</span>~;
594                    $pagedropindex2 .= qq~</select>\n</span>~;
595                }
596                $pagedropindex1 .=
597q~<span id="ViewIndex1" class="droppageindex" style="height: 14px; visibility: hidden">&nbsp;</span>~;
598                $pagedropindex2 .=
599q~<span id="ViewIndex2" class="droppageindex" style="height: 14px; visibility: hidden">&nbsp;</span>~;
600                $tmpMembersPerPage = $MembersPerPage;
601                if ( substr( $INFO{'start'}, 0, 3 ) eq 'all' ) {
602                    $MembersPerPage = $MembersPerPage * $dropdisplaynum;
603                }
604                $prevpage = $start - $tmpMembersPerPage;
605                $nextpage = $start + $MembersPerPage;
606                $pagedropindexpvbl =
607qq~<img src="$imagesdir/index_left0.png" height="14" width="13" alt="" style="vertical-align: top; margin-top:-1px" />~;
608                $pagedropindexnxbl =
609qq~<img src="$imagesdir/index_right0.png" height="14" width="13" alt="" style="vertical-align: top; margin-top:-1px;" />~;
610                if ( $start < $MembersPerPage ) {
611                    $pagedropindexpv .=
612qq~<img src="$imagesdir/index_left0.png" height="14" width="13" alt="" style="vertical-align: top; margin-top:-1px" />~;
613                }
614                else {
615                    $pagedropindexpv .=
616qq~<img src="$imagesdir/index_left.png" height="14" width="13" alt="$pidtxt{'02'}" title="$pidtxt{'02'}" style="vertical-align: top; cursor: pointer; margin-top:-1px;" onclick="location.href=\\'$adminurl?action=ml;sort=$FORM{'sortform'};letter=$letter;start=$prevpage$sortorder\\'" ondblclick="location.href=\\'$adminurl?action=ml;sort=$FORM{'sortform'};letter=$letter;start=0$sortorder\\'" />~;
617                }
618                if ( $nextpage > $lastptn ) {
619                    $pagedropindexnx .=
620qq~<img src="$imagesdir/index_right0.png" height="14" width="13" alt="" style="vertical-align: top; margin-top:-1px;" />~;
621                }
622                else {
623                    $pagedropindexnx .=
624qq~<img src="$imagesdir/index_right.png" height="14" width="13" alt="$pidtxt{'03'}" title="$pidtxt{'03'}" style="display: inline; vertical-align: top; margin-top:-1px; cursor: pointer;" onclick="location.href=\\'$adminurl?action=ml;sort=$FORM{'sortform'};letter=$letter;start=$nextpage$sortorder\\'" ondblclick="location.href=\\'$adminurl?action=ml;sort=$FORM{'sortform'};letter=$letter;start=$lastptn$sortorder\\'" />~;
625                }
626                $pageindex1 = qq~$pagedropindex1</span>~;
627                $pageindex2 = qq~$pagedropindex2</span>~;
628
629                $pageindexjs = qq~
630<script type="text/javascript">
631    function SelDec(decparam, visel) {
632        splitparam = decparam.split("|");
633        var vistart = parseInt(splitparam[0]);
634        var viend = parseInt(splitparam[1]);
635        var maxpag = parseInt(splitparam[2]);
636        var pagstart = parseInt(splitparam[3]);
637        var allpagstart = parseInt(splitparam[3]);
638        if(visel == 'xx' && decparam == '$pagejsindex') visel = '$tstart';
639        var pagedropindex = '<table><tr>';
640        for(i=vistart; i<=viend; i++) {
641            if(visel == pagstart) pagedropindex += '<td class="titlebg" style="height: 14px; padding:0 1px; font-size: 9px; font-weight: bold">' + i + '</td>';
642            else pagedropindex += '<td class="droppages" style="line-height:14px; padding:0 1px"><a href="$adminurl?action=ml;sort=$FORM{'sortform'};letter=$letter;start=' + pagstart + '$sortorder">' + i + '</a></td>';
643            pagstart += maxpag;
644        }
645        ~;
646                if ($showpageall) {
647                    $pageindexjs .= qq~
648            if (vistart != viend) {
649                if(visel == 'all') pagedropindex += '<td class="titlebg" style="line-height: 14px; padding:0 1px; font-size: 9px; font-weight: normal;"><b>$pidtxt{"01"}</b></td>';
650                else pagedropindex += '<td class="droppages" style="line-height:14px; padding:0 1px"><a href="$adminurl?action=ml;sort=$FORM{'sortform'};letter=$letter;start=all-' + allpagstart + '$sortorder">$pidtxt{"01"}</a></td>';
651            }
652            ~;
653                }
654                $pageindexjs .= qq~
655        if(visel != 'xx') pagedropindex += '<td class="small" style="line-height: 14px; padding:0 0 0 4px;">$pagedropindexpv$pagedropindexnx</td>';
656        else pagedropindex += '<td class="small" style="line-height: 14px; padding:0 0 0 4px;">$pagedropindexpvbl$pagedropindexnxbl</td>';
657        pagedropindex += '</tr></table>';
658        document.getElementById("ViewIndex1").innerHTML=pagedropindex;
659        document.getElementById("ViewIndex1").style.visibility = "visible";
660        document.getElementById("ViewIndex2").innerHTML=pagedropindex;
661        document.getElementById("ViewIndex2").style.visibility = "visible";
662        ~;
663                if ( $pagenumb > $dropdisplaynum ) {
664                    $pageindexjs .= q~
665        document.getElementById("decselector1").value = decparam;
666        document.getElementById("decselector2").value = decparam;
667        ~;
668                }
669                $pageindexjs .= qq~
670    }
671    document.onload = SelDec('$pagejsindex', '$tstart');
672</script>
673~;
674            }
675        }
676    }
677
678    return;
679}
680
681sub buildPages {
682    my ($inp) = @_;
683
684    $FindForm .= qq~
685        <script type="text/javascript">
686            function txtInFields(thefield, defaulttxt) {
687            if (thefield.value == defaulttxt) thefield.value = "";
688            else { if (thefield.value === "") thefield.value = defaulttxt; }
689            }
690        </script>
691            <form action="$adminurl?action=ml;sort=memsearch" method="post" id="form1" name="form1" enctype="application/x-www-form-urlencoded" style="display: inline;">
692            <input type="text" name="member" id="member" value="$ml_txt{'801'}" style="font-size: 11px; width: 180px;" onfocus="txtInFields(this, '$ml_txt{'801'}');" onblur="txtInFields(this, '$ml_txt{'801'}')" />
693            <input name="submit" type="submit" class="button" style="font-size: 10px;" value="$ml_txt{'2'}" />
694            </form>
695        ~;
696
697    $TableHeader .= qq~
698        <table class="bordercolor borderstyle border-space pad-cell">
699            <tr>
700                <td class="titlebg right" style="font-size: 11px; text-shadow: none;">
701                    $FindForm
702                    <form action="$adminurl?action=ml" method="post" name="selsort" style="display: inline">
703                        <label for="sortform"><b>$ml_txt{'1'}</b></label>
704                        <select name="sortform" id="sortform" style="font-size: 9pt;" onchange="submit()">
705                        <option value="username"$selUser>$ml_txt{'35'}</option>
706                        <option value="position"$selPos>$ml_txt{'87'}</option>
707                        <option value="posts"$selPost>$ml_txt{'21'}</option>
708                        <option value="regdate"$selReg>$ml_txt{'233'}</option>
709                        <option value="lastonline"$selLastOn>$amv_txt{'9'}</option>
710                        <option value="lastpost"$selLastPost>$amv_txt{'10'}</option>
711                        <option value="lastim"$selLastIm>$amv_txt{'11'}</option>
712                    </select>
713                    <label for="reversed"><b>$admintxt{'37'}</b></label>
714                    <input type="checkbox" onclick="submit()" name="reversed" id="reversed" class="titlebg" style="border: 0;"$selReversed />
715                    <input type="submit" style="display:none" />
716                    </form>
717                </td>
718            </tr>
719        </table>
720        </div>
721        <script src="$yyhtml_root/ubbc.js" type="text/javascript"></script>
722        <script type="text/javascript">
723            if (document.selsort.sortform.options[document.selsort.sortform.selectedIndex].value == 'username') {
724                document.selsort.reversed.disabled = true;
725            }
726        </script>
727        <form name="adv_memberview" action="$adminurl?action=deletemultimembers$sortmode$sortorder$spages" method="post" style="display: inline" onsubmit="return submitproc()">
728        <input type="hidden" name="button" value="0" />
729        <div class="rightboxdiv">
730        <table class="bordercolor borderstyle border-space pad-cell">
731            <colgroup>
732                <col span="2" style="width:19%" />
733                <col style="width:5%" />
734                <col style="width:14%" />
735                <col style="width:19%" />
736                <col style="width:7%" />
737                <col span="2" style="width:6%" />
738            </colgroup>
739            <tr>
740                <td class="$selUser_a center"><a href="$adminurl?action=ml;sortform=username"><b>$ml_txt{'35'}</b></a></td>
741                <td class="$selPos_a center"><a href="$adminurl?action=ml;sortform=position"><b>$ml_txt{'87'}</b></a></td>
742                <td class="$selPost_a center" colspan="2"><a href="$adminurl?action=ml;sortform=posts"><b>$ml_txt{'21'}</b></a></td>
743                <td class="$selReg_a center"><a href="$adminurl?action=ml;sortform=regdate"><b>$ml_txt{'234'}</b></a></td>
744                <td class="windowbg2 center" colspan="3"><b>$amv_txt{'4'}</b>
745                    <br /><span class="small $selLastOn_a" style="float: left; text-align: center; width: 34%;"><a href="$adminurl?action=ml;sortform=lastonline">$amv_txt{'5'}</a></span>
746                    <span class="small $selLastPost_a" style="float: left; text-align: center; width: 33%;"><a href="$adminurl?action=ml;sortform=lastpost">$amv_txt{'6'}</a></span>
747                    <span class="small $selLastIM_a" style="float: left; text-align: center; width: 33%;"><a href="$adminurl?action=ml;sortform=lastim">$amv_txt{'7'}</a></span></td>
748                <td class="windowbg2 center"><b>$admintxt{'38'}</b></td>
749            </tr>
750        ~;
751
752    if ( $LetterLinks ne q{} ) {
753        $TableHeader .= qq(<tr>
754                <td class="catbg" colspan="9"><span class="small">$LetterLinks</span></td>
755            </tr>);
756    }
757
758    $sel_box = qq~
759            <table class="bordercolor borderstyle border-space pad-cell" style="margin-bottom: .5em;">
760                <colgroup>
761                    <col style="width: 95%" />
762                    <col style="width: 5%" />
763                </colgroup>
764                <tr>
765                    <td class="titlebg right" style="font-size: 11px; text-shadow: none;">
766                    <label for="check_all"><b>$amv_txt{'38'}</b></label>
767                    <select name="field2" id="field2" onchange="document.adv_memberview.check_all.checked=true;checkAll(1);">
768                        <option value="0">$amv_txt{'35'}</option>
769                        <option value="1">$amv_txt{'36'}</option>
770                        <option value="2" selected="selected">$amv_txt{'37'}</option>
771                    </select>
772                    <input type="text" size="5" name="number" value="30" maxlength="5" onkeyup="document.adv_memberview.check_all.checked=true;checkAll(1);" />
773                    <select name="field1" onchange="document.adv_memberview.check_all.checked=true;checkAll(1);">
774                        <option value="0">$amv_txt{'30'}</option>
775                        <option value="1">$amv_txt{'31'}</option>
776                        <option value="2" selected="selected">$amv_txt{'32'}</option>
777                        <option value="3">$amv_txt{'33'}</option>
778                        <option value="4">$amv_txt{'34'}</option>
779                    </select>
780                    </td>
781                    <td class="titlebg center">
782                        <input type="checkbox" name="check_all" id="check_all" value="1" class="titlebg" style="border: 0;" onclick="javascript:if(this.checked)checkAll(1);else checkAll(0);" />
783                    </td>
784                </tr>
785            </table>
786        <script type="text/javascript">
787        mem_data = new Array ( "", $CheckingAll"" );
788        function checkAll(ticked) {
789            if(navigator.appName == "Microsoft Internet Explorer") {var alt_pressed = self.event.altKey; var ctrl_pressed = self.event.ctrlKey;}
790            else {alt_pressed = false; ctrl_pressed = false;}
791
792            var limit = document.adv_memberview.number.value;
793            var field1 = document.adv_memberview.field1.value;
794            var field2 = document.adv_memberview.field2.value;
795            for (var i = 1; i <= $actualnum; i++) {
796                if (!ticked) {
797                    document.adv_memberview.elements[i].checked = false;
798                } else {
799                    var value1 = eval(mem_data[i].split("|")[field1]);
800                    if (value1 != undefined) {
801                        var check = 0;
802                        if (field2 === 0 && value1 <  limit) { check = 1; }
803                        if (field2 == 1 && value1 == limit) { check = 1; }
804                        if (field2 == 2 && value1 >  limit) { check = 1; }
805                        if (ctrl_pressed === true) { check = 0; }
806                        if (alt_pressed  === true) { check = 1; }
807                        if (check == 1) document.adv_memberview.elements[i].checked = true;
808                        else            document.adv_memberview.elements[i].checked = false;
809                    }
810                }
811            }
812        }
813        </script>~;
814
815    $numbegin = ( $start + 1 );
816    $numend   = ( $start + $MembersPerPage );
817    if ( $numend > $memcount ) { $numend  = $memcount; }
818    if ( $memcount == 0 )      { $numshow = q{}; }
819    else { $numshow = qq~($numbegin - $numend $ml_txt{'309'} $memcount)~; }
820    if ($inp) {
821        $yymain .= qq~
822    <div class="rightboxdiv">
823    <table class="bordercolor border-space pad-cell">
824        <tr>
825            <td class="titlebg">
826                <span style="float: left;">$admin_img{'register'} <b>$admintxt{'17'}</b></span>
827            </td>
828        </tr><tr>
829            <td class="catbg">
830                <div style="float: left; width: 50%; text-align: left;">$pageindex1</div>
831            </td>
832        </tr>
833    </table>
834    $TableHeader~;
835    }
836    else {
837        $yymain .= qq~<tr>
838        <td class="catbg" colspan="9">
839            <div style="float: left; width: 50%; text-align: left;">$pageindex2</div>
840            $pageindexjs
841            </td>
842        </tr>
843       </table>
844       $sel_box
845    </div>
846    <div class="bordercolor rightboxdiv">
847    <table class="border-space pad-cell">
848        <tr>
849            <th class="titlebg">$admin_img{'prefimg'} $admin_txt{'delete'}</th>
850        </tr><tr>
851            <td class="catbg center">
852                <div class="small"><label for="del_mail">$amv_txt{'45'}:</label> <input type="checkbox" name="del_mail" id="del_mail" value="1" /></div>
853                <input type="submit" value="$amv_txt{'15'}" onclick="javascript:window.document.adv_memberview.button.value = '2'; return confirm('$amv_txt{'20'}')" class="button" />
854            </td>
855         </tr>
856    </table>
857    </div>
858    </form>~;
859    }
860    return;
861}
862
863sub MLLastPost {
864    %TopMembers = ();
865
866    ManageMemberinfo('load');
867    while ( ( $membername, $value ) = each %memberinf ) {
868        LoadUser($membername);
869        $TopMembers{$membername} = ${ $uid . $membername }{'lastpost'};
870        undef %{ $uid . $membername };
871    }
872    undef %memberinf;
873
874    my @toplist =
875      reverse sort { $TopMembers{$a} <=> $TopMembers{$b} } keys %TopMembers;
876    undef %TopMembers;
877
878    if ( $FORM{'reversed'} || $INFO{'reversed'} ) {
879        @toplist = reverse @toplist;
880    }
881
882    $memcount = @toplist;
883    buildIndex();
884    buildPages(1);
885    $bb = $start;
886
887    while ( ( $numshown < $MembersPerPage ) ) {
888        showRows( $toplist[$bb] );
889        $numshown++;
890        $bb++;
891    }
892
893    undef @toplist;
894    buildPages(0);
895
896    $yymain .= $TableFooter;
897    $yytitle     = "$ml_txt{'313'} $TopAmmount $ml_txt{'314'}";
898    $action_area = 'viewmembers';
899    AdminTemplate();
900    return;
901}
902
903sub MLLastIm {
904    %TopMembers = ();
905
906    ManageMemberinfo('load');
907    while ( ( $membername, $value ) = each %memberinf ) {
908        LoadUser($membername);
909        $TopMembers{$membername} = ${ $uid . $membername }{'lastim'};
910        undef %{ $uid . $membername };
911    }
912    undef %memberinf;
913
914    my @toplist =
915      reverse sort { $TopMembers{$a} <=> $TopMembers{$b} } keys %TopMembers;
916    undef %TopMembers;
917
918    if ( $FORM{'reversed'} || $INFO{'reversed'} ) {
919        @toplist = reverse @toplist;
920    }
921
922    $memcount = @toplist;
923    buildIndex();
924    buildPages(1);
925    $bb = $start;
926
927    while ( ( $numshown < $MembersPerPage ) ) {
928        showRows( $toplist[$bb] );
929        $numshown++;
930        $bb++;
931    }
932
933    undef @toplist;
934    buildPages(0);
935
936    $yymain .= $TableFooter;
937    $yytitle     = "$ml_txt{'313'} $TopAmmount $ml_txt{'314'}";
938    $action_area = 'viewmembers';
939    AdminTemplate();
940    return;
941}
942
943sub MLLastOnline {
944    %TopMembers = ();
945
946    ManageMemberinfo('load');
947    while ( ( $membername, $value ) = each %memberinf ) {
948        LoadUser($membername);
949        $TopMembers{$membername} = ${ $uid . $membername }{'lastonline'};
950        undef %{ $uid . $membername };
951    }
952    undef %memberinf;
953
954    my @toplist =
955      reverse sort { $TopMembers{$a} <=> $TopMembers{$b} } keys %TopMembers;
956    undef %TopMembers;
957
958    if ( $FORM{'reversed'} || $INFO{'reversed'} ) {
959        @toplist = reverse @toplist;
960    }
961
962    $memcount = @toplist;
963    buildIndex();
964    buildPages(1);
965    $bb = $start;
966
967    while ( $numshown < $MembersPerPage ) {
968        showRows( $toplist[$bb] );
969        $numshown++;
970        $bb++;
971    }
972
973    undef @toplist;
974    buildPages(0);
975
976    $yymain .= $TableFooter;
977    $yytitle     = "$ml_txt{'313'} $TopAmmount $ml_txt{'314'}";
978    $action_area = 'viewmembers';
979    AdminTemplate();
980    return;
981}
982
983sub FindMembers {
984    $SearchStr = $FORM{'member'} || $INFO{'member'};
985    $LookFor = qq~^$SearchStr\$~;
986    $LookFor =~ s/\*+/.*?/gsm;
987
988    ManageMemberinfo('load');
989    my %memberfind = ();
990    while ( ( $membername, $value ) = each %memberinf ) {
991        ( $memrealname, $mememail, undef ) = split /\|/xsm, $value, 3;
992        if ( $memrealname =~ /$LookFor/ism ) {
993            $memberfind{$membername} = $memrealname;
994        }
995        elsif ( $mememail =~ /$LookFor/ism ) {
996            if ( $iamadmin || $iamgmod )
997            {
998                $memberfind{$membername} = $memrealname;
999            }
1000        }
1001    }
1002    @findmemlist =
1003      sort { lc $memberfind{$a} cmp lc $memberfind{$b} } keys %memberfind;
1004    undef %memberfind;
1005    $memcount = @findmemlist;
1006    buildIndex();
1007    buildPages(1);
1008    if ( $memcount > 0 ) {
1009        my $i = $start;
1010        $numshown = 0;
1011        while ( $numshown < $MembersPerPage ) {
1012            chomp $findmemlist[$i];
1013            showRows( $findmemlist[$i] );
1014            $numshown++;
1015            $i++;
1016        }
1017    }
1018    else {
1019        $yymain .= qq~
1020            <tr>
1021                  <td class="windowbg2" colspan="7"><br />$ml_txt{'802'} <i>$FORM{'member'}</i><br /><br /></td>
1022            </tr>~;
1023    }
1024    undef @findmemlist;
1025    undef %memberinf;
1026    buildPages(0);
1027    $yytitle = "$ml_txt{'313'} $ml_txt{'4'} $ml_txt{'87'} $numshow";
1028    AdminTemplate();
1029    return;
1030}
1031
10321;
1033