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> ... ~; 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> ~; 514 } 515 for my $counter ( $startpage .. ( $endpage - 1 ) ) { 516 if ( $counter % $MembersPerPage == 0 ) { 517 $pagetxtindex .= 518 $start == $counter 519 ? qq~<b>[$tmpa]</b> ~ 520 : qq~<a href="$scripturl?action=imlist;sort=$INFO{'sort'};toid=$to_id;letter=$letter;start=$counter"><span class="small">$tmpa</span></a> ~; 521 $tmpa++; 522 } 523 } 524 if ( $endpage < $memcount - $MembersPerPage ) { 525 $pageindexadd = q~... ~; 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"> </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"> <span style="color:#00dd00">$type$register_txt{'114'}</span>~; 960 } 961 elsif ( $taken eq 'true' ) { 962 $avail = 963qq~<img src="$imagesdir/cross.png"> <span style="color:#dd0000">$type$register_txt{'113'}</span>~; 964 } 965 else { 966 $avail = 967qq~<img src="$imagesdir/cross.png"> <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