edit_ustats.pl
1442 lines of code
1
#!/usr/local/bin/perl
2
3
# must have's!
4
use strict;
5
use warnings;
6
use CGI::Carp qw(fatalsToBrowser);
7
use HTML::Restrict;
8
use URI::Escape;
9
use JSON;
10
11
use lib "/var/www/html/Pm";
12
13
use Bc_chef qw(cookie_get cookie_delete);
14
use Bc_sql qw(get_constant
15
              user_exists
16
              get_site_name
17
              get_country_id
18
              get_city_id
19
              get_error_message
20
              sql_execute
21
              get_security_asWord
22
              get_users
23
              get_users_forDropdowns
24
              ban_exists
25
              $QUERY_PAGE
26
              $QUERY_UID
27
              $LOGGEDIN
28
              validate_new_user_data
29
              is_debuggerAllowed
30
31
              $DB
32
             );
33
use Bc_misc qw(
34
               get_param
35
               new_id
36
               pluralize
37
               shorten_str
38
               commafied
39
              );
40
41
use Date qw(get_month expand_date get_today);
42
use Html qw(get_config_forDropdowns
43
            dropdown
44
            img
45
            display_city_names_asDropdown
46
            display_country_names_asDropdown
47
            header
48
            pre_html_header
49
           );
50
use Html2 qw(
51
             center_content
52
             tag
53
             br
54
             hr
55
             embolden
56
             italicize
57
             navdd
58
             small
59
            );
60
use Redir qw(notice_redir error_redir);
61
use User qw(
62
            isUserAdmin
63
            isUserModerator
64
            isUserSuperAdmin
65
            isUserBeta
66
            isFriend
67
            get_user_stats
68
            get_user_stat
69
            get_user_friends
70
            get_user_blocked_users
71
            set_user_stats
72
            check_user_stats
73
           );
74
use Security;
75
76
# the following vars are values used by $update
77
my $uUPDATE = 1;
78
my $uCC = 2;
79
my $uDEL_FRIEND = 3;
80
my $uDEL_BLOCKED = 4;
81
my $uBAN = 5;
82
my $uUNBAN = 6;
83
my $uDEL_USER = 7;
84
my $uUNDEL_USER = 8;
85
my $uADD_FRIEND = 9;
86
my $uADD_BLOCKED = 10;
87
# end vars for $update
88
89
my $TABLE_BORDER = 0;
90
my $DEBUG = 0;
91
if (not user_exists($LOGGEDIN) or banned($LOGGEDIN) or not isUserModerator($LOGGEDIN)) {
92
  my $msg =  "Access Denied";
93
  if ($DEBUG) { $msg .= " (edit_ustats.pl)"; }
94
  print error_redir("/", $msg);
95
96
  exit 1;
97
}
98
99
my $tab = get_param("t");
100
if ($tab ne "bio" and
101
    $tab ne "vit" and
102
    $tab ne "loc" and
103
    $tab ne "desc" and
104
    $tab ne "other" and
105
    $tab ne "sub" and
106
    $tab ne "friends" and
107
    $tab ne "blocks" and
108
    $tab ne "coins") {
109
      $tab = "bio";
110
}
111
my $uid = get_param($QUERY_UID);
112
my $stats = \{};
113
if (user_exists($uid) and not isUserSuperAdmin($uid)) {
114
  $stats = {get_user_stats($uid)};
115
} # end if (user_exists($uid) and not isUserSuperAdmin($uid))
116
else {
117
  print cookie_delete("e");
118
  print pre_html_header();
119
  print header("User Editor", "?nobg_img=1&nogrid=1", 0, "setTimeout(removeMsg, " . get_constant("REMOVE_MSG_TIMEOUT") . ");", "", "style=\"width: 100vw; padding: 0;\" class=flexboxed");
120
121
  { my %centered;
122
    $centered{tag} = "div";
123
    $centered{class} = "centered";
124
    $centered{innerHTML} = "";
125
126
    { my %container;
127
      $container{tag} = "div";
128
      $container{class} = "center";
129
      $container{innerHTML} = "";
130
131
      { my %usernav;
132
        $usernav{tag} = "div";
133
        $usernav{class} = "padded center";
134
        $usernav{innerHTML} = "";
135
136
        my $framed = get_param("framed");
137
138
        { my %img;
139
          $img{tag} = "img";
140
          if ($framed)
141
            { $img{src} = "/img.pl?i=site/arrow_prev.png&s=i"; } else
142
            { $img{src} = "/img.pl?i=site/friends.png&s=i"; }
143
          $img{style} = "margin-right: 10px;";
144
145
          $usernav{innerHTML} .= tag(\%img);
146
        } # end img
147
148
        $usernav{innerHTML} .= "Select a User";
149
150
        if (not $framed) {
151
          $usernav{class} .= " purple-panel";
152
          { my %js;
153
            $js{tag} = "script";
154
            $js{defer} = 1;
155
            $js{innerHTML} = "function gotoUser() {\n" .
156
                             "  let s = document.getElementById(\"userdd\");\n" .
157
                             "  document.location=\"?$QUERY_UID=\" + s.value;\n" .
158
                             "}\n" .
159
                             "\n" .
160
                             "\n";
161
162
            $usernav{innerHTML} .= tag(\%js);
163
          } # end js
164
165
          $usernav{innerHTML} .= br;
166
167
          # valid keys for <i>$attr:</i>
168
          #    {list}                  (array ref)            (each element is a name=value pair)
169
          #    {mini}                  (1 or 0)               (make all buttons and dd as tiny as possible)
170
          #    {debug}                 (1 or 0)               (include debug content)
171
          #    {navclass}              (css class name)       (class for the navcontainer)
172
          #    {page}                  (1+)                   (the current page number)
173
          #    {lastpage}              (1+)                   (the last page number)
174
175
          #    {endlabel}              (an image/text)        (icon/text for end button)
176
          #    {prevlabel}             (an image/text)        (icon/text for prev button)
177
          #    {nextlabel}             (an image/text)        (icon/text for next button)
178
          #    {homelabel}             (an image/text)        (icon/text for home button)
179
          #    {pickonelabel}          (text)                 (a label for the pickone option)
180
181
          #    {endclick}              (javascript)           (js for when end is clicked)
182
          #    {prevclick}             (javascript)           (js for when prev is clicked)
183
          #    {nextclick}             (javascript)           (js for when next is clicked)
184
          #    {homeclick}             (javascript)           (js for when home is clicked)
185
          #    {reloadclick}           (javascript)           (js for when reload is clicked)
186
          #    {pagechange}            (javascript)           (js for when page input changes)
187
188
          #    {pickoneclass}          (css class name)       (class for the pickone option)
189
          #    {containerclass}        (css class name)       (class for the encapsulating container)
190
191
          #    {dropdownicon}          (a url)                (include an "icon" for the SELECT element)
192
          #    {disablepickone}        (1 or 0)               (toggle 'pick one' option)
193
          #    {inline}                (1 or 0)               (toggles move dropbox to left of nav)
194
195
          #    {html attribute}        (any html attr)        (any html attr. eg: onchange)*
196
197
          { my %attr;
198
            my @list = get_users_forDropdowns();
199
            $attr{list} = \@list;
200
            $attr{mini} = 1;
201
            $attr{onchange} = "gotoUser();";
202
            $attr{id} = "userdd";
203
            $attr{title} = $attr{onchange};
204
205
            $usernav{innerHTML} .= navdd(\%attr);
206
          } # end attr
207
        } # end if framed
208
        else {
209
          $usernav{class} .= " yellow-panel";
210
        } # end else of if framed
211
212
        $container{innerHTML} .= tag(\%usernav);
213
      } # end user nav
214
215
      if ($uid and isUserSuperAdmin($uid)) {
216
        $container{innerHTML} .= br;
217
218
        my %super;
219
        $super{tag} = "div";
220
        $super{id} = "MSGS";
221
        $super{style} = "margin-top: 5px;";
222
        $super{class} = "error";
223
        $super{innerHTML} = "Super Admins Cannot be Modified";
224
225
        $container{innerHTML} .= tag(\%super);
226
      } # end of if user_exists($uid) and isUserSuperAdmin($uid)
227
228
      $centered{innerHTML} .= tag(\%container);
229
    } # end container
230
231
    print tag(\%centered);
232
  } # end centered
233
234
  print "</body></html>\n";
235
  exit 1;
236
} # end else of if (user_exists($uid) and not isUserSuperAdmin($uid))
237
238
###########################################################################################################################################
239
### IF WE GET HERE, THERE WERE NO SECURITY ISSUES #########################################################################################
240
###########################################################################################################################################
241
242
my $e = cookie_get("e");
243
my $n = cookie_get("n");
244
my $rv = cookie_delete("e") . cookie_delete("n");
245
246
my $update = get_param("u");
247
if ($update) {
248
  my $update_msg = "";
249
  my $error = 0;
250
  my $notice = 0;
251
  if ($update eq $uUPDATE) {
252
    # will update only the user's stats data
253
    # the other inputs, refer to data stored in
254
    # other tables. these will be dealt with
255
    # "elsif"where
256
    my $nickname = get_param("unickname", 1);
257
    my $email = get_param("uemail", 1);
258
    my $showbday = get_param("ushowbday");
259
    my $doby = get_param("udoby");
260
    my $dobm = get_param("udobm");
261
    my $dobd = get_param("udobd");
262
    my $orientation = get_param("uorientation");
263
    my $gender = get_param("ugender");
264
    my $seeking_gender = get_param("useeking_gender");
265
    my $seeking = get_param("useeking");
266
    my $race = get_param("urace");
267
    my $eyes = get_param("ueyes");
268
    my $hair = get_param("uhair");
269
    my $height = get_param("uheight");
270
    my $weight = get_param("uweight");
271
    my $erection = get_param("uerection");
272
    my $bust = get_param("ubust");
273
    my $body = get_param("ubody");
274
    my $wheels = get_param("uwheels");
275
    my $canhost = get_param("ucan_host");
276
    my $smoker = get_param("usmoker");
277
    my $drinker = get_param("udrinker");
278
    my $drugs = get_param("udrugs");
279
    my $city = get_param("ucity");
280
    my $country = get_param("ucountry");
281
    my $desc = get_param("udesc");
282
283
    my $nohtml = HTML::Restrict->new();
284
    my $desc_processed = $nohtml->process($desc);
285
    if ($desc_processed ne $e) { $desc = $desc_processed; }
286
287
    my $security = get_param("usecurity");
288
    my $subscriber = get_param("usub");
289
    my $subscription_type = get_param("usubtype");
290
291
    if (%$stats) {
292
      # change the appropriate data (pw, and some others, will not be changed)
293
      $stats->{nickname} = $nickname;
294
      $stats->{email} = $email;
295
      if ($showbday eq "on") { $stats->{showbday} = 2; } else { $stats->{showbday} = 1; }
296
      $stats->{dob} = "$doby-$dobm-$dobd";
297
      $stats->{orientation} = $orientation;
298
      $stats->{gender} = $gender;
299
      $stats->{seeking} = $seeking;
300
      $stats->{seeking_gender} = $seeking_gender;
301
      $stats->{race} = $race;
302
      $stats->{eye_clr} = $eyes;
303
      $stats->{hair_clr} = $hair;
304
      $stats->{height} = $height;
305
      $stats->{weight} = $weight;
306
      $stats->{erection} = $erection;
307
      $stats->{bust} = $bust;
308
      $stats->{body} = $body;
309
      $stats->{wheels} = $wheels;
310
      $stats->{can_host} = $canhost;
311
      $stats->{smoker} = $smoker;
312
      $stats->{drinker} = $drinker;
313
      $stats->{drugs} = $drugs;
314
      $stats->{location} = "$country-$city";
315
      $stats->{description} = $desc;
316
317
      $stats->{security} = $security;
318
      $stats->{subscriber} = $subscriber;
319
      $stats->{subscription_type} = $subscription_type;
320
321
      if ($DEBUG) {
322
        print pre_html_header() . header("User Editor", "?nobg_img=1", 0, "setTimeout(removeMsg, " . get_constant("REMOVE_MSG_TIMEOUT") . ");", "", "");
323
        print "new stats<hr>\n";
324
        foreach my $key (sort keys %$stats) {
325
          print "$key -> $stats->{$key}<br>\n";
326
        }
327
        print "<hr align=left width=123>\n";
328
329
        my $statscheck = validate_new_user_data($stats);
330
331
        if ($statscheck < 0) {
332
          print "user stats look dirty: $statscheck<br>\n";
333
        } elsif ($statscheck eq 0) {
334
          print "user stats check failed!<br>\n";
335
        } else {
336
          print "user stats look clean<br>\n";
337
        }
338
      } else {
339
        my $status = set_user_stats($stats);
340
        if ($status eq 1) {
341
          $notice = 1;
342
          if ($DEBUG)
343
            { $update_msg = "$uid stats updated"; } else
344
            { $update_msg = "stats updated"; }
345
        } else {
346
          $error = 1;
347
          $update_msg = get_error_message($status);
348
        }
349
      }
350
    } else {
351
      print pre_html_header() . header("User Editor", "?nobg_img=1", 0, "setTimeout(removeMsg, " . get_constant("REMOVE_MSG_TIMEOUT") . ");", "", "");
352
      print "$uid: no stats\n";
353
354
      exit 1;
355
    }
356
  } elsif ($update eq $uCC) {
357
    # updates ccinfo (be it to delete the data, or alter it.)
358
    $error = 1;
359
    $update_msg = "process under development";
360
  } elsif ($update eq $uDEL_FRIEND) {
361
    # removes friends
362
    $error = 1;
363
    $update_msg = "process under development";
364
  } elsif ($update eq $uDEL_BLOCKED) {
365
    # removes blocked users
366
    $error = 1;
367
    $update_msg = "process under development";
368
  } elsif ($update eq $uBAN) {
369
    # bans UID's
370
    my $why = get_param("why");
371
372
    if ($DEBUG) {
373
      print pre_html_header() . header("User Editor", "?nobg_img=1", 0, "setTimeout(removeMsg, " . get_constant("REMOVE_MSG_TIMEOUT") . ");", "", "");
374
      my $newBID = new_uid();
375
      my $banTableSql = "insert into bans values (" . $DB->quote($newBID) . ", " . $DB->quote($uid) . ", " . $DB->quote($LOGGEDIN) . ", " . $DB->quote(get_today("db", 0)) . ", " . $DB->quote($why) . ")";
376
      my $userTableSql = "update users set banned = '2' where ID = " . $DB->quote($uid);
377
378
      print "banning: $uid<br>\n";
379
      if (user_exists($uid)) { print "user exists<br>\n"; } else { print "user does not exist<br>\n"; }
380
      if (banned($uid)) {
381
        print "user is already banned<br>\n";
382
        print "update ignored<br>\n";
383
      } else {
384
        print "user is not currently banned<br>\n";
385
        print "so now we can: <br>\n";
386
        print "<b>" . $banTableSql . "</b><br>\n";
387
        print "<b>" . $userTableSql . "</b><br>\n";
388
      }
389
    } else {
390
      my $newBID = new_id(10); while (ban_exists($newBID)) { $newBID = new_id(10); }
391
      my $banTableSql = "insert into bans (BID, ByID, dob, why) values (" . $DB->quote($uid) . ", " . $DB->quote($LOGGEDIN) . ", " . $DB->quote(get_today("db", 0)) . ", " . $DB->quote($why) . ")";
392
      my $userTableSql = "update users set banned = '2' where ID = " . $DB->quote($uid);
393
394
      if (banned($uid)) {
395
        $error = 1;
396
        if ($DEBUG)
397
          { $update_msg = "$uid already banned"; } else
398
          { $update_msg = "already banned"; }
399
      } elsif (sql_execute($userTableSql, "edit_ustats.pl - uid already banned")) {
400
        my $bResults = sql_execute($banTableSql, "edit_ustats.pl - banning uid");
401
402
        if ($bResults) {
403
          $notice = 1;
404
          if ($DEBUG)
405
            { $update_msg = "$uid is now banned"; } else
406
            { $update_msg = "Banned"; }
407
        } else {
408
          $error = 1;
409
          if ($DEBUG)
410
            { $update_msg = "ban failed: $uid"; } else
411
            { $update_msg = "ban failed"; }
412
        }
413
      } else {
414
        $error = 1;
415
        if ($DEBUG)
416
          { $update_msg = "ban failed (db): $uid"; } else
417
          { $update_msg = "ban failed (db)"; }
418
      }
419
    }
420
  } elsif ($update eq $uUNBAN) {
421
    # unbans UID's
422
423
    if ($DEBUG) {
424
      print pre_html_header() . header("User Editor", "?nobg_img=1", 0, "setTimeout(removeMsg, " . get_constant("REMOVE_MSG_TIMEOUT") . ");", "", "");
425
      my $banTableSql = "delete from bans where BID = " . $DB->quote($uid);
426
      my $userTableSql = "update users set banned = '1' where ID = " . $DB->quote($uid);
427
428
      print "unbanning: $uid<br>\n";
429
      if (user_exists($uid)) { print "user exists<br>\n"; } else { print "user does not exist<br>\n"; }
430
      if (banned($uid)) {
431
        print "user is banned<br>\n";
432
        print "so now we can: <br>\n";
433
        print "<b>" . $banTableSql . "</b><br>\n";
434
        print "<b>" . $userTableSql . "</b><br>\n";
435
      } else {
436
        print "user is not currently banned<br>\n";
437
        print "update ignored<br>\n";
438
      }
439
440
    } else {
441
442
      my $banTableSql = "delete from bans where BID = " . $DB->quote($uid);
443
      my $userTableSql = "update users set banned = '1' where ID = " . $DB->quote($uid);
444
445
      if (not banned($uid)) {
446
        $error = 1;
447
        $update_msg = "$uid not already banned!";
448
      } elsif (sql_execute($userTableSql, "edit_ustats.pl - updating user table")) {
449
        if (sql_execute($banTableSql, "edit_ustats.pl - deleting from bans table")) {
450
          $notice = 1;
451
          if ($DEBUG)
452
            { $update_msg = "$uid unbanned"; } else
453
            { $update_msg = "Unbanned"; }
454
        } else {
455
          $error = 1;
456
          if ($DEBUG)
457
            { $update_msg = "unban failed: $uid"; } else
458
            { $update_msg = "unban failed"; }
459
        }
460
      } else {
461
        $error = 1;
462
        $update_msg = "$uid does not exist!";
463
      }
464
    }
465
  } elsif ($update eq $uDEL_USER) {
466
    # delete accounts
467
468
    # it's not enough to delete just the user from the users table
469
    # must also delete all references to the user in almost all other tables
470
    # tables to update:
471
    #    theme purchases
472
    #    inbox
473
    #    from friends lists (both theirs, and others)
474
    #    images
475
    #    gifts
476
    #    points (aka coins)
477
    #    profile_views
478
    #    others?
479
480
    my $sql = "delete from users where ID=" . $DB->quote($uid);
481
    my $themesql = "delete from theme_purchases where UID=" . $DB->quote($uid);
482
    my $inboxsql = "delete from messages where to_ID=" . $DB->quote($uid);
483
    my $friendsql = "delete from friends where UID=" . $DB->quote($uid) . " or FID=" . $DB->quote($uid);
484
    my $imagesql = "delete from images where UID=" . $DB->quote($uid);
485
    my $giftsql = "delete from purchased_gifts where UID=" . $DB->quote($uid);
486
    my $pointssql = "delete from coins where ID=" . $DB->quote($uid);
487
    my $pvsql = "delete from profile_views where UID=" . $DB->quote($uid);
488
489
    if (user_exists($uid)) {
490
      my $confirmed = get_param("c");
491
492
      if (not $confirmed) {
493
        { my %form;
494
          $form{tag} = "form";
495
          $form{class} = "centered";
496
          $form{style} = "height: 98vh; width: 98vw;";
497
          $form{method} = "post";
498
          $form{action} = "/edit_ustats.pl";
499
          $form{innerHTML} = "";
500
501
          { my %query;
502
            $query{tag} = "div";
503
            $query{class} = "center";
504
            $query{innerHTML} = "";
505
506
            { my %div;
507
              $div{tag} = "div";
508
              $div{class} = "yellow-panel center block";
509
              $div{style} = "margin-bottom: 5px;";
510
              $div{innerHTML} = "About to Delete " . br . italicize(shorten_str(get_user_stat($uid, "nickname"), 20));
511
512
              $query{innerHTML} .= tag(\%div);
513
            }
514
515
            { my %input;
516
              $input{tag} = "input";
517
              $input{type} = "hidden";
518
              $input{name} = "u";
519
              $input{value} = $uDEL_USER;
520
521
              $query{innerHTML} .= tag(\%input);
522
            } # end hidden delete user input
523
524
            { my %input;
525
              $input{tag} = "input";
526
              $input{type} = "hidden";
527
              $input{name} = $QUERY_UID;
528
              $input{value} = $uid;
529
530
              $query{innerHTML} .= tag(\%input);
531
            } # end hidden uid input
532
533
            { my %button;
534
              $button{tag} = "button";
535
              $button{class} = "green";
536
              $button{name} = "c";
537
              $button{value} = "1";
538
              $button{innerHTML} = "Proceed";
539
540
              $query{innerHTML} .= tag(\%button);
541
            } # end proceed button
542
543
            { my %button;
544
              $button{tag} = "button";
545
              $button{class} = "red";
546
              $button{innerHTML} = "Cancel";
547
548
              $query{innerHTML} .= tag(\%button);
549
            } # end cancel button
550
551
            $form{innerHTML} .= tag(\%query);
552
          } # end query div
553
554
          print pre_html_header() . header("User Editor - Confirm Delete", "?nobg_img=1", 0, "setTimeout(removeMsg, " . get_constant("REMOVE_MSG_TIMEOUT") . ");", "", "");
555
          print tag(\%form);
556
557
          exit 1;
558
        } # end confirm form
559
      } else {
560
        if (sql_execute($sql, "edit_ustats.pl - deleting user")) {
561
          sql_execute($themesql, "edit ustats, themesql");
562
          sql_execute($inboxsql, "edit ustats, inboxsql");
563
          sql_execute($friendsql, "edit ustats, friendsql");
564
          sql_execute($imagesql, "edit ustats, imagesql");
565
          sql_execute($giftsql, "edit ustats, giftsql");
566
          sql_execute($pointssql, "edit ustats, pointssql");
567
          sql_execute($pvsql, "edit ustats, pvsql");
568
569
          $notice = 1;
570
          $update_msg = "<div class='centered' style='height: 98vh;'><div class=red-panel>$uid is now deled - reloading...</div></div>";
571
          print pre_html_header() . header("User Editor", "?nobg_img=1", 0, "setTimeout(removeMsg, " . get_constant("REMOVE_MSG_TIMEOUT") . ");", "", "");
572
          print "<script defer async>\n";
573
          print "  var url = \"/?" . $QUERY_PAGE . "=" . get_constant("ADMIN_PAGE") . "&" . get_constant("QUERY_ADMIN_PAGE") . "=" . get_constant("ADMIN_USER_EDITOR_PAGE") . "\";";
574
          print "  console_msg(url);\n";
575
          print "  top.document.location = url;\n";
576
          print "</script>\n";
577
          print $update_msg;
578
579
          exit 1;
580
        } else {
581
          $error = 1;
582
          $update_msg = "$uid failed to delete";
583
        }
584
      }
585
    } else {
586
      $error = 1;
587
      $update_msg = "$uid does not exist";
588
    }
589
  }
590
591
  if (not $DEBUG) {
592
    if ($notice) {
593
      print notice_redir("?$QUERY_UID=$uid", $update_msg);
594
    } elsif ($error) {
595
      print error_redir("?$QUERY_UID=$uid", $update_msg);
596
    } else {
597
      print error_redir("?$QUERY_UID=$uid", "some other error occured");
598
    }
599
  }
600
601
  exit 1;
602
}
603
604
###########################################################################################################################################
605
### IF WE GET HERE, THEN WE DISPLAY THE EDITOR ############################################################################################
606
###########################################################################################################################################
607
608
if (ref $stats eq "HASH") {
609
  $rv .= pre_html_header();
610
  $rv .= header(
611
                "User Editor",
612
                "?nobg_img=1",
613
                "?let=$tab",
614
                "setTimeout(removeMsg, " . get_constant("REMOVE_MSG_TIMEOUT") . ");",
615
                "",
616
                "style='display: flex;'"
617
               );
618
619
  { my %form;
620
    $form{tag} = "form";
621
    $form{id} = "f";
622
    $form{method} = "post";
623
    $form{action} = "/edit_ustats.pl";
624
    $form{innerHTML} = "<table border=$TABLE_BORDER cellpadding=0 cellspacing=0 class=subnavbar width=100%><tr><td>";
625
626
    { my %button;
627
      $button{tag} = "button";
628
      $button{class} = "yellow";
629
      $button{onclick} = "document.body.innerHTML=\"<div class='centered' style='height: 100%;'><font class=notice>Reloading stats...</font></div>\"; document.location.reload(); return false;";
630
      $button{title} = "Reload Stats";
631
      $button{innerHTML} = "";
632
633
      { my %img;
634
        $img{tag} = "img";
635
        $img{src} = "/img.pl?i=site/reload.png&s=u";
636
637
        $button{innerHTML} .= tag(\%img);
638
      }
639
640
      $form{innerHTML} .= tag(\%button);
641
    } # end reload button
642
    $form{innerHTML} .= "</td><td align=center width=100% nowrap>";
643
    if ($e or $n) {
644
      if ($n) { $n = shorten_str($n, 24); }
645
      if ($e) { $e = shorten_str($e, 24); }
646
      $form{innerHTML} .= "<table border=$TABLE_BORDER cellpadding=0 cellspacing=0><tr><td>";
647
648
      { my %div;
649
        $div{tag} = "div";
650
        $div{id} = "MSGS";
651
652
        if ($n) {
653
          $div{class} = "notice";
654
          $div{innerHTML} = $n;
655
        } elsif ($e) {
656
          $div{class} = "error";
657
          $div{innerHTML} = $e;
658
        } else {
659
          $div{class} = "red-panel";
660
          $div{innerHTML} = "no error/notice data";
661
        }
662
663
        $form{innerHTML} .= tag(\%div);
664
      } # end MSGS div
665
      $form{innerHTML} .= "</td></tr></table>\n";
666
    } # end if $e or $n
667
    $form{innerHTML} .= "  </td><td nowrap>\n";
668
669
    # the next bit displays a "ban" or "unban" button, if the selected
670
    # user nickname is not "JamRoll"
671
    if ($stats->{ID} ne get_constant("SITE_ADMIN")) {
672
      if ($stats->{banned} eq 1) {
673
        { my %js;
674
          $js{tag} = "script";
675
          $js{async} = 1;
676
          $js{defer} = 1;
677
678
          $js{innerHTML} = "\n";
679
          $js{innerHTML} .= "function ban(f) {\n";
680
          $js{innerHTML} .= "  // f = form (pass in as 'this'\n";
681
          $js{innerHTML} .= "  var r = prompt('why ban this soul?', '(no reason given)');\n";
682
          $js{innerHTML} .= "  if (r && r != \"\") {\n";
683
          $js{innerHTML} .= "    document.getElementById('why').value = r;\n";
684
          $js{innerHTML} .= "    document.getElementById('updateinput').value = '" . $uBAN . "';\n";
685
          $js{innerHTML} .= "    f.submit();\n";
686
          $js{innerHTML} .= "  }\n";
687
          $js{innerHTML} .= "}\n";
688
          if (isUserAdmin()) {
689
            $js{innerHTML} .= "\n";
690
            $js{innerHTML} .= "function dele(f) {\n";
691
            $js{innerHTML} .= "  // f = form (pass in as 'this'\n";
692
            $js{innerHTML} .= "  document.getElementById('updateinput').value = '" . $uDEL_USER . "';\n";
693
            $js{innerHTML} .= "  f.submit();\n";
694
            $js{innerHTML} .= "}\n";
695
            $js{innerHTML} .= "\n";
696
            $js{innerHTML} .= "function save(f) {\n";
697
            $js{innerHTML} .= "  // f = form (pass in as 'this'\n";
698
            $js{innerHTML} .= "  document.getElementById('updateinput').value = '" . $uUPDATE . "';\n";
699
            $js{innerHTML} .= "  f.submit();\n";
700
            $js{innerHTML} .= "}\n";
701
          }
702
703
          $form{innerHTML} .= tag(\%js);
704
        } # end js
705
706
        { my %banbutton;
707
          $banbutton{tag} = "button";
708
          $banbutton{type} = "button";
709
          $banbutton{class} = "blue";
710
          $banbutton{onclick} = "ban(document.getElementById('f')); return false;";
711
          $banbutton{title} = "Ban User";
712
          $banbutton{innerHTML} = img("i=site/admin/lock_unlocked.png&s=u", "", "", "height=14", "", 0);
713
714
          $form{innerHTML} .= tag(\%banbutton);
715
        } # end ban button
716
      } else {
717
        { my %unbanbutton;
718
          $unbanbutton{tag} = "button";
719
          $unbanbutton{type} = "button";
720
          $unbanbutton{class} = "blue";
721
          $unbanbutton{onclick} = "document.getElementById('updateinput').value = '" . $uUNBAN . "'; document.getElementById('f').submit(); return false;";
722
          $unbanbutton{title} = "Unban User";
723
          $unbanbutton{innerHTML} = img("i=site/admin/lock_locked.png&s=u", "", "", "", "", 0);
724
725
          $form{innerHTML} .= tag(\%unbanbutton);
726
        }
727
      }
728
729
      if (isUserAdmin()) {
730
        $form{innerHTML} .= "  </td><td class=nowrap width=1>\n";
731
        $form{innerHTML} .= "     | \n";
732
        $form{innerHTML} .= "  </td><td nowrap>\n";
733
      }
734
    }
735
    $form{innerHTML} .= "    <input id=updateinput type=hidden name=u value=1>\n";
736
    $form{innerHTML} .= "    <input id=why type=hidden name=why value=\"(no reason given)\">\n";
737
    $form{innerHTML} .= "    <input type=hidden id=$QUERY_UID name=$QUERY_UID value=\"$uid\">\n";
738
    if (isUserAdmin()) {
739
      { my %savebutton;
740
        $savebutton{tag} = "button";
741
        $savebutton{type} = "submit";
742
        $savebutton{class} = "green";
743
        $savebutton{title} = "Save Changes";
744
        $savebutton{onclick} = "save(document.getElementById('f')); return false;";
745
        $savebutton{innerHTML} = img("i=blue/diskette.png&s=u", "", "", "", "", 0);
746
747
        $form{innerHTML} .= tag(\%savebutton);
748
      }
749
    }
750
751
    if ($stats->{ID} ne get_constant("SITE_ADMIN")) {
752
      $form{innerHTML} .= "  </td><td class=nowrap width=1>\n";
753
      if (isUserAdmin()) {
754
        $form{innerHTML} .= "     | \n";
755
        $form{innerHTML} .= "  </td><td width=1 nowrap>\n";
756
        { my %delbutton;
757
          $delbutton{tag} = "button";
758
          $delbutton{type} = "button";
759
          $delbutton{class} = "red";
760
          $delbutton{onclick} = "dele(document.getElementById('f')); return false;";
761
          $delbutton{title} = "Delete User";
762
          $delbutton{innerHTML} = img("i=red/cancel.png&s=u", "", "", "", "", 0);
763
764
          $form{innerHTML} .= tag(\%delbutton);
765
        }
766
      }
767
    }
768
    $form{innerHTML} .= "  </td></tr></table>\n";
769
    $form{innerHTML} .= "</td></tr><tr><td class=spacery>\n";
770
    $form{innerHTML} .= "</td></tr><tr><td>\n";
771
    { my %div;
772
      $div{tag} = "div";
773
      $div{innerHTML} = "";
774
775
      $div{innerHTML} .= "  <table border=$TABLE_BORDER cellpadding=0 cellspacing=0 style='margin: auto;'><tr><td align=center colspan=5>\n";
776
      { my %input;
777
        $input{tag} = "input";
778
        $input{style} = "font-size: 14pt; text-align: center; margin-bottom: 0;";
779
        $input{name} = "unickname";
780
        $input{title} = "Edit Nickname";
781
        $input{placeholder} = "Billy-Joe-Bob";
782
        $input{value} = uri_unescape($stats->{nickname});
783
        $input{size} = "25";
784
        if (not isUserAdmin()) { $input{disabled} = 1; }
785
786
        $div{innerHTML} .= tag(\%input);
787
      } # end nickname input
788
      $div{innerHTML} .= "  </td></tr><tr><td class=nowrap width=1>\n";
789
      { my %seclevlabel;
790
        $seclevlabel{tag} = "small";
791
        $seclevlabel{innerHTML} = "Security Level";
792
        if (not isUserAdmin()) { $seclevlabel{innerHTML} .= ":"; }
793
        $seclevlabel{innerHTML} .= " ";
794
795
        $div{innerHTML} .= tag(\%seclevlabel);
796
      } # end seclev label
797
      $div{innerHTML} .= "  </td><td nowrap width=1>\n";
798
      my @cfgData = get_config_forDropdowns("sec_levels");
799
      if (isUserAdmin($LOGGEDIN)) {
800
        $div{innerHTML} .= dropdown("usecurity", "", $stats->{security}, "", "", "    ", "name=usecurity title='Security Level' style='width: 100px;'", "\n", \@cfgData);
801
      } else {
802
        { my %seclevhidden;
803
          $seclevhidden{tag} = "input";
804
          $seclevhidden{type} = "hidden";
805
          $seclevhidden{name} = "usecurity";
806
          $seclevhidden{value} = $stats->{security};
807
808
          $div{innerHTML} .= tag(\%seclevhidden);
809
        }
810
811
        $div{innerHTML} .= small(embolden(get_security_asWord($stats->{security})));
812
      }
813
      $div{innerHTML} .= "  <td></td><td align=right width=1 style='white-space: nowrap;'>\n";
814
      $div{innerHTML} .= small("UID: ");
815
      $div{innerHTML} .= "</td><td width=1 nowrap>\n";
816
      $div{innerHTML} .= small(embolden($stats->{ID}));
817
      $div{innerHTML} .= "  </td></tr></table>\n";
818
      if (isUserAdmin()) {
819
        $div{innerHTML} .= "    <table border=$TABLE_BORDER cellpadding=0 cellspacing=0 style='margin: 5px auto;'><tr><td>Email ";
820
        { my %email;
821
          $email{tag} = "input";
822
          $email{type} = "email";
823
          $email{name} = "uemail";
824
          $email{value} = uri_unescape($stats->{email});
825
          $email{size} = "25";
826
827
          $div{innerHTML} .= tag(\%email);
828
829
        }
830
        $div{innerHTML} .= "    </td><td>\n";
831
        { my %button;
832
          $button{tag} = "button";
833
          $button{type} = "button";
834
          $button{class} = "green";
835
          $button{onclick} = "document.location.href='/sendemail.pl?$QUERY_UID=$stats->{ID}';";
836
          $button{title} = "Send Message";
837
          $button{innerHTML} = "";
838
839
          { my %innerimg;
840
            $innerimg{tag} = "img";
841
            $innerimg{src} = "/img.pl?i=site/msg.png&s=u&cid=" . new_id();
842
            $innerimg{style} = "margin-bottom: 2px;";
843
844
            $button{innerHTML} .= tag(\%innerimg);
845
          } # end image
846
847
          $div{innerHTML} .= tag(\%button);
848
        } # end send msg button
849
        $div{innerHTML} .= "    </td></tr></table>\n";
850
      } # end if isUserAdmin()
851
852
      $form{innerHTML} .= tag(\%div);
853
    } # end nick and email div
854
    $form{innerHTML} .= "</td></tr><tr><td class=spacery>\n";
855
856
    ###################################################################################################################################
857
    ### NAVIGATION ####################################################################################################################
858
859
    $form{innerHTML} .= "</td></tr><tr><td align=center>\n";
860
    { my %editnavbar;
861
      $editnavbar{tag} = "div";
862
      $editnavbar{class} = "ueditor_navbar padded subnavbar";
863
      $editnavbar{style} = "margin: auto; margin-bottom: 8px; height: ";
864
      $editnavbar{innerHTML} = "";
865
866
      { my %js;
867
        $js{tag} = "script";
868
        $js{defer} = 1;
869
        $js{innerHTML} = "lastElementToggled = '$tab'; console_msg(lastElementToggled);";
870
871
        $editnavbar{innerHTML} .= tag(\%js);
872
      }
873
874
      if (isUserAdmin()) {
875
        $editnavbar{style} .= "50px;";
876
        { my %a; # bio
877
          $a{tag} = "a";
878
          $a{onclick} = "toggle_display_element('bio', 'biolink'); return false;";
879
          $a{id} = "biolink";
880
          $a{innerHTML} = "";
881
882
          { my %div;
883
            $div{tag} = "div";
884
            if ($tab eq "bio") { $div{class} = "navbutton_selected"; } else { $div{class} = "navbutton"; }
885
            $div{class} .= " small";
886
            $div{id} = "biodiv";
887
            $div{style} = "height: 100%;";
888
            $div{innerHTML} = "Bio";
889
890
            $a{innerHTML} .= tag(\%div);
891
          }
892
893
          $editnavbar{innerHTML} .= tag(\%a);
894
        } # end bio
895
896
        { my %a; # vitals
897
          $a{tag} = "a";
898
          $a{onclick} = "toggle_display_element('vit', 'vitlink'); return false;";
899
          $a{id} = "vitlink";
900
          $a{innerHTML} = "";
901
902
          { my %div;
903
            $div{tag} = "div";
904
            if ($tab eq "vit") { $div{class} = "navbutton_selected"; } else { $div{class} = "navbutton"; }
905
            $div{class} .= " small";
906
            $div{id} = "vitdiv";
907
            $div{style} = "height: 100%;";
908
            $div{innerHTML} = "Vitals";
909
910
            $a{innerHTML} .= tag(\%div);
911
          }
912
913
          $editnavbar{innerHTML} .= tag(\%a);
914
        } # end vitals
915
916
        { my %a; # location
917
          $a{tag} = "a";
918
          $a{onclick} = "toggle_display_element('loc', 'loclink'); return false;";
919
          $a{id} = "loclink";
920
          $a{innerHTML} = "";
921
922
          { my %div;
923
            $div{tag} = "div";
924
            if ($tab eq "loc") { $div{class} = "navbutton_selected"; } else { $div{class} = "navbutton"; }
925
            $div{class} .= " small";
926
            $div{id} = "locdiv";
927
            $div{style} = "height: 100%;";
928
            $div{innerHTML} = "Location";
929
930
            $a{innerHTML} .= tag(\%div);
931
          }
932
933
          $editnavbar{innerHTML} .= tag(\%a);
934
        } # end location
935
936
      } else {
937
        $editnavbar{style} .= "27px; width: 50%;";
938
      }
939
940
      { my %a; # description
941
        $a{tag} = "a";
942
        $a{onclick} = "toggle_display_element('desc', 'desclink'); return false;";
943
        $a{id} = "desclink";
944
        $a{innerHTML} = "";
945
946
        { my %div;
947
          $div{tag} = "div";
948
          if ($tab eq "desc") { $div{class} = "navbutton_selected"; } else { $div{class} = "navbutton"; }
949
          $div{class} .= " small";
950
          $div{id} = "descdiv";
951
          $div{style} = "height: 100%;";
952
          $div{innerHTML} = "Description";
953
954
          $a{innerHTML} .= tag(\%div);
955
        }
956
957
        $editnavbar{innerHTML} .= tag(\%a);
958
      } # end description
959
960
      { my %a; # other
961
        $a{tag} = "a";
962
        $a{onclick} = "toggle_display_element('other', 'otherlink'); return false;";
963
        $a{id} = "otherlink";
964
        $a{innerHTML} = "";
965
966
        { my %div;
967
          $div{tag} = "div";
968
          if ($tab eq "other") { $div{class} = "navbutton_selected"; } else { $div{class} = "navbutton"; }
969
          $div{class} .= " small";
970
          $div{id} = "otherdiv";
971
          $div{style} = "height: 100%;";
972
          $div{innerHTML} = "Other";
973
974
          $a{innerHTML} .= tag(\%div);
975
        }
976
977
        $editnavbar{innerHTML} .= tag(\%a);
978
      } # end other
979
980
      if (isUserAdmin()) {
981
        { my %a; # subscription / membership
982
          $a{tag} = "a";
983
          $a{onclick} = "toggle_display_element('sub', 'sublink'); return false;";
984
          $a{id} = "sublink";
985
          $a{innerHTML} = "";
986
987
          { my %div;
988
            $div{tag} = "div";
989
            if ($tab eq "sub") { $div{class} = "navbutton_selected"; } else { $div{class} = "navbutton"; }
990
            $div{class} .= " small";
991
            $div{id} = "subdiv";
992
            $div{style} = "height: 100%;";
993
            $div{innerHTML} = "Membership";
994
995
            $a{innerHTML} .= tag(\%div);
996
          }
997
998
          $editnavbar{innerHTML} .= tag(\%a);
999
        } # end subscription / membership
1000
1001
        { my %a; # friends
1002
          $a{tag} = "a";
1003
          $a{onclick} = "toggle_display_element('friends', 'friendslink'); return false;";
1004
          $a{id} = "friendslink";
1005
          $a{innerHTML} = "";
1006
1007
          { my %div;
1008
            $div{tag} = "div";
1009
            if ($tab eq "friends") { $div{class} = "navbutton_selected"; } else { $div{class} = "navbutton"; }
1010
            $div{class} .= " small";
1011
            $div{id} = "friendsdiv";
1012
            $div{style} = "height: 100%;";
1013
            $div{innerHTML} = "Buddies";
1014
1015
            $a{innerHTML} .= tag(\%div);
1016
          }
1017
1018
          $editnavbar{innerHTML} .= tag(\%a);
1019
        } # end friends
1020
1021
        { my %a; # blocks
1022
          $a{tag} = "a";
1023
          $a{onclick} = "toggle_display_element('blocks', 'blockslink'); return false;";
1024
          $a{id} = "blockslink";
1025
          $a{innerHTML} = "";
1026
1027
          { my %div;
1028
            $div{tag} = "div";
1029
            if ($tab eq "blocks") { $div{class} = "navbutton_selected"; } else { $div{class} = "navbutton"; }
1030
            $div{class} .= " small";
1031
            $div{id} = "blocksdiv";
1032
            $div{style} = "height: 100%;";
1033
            $div{innerHTML} = "Blocks";
1034
1035
            $a{innerHTML} .= tag(\%div);
1036
          }
1037
1038
          $editnavbar{innerHTML} .= tag(\%a);
1039
        } # end blocks
1040
      } # end if isUserAdmin()
1041
1042
      { my %a; # coins
1043
        $a{tag} = "a";
1044
        $a{onclick} = "toggle_display_element('coins', 'coinslink'); return false;";
1045
        $a{id} = "coinslink";
1046
        $a{innerHTML} = "";
1047
1048
        { my %div;
1049
          $div{tag} = "div";
1050
          if ($tab eq "coins") { $div{class} = "navbutton_selected"; } else { $div{class} = "navbutton"; }
1051
          $div{class} .= " small";
1052
          $div{id} = "coinsdiv";
1053
          $div{style} = "height: 100%;";
1054
          $div{innerHTML} = "Coins";
1055
1056
          $a{innerHTML} .= tag(\%div);
1057
        }
1058
1059
        $editnavbar{innerHTML} .= tag(\%a);
1060
      } # end coins
1061
1062
      $form{innerHTML} .= tag(\%editnavbar);
1063
    } # end edit navbar
1064
1065
    {
1066
      my $mh = "178px";
1067
      $form{innerHTML} .= "</td></tr><tr><td><div class='sunken' style='height: $mh; display: flex;'>";
1068
      $form{innerHTML} .= "<div style='margin: auto auto;'>";
1069
    }
1070
1071
    ###################################################################################################################################
1072
    ### THE DIVS ######################################################################################################################
1073
    if (isUserAdmin()) {
1074
      my @cfgData;
1075
1076
      ###################################################################################################################################
1077
      { my %div;
1078
        $div{tag} = "div";
1079
        $div{id} = "bio";
1080
        $div{class} = "center";
1081
        $div{style} = "display: ";
1082
        if ($tab eq "bio") { $div{style} .= "block"; } else { $div{style} .= "none"; }
1083
1084
        $div{innerHTML} .= "    <table border=$TABLE_BORDER cellpadding=0 cellspacing=0 style='margin: auto;'><tr><td>";
1085
        { my %input;
1086
          $input{tag} = "input";
1087
          $input{type} = "checkbox";
1088
          $input{name} = "ushowbday";
1089
          if ($stats->{showbday} eq 2) { $input{checked} = 1; }
1090
1091
          $div{innerHTML} .= tag(\%input);
1092
        } # end show bday checkbox
1093
        $div{innerHTML} .= "</td><td class=spacerx></td><td nowrap>\n";
1094
        $div{innerHTML} .= "      Show Birthday:\n";
1095
        $div{innerHTML} .= "    </td><td>\n";
1096
        $div{innerHTML} .= "       \n";
1097
        $div{innerHTML} .= "    </td><td>\n";
1098
1099
        my @months = ();
1100
        for (my $m = 1; $m < 13; $m++) {
1101
          if ($m < 10) {
1102
            push @months, "0$m=" . get_month($m);
1103
          } else {
1104
            push @months, "$m=" . get_month($m);
1105
          }
1106
        }
1107
        $div{innerHTML} .= dropdown("udobm", "", get_user_stat($stats->{ID}, "dob", "dobm"), "", "", "      ", "name=udobm style='width: 80px;'", "\n", \@months);
1108
        $div{innerHTML} .= "</td><td>\n";
1109
1110
        my @days = ();
1111
        for (my $d = 1; $d <= 31; $d++) {
1112
          if ($d < 10) {
1113
            push @days, "0$d=$d";
1114
          } else {
1115
            push @days, "$d=$d";
1116
          }
1117
        }
1118
        $div{innerHTML} .= dropdown("udobd", "", get_user_stat($stats->{ID}, "dob", "dobd"), "", "", "      ", "name=udobd", "<br>\n", \@days);
1119
        $div{innerHTML} .= "</td><td>\n";
1120
1121
        my @years = ();
1122
        for (my $y = get_today("y", 0) - 123; $y <= get_today("y", 0) - 18; $y++) {
1123
          push @years, "$y=$y";
1124
        }
1125
        @years = reverse @years;
1126
        $div{innerHTML} .= dropdown("udoby", "", get_user_stat($stats->{ID}, "dob", "doby"), "", "", "      ", "name=udoby", "\n", \@years);
1127
        $div{innerHTML} .= "    </td></tr></table>\n";
1128
1129
        @cfgData = get_config_forDropdowns("orientations");
1130
        $div{innerHTML} .= dropdown("uorientation", "Sexuality: ", $stats->{orientation}, "", "", "      ", "name=uorientation", " |\n", \@cfgData);
1131
        @cfgData = get_config_forDropdowns("genders");
1132
        $div{innerHTML} .= dropdown("ugender", "", $stats->{gender}, "", "", "    ", "name=ugender", "<br>\n", \@cfgData);
1133
        $div{innerHTML} .= br;
1134
        $div{innerHTML} .= dropdown("useeking_gender", "Seeking a ", $stats->{seeking_gender}, "", "", "    ", "name=useeking_gender style='margin-right: 0;'", "\n", \@cfgData);
1135
        @cfgData = get_config_forDropdowns("styles");
1136
        $div{innerHTML} .= dropdown("useeking", " for", $stats->{seeking}, "", "", "    ", "name=useeking", "<br>\n", \@cfgData);
1137
        $div{innerHTML} .= "  </td></tr></table></td></tr></table>";
1138
1139
        $form{innerHTML} .= tag(\%div);
1140
      } # end bio div
1141
1142
      ###################################################################################################################################
1143
      $form{innerHTML} .= "  <div id=vit class=center style='display: ";
1144
      if ($tab eq "vit") { $form{innerHTML} .= "block"; } else { $form{innerHTML} .= "none"; }
1145
      $form{innerHTML} .= ";'>\n";
1146
      { my %grid;
1147
        $grid{tag} = "div";
1148
        $grid{innerHTML} = "";
1149
1150
        @cfgData = get_config_forDropdowns("races");
1151
        $grid{innerHTML} .= dropdown("urace", "Race", $stats->{race}, "tiny", "", "    ", "name=urace style='background: url(/images/site/ethnicity-tiny.png) no-repeat center;'", "", \@cfgData);
1152
        @cfgData = get_config_forDropdowns("bodies");
1153
        $grid{innerHTML} .= dropdown("ubody", "Body", $stats->{body}, "tiny", "", "    ", "name=ubody style='background: url(/images/site/stickman.png) no-repeat center;'", "\n", \@cfgData);
1154
        @cfgData = get_config_forDropdowns("eyes");
1155
        $grid{innerHTML} .= dropdown("ueyes", "Eyes", $stats->{eye_clr}, "tiny", "", "    ", "name=ueye style='background: url(/images/site/read.png) no-repeat center;'", "\n", \@cfgData);
1156
        @cfgData = get_config_forDropdowns("hair");
1157
        $grid{innerHTML} .= dropdown("uhair", "Hair", $stats->{hair_clr}, "tiny", "", "    ", "name=uhair style='background: url(/images/site/haircolor.png) no-repeat center;'", "\n", \@cfgData);
1158
        @cfgData = get_config_forDropdowns("yesno");
1159
        $grid{innerHTML} .= dropdown("ucan_host", "Can Host", $stats->{can_host}, "tiny", "", "    ", "name=ucan_host style='background: url(/images/site/home.png) no-repeat center;'", "\n", \@cfgData);
1160
        @cfgData = get_config_forDropdowns("yesno");
1161
        $grid{innerHTML} .= dropdown("usmoker", "Smoking OK", $stats->{smoker}, "tiny", "", "    ", "name=usmoker style='background: url(/images/site/cigarette.png) no-repeat center;'", "\n", \@cfgData);
1162
        @cfgData = get_config_forDropdowns("yesno");
1163
        $grid{innerHTML} .= dropdown("udrinker", "Drinking OK", $stats->{drinker}, "tiny", "", "    ", "name=udrinker style='background: url(/images/site/beer.png) no-repeat center;'", "\n", \@cfgData);
1164
        @cfgData = get_config_forDropdowns("yesno");
1165
        $grid{innerHTML} .= dropdown("udrugs", "Drugs OK", $stats->{drugs}, "tiny", "", "    ", "name=udrugs style='background: url(/images/site/pothead.png) no-repeat center;'", "\n", \@cfgData);
1166
        @cfgData = get_config_forDropdowns("yesno");
1167
        $grid{innerHTML} .= dropdown("uwheels", "Wheels", $stats->{wheels}, "tiny", "", "    ", "name=uwheels style='background: url(/images/site/car.png) no-repeat center;'", "\n", \@cfgData);
1168
        @cfgData = get_config_forDropdowns("heights");
1169
        $grid{innerHTML} .= dropdown("uheight", "Height", $stats->{height}, "tiny", "", "    ", "name=uheight style='background: url(/images/site/height.png) no-repeat center;'", "\n", \@cfgData);
1170
        @cfgData = get_config_forDropdowns("weights");
1171
        $grid{innerHTML} .= dropdown("uweight", "Weight", $stats->{weight}, "tiny", "", "    ", "name=uweight style='background: url(/images/site/weight-scale.png) no-repeat center;'", "\n", \@cfgData);
1172
        if ($stats->{gender} eq 1) {
1173
          @cfgData = get_config_forDropdowns("erections");
1174
          $grid{innerHTML} .= dropdown("uerection", "Erection", $stats->{erection}, "tiny", "", "    ", "name=uerection style='background: url(/images/site/hardon.png) no-repeat center;'", "\n", \@cfgData);
1175
          $grid{innerHTML} .= "    <input type=hidden name=ubust value=\"1\">\n";
1176
        } else {
1177
          @cfgData = get_config_forDropdowns("busts");
1178
          $grid{innerHTML} .= dropdown("ubust", "Bust", $stats->{bust}, "tiny", "", "    ", "name=ubust style='background: url(/images/site/bra.png) no-repeat center;'", "\n", \@cfgData);
1179
          $grid{innerHTML} .= "    <input type=hidden name=uerection value=\"1\">\n";
1180
        }
1181
1182
        $form{innerHTML} .= tag(\%grid);
1183
      } # end vitals grid div
1184
      $form{innerHTML} .= "  </div>\n";
1185
1186
      ###################################################################################################################################
1187
      $form{innerHTML} .= "  <div id=loc class=center style='display: ";
1188
      if ($tab eq "loc") { $form{innerHTML} .= "block"; } else { $form{innerHTML} .= "none"; }
1189
      $form{innerHTML} .= ";'>\n";
1190
      $form{innerHTML} .= display_city_names_asDropdown(get_country_id($stats->{location}), get_city_id($stats->{location}), "ucity", "city:", "", "    ", "<br>\n", 0);
1191
      $form{innerHTML} .= display_country_names_asDropdown(get_country_id($stats->{location}), "ucountry onchange=\"populate_with_cities('ucountry', 'ucity', 0);\"", "country:", "", "", "");
1192
      $form{innerHTML} .= "  </div>\n\n";
1193
    } # end if is user admin
1194
1195
    ###################################################################################################################################
1196
    if (isUserAdmin()) {
1197
      $form{innerHTML} .= "  <div id=desc class=center style='display: ";
1198
      if ($tab eq "desc") { $form{innerHTML} .= "block"; } else { $form{innerHTML} .= "none"; }
1199
      $form{innerHTML} .= ";'>\n";
1200
    } else {
1201
      $form{innerHTML} .= "  <div id=desc class=center style='display: ";
1202
      if ($tab eq "desc") { $form{innerHTML} .= "block"; } else { $form{innerHTML} .= "none"; }
1203
      $form{innerHTML} .= ";'>\n";
1204
    }
1205
    $form{innerHTML} .= "    <textarea cols=40";
1206
    if (not isUserAdmin()) { $form{innerHTML} .= " disabled"; }
1207
    $form{innerHTML} .= " rows=6 name=udesc style=\"resize: none;\">" . uri_unescape($stats->{description}) . "</textarea>\n";
1208
    $form{innerHTML} .= "  </div>\n\n";
1209
1210
    if (isUserAdmin()) {
1211
      ###################################################################################################################################
1212
      $form{innerHTML} .= "  <div id=sub class=center style='display: ";
1213
      if ($tab eq "sub") { $form{innerHTML} .= "block"; } else { $form{innerHTML} .= "none"; }
1214
      $form{innerHTML} .= ";'>\n";
1215
      my @cfgData = get_config_forDropdowns("yesno");
1216
      $form{innerHTML} .= dropdown("usub", "subscriber", $stats->{subscriber}, "", "", "    ", "", "", \@cfgData);
1217
      $form{innerHTML} .= br;
1218
      @cfgData = get_config_forDropdowns("membership_types");
1219
      $form{innerHTML} .= dropdown("usubtype", "subscription type", $stats->{subscription_type}, "", "", "    ", "", "", \@cfgData);
1220
      $form{innerHTML} .= br;
1221
      $form{innerHTML} .= "    Member Since: " . embolden(expand_date($stats->{enrolled})) . br;
1222
      $form{innerHTML} .= "    Expires: ";
1223
      if ($stats->{subscription_type} ne 4) {
1224
        $form{innerHTML} .= embolden(expand_date($stats->{subscription_date}));
1225
      } else {
1226
        $form{innerHTML} .= embolden("NEVER!");
1227
      }
1228
      $form{innerHTML} .= br . "  </div>\n\n";
1229
    } # end if is user admin
1230
1231
    ###################################################################################################################################
1232
    $form{innerHTML} .= "  <div id=other class=center style='display: ";
1233
    if ($tab eq "other") { $form{innerHTML} .= "block"; } else { $form{innerHTML} .= "none"; }
1234
    $form{innerHTML} .= ";'>\n";
1235
    $form{innerHTML} .= "    <button class=red type=button onclick=\"document.location.href='./sendresetpw.pl?$QUERY_UID=$uid';\">Reset Password</button><br>\n";
1236
    if (isUserAdmin())
1237
      { $form{innerHTML} .= small("emails new password to " . italicize(uri_unescape($stats->{email}))) . br; } else
1238
      { $form{innerHTML} .= small("emails new password to this " . italicize("member")); }
1239
    $form{innerHTML} .= "    <hr>\n";
1240
    $form{innerHTML} .= "    last ip: <b>$stats->{lastip}</b>";
1241
    my $geoloc_url = "http://ip-api.com/json/$stats->{lastip}";
1242
    my $geoloc_curl = `curl -H "Accept: application/json" $geoloc_url`;
1243
    my $loc = decode_json($geoloc_curl);
1244
1245
    if (isUserAdmin()) {
1246
      $form{innerHTML} .= " <input type=button value='Clear' class=yellow>" . br;
1247
1248
      my %location; {
1249
        $location{tag} = "div";
1250
        $location{class} = "sunken inline padded-left-right small";
1251
        if ($loc->{status} ne "fail") {
1252
          $location{innerHTML} = $loc->{city} . ", " . $loc->{country};
1253
        } else {
1254
          $location{innerHTML} .= "Geo-Location not Found";
1255
        }
1256
1257
        $form{innerHTML} .= tag(\%location);
1258
      }
1259
1260
      $form{innerHTML} .= hr . "    debugger allowed: ";
1261
      if (is_debuggerAllowed($uid)) {
1262
        $form{innerHTML} .= "<b>yes</b>\n";
1263
        $form{innerHTML} .= "      <button class=red type=button onclick=\"document.location='/add_debug_user.pl?$QUERY_UID=$uid&d=1'\">Disallow</button>";
1264
      } else {
1265
        $form{innerHTML} .= "<b>no</b>\n";
1266
        $form{innerHTML} .= "      <button class=green type=button onclick=\"document.location='/add_debug_user.pl?$QUERY_UID=$uid&da=0'\">Allow</button>";
1267
      }
1268
      $form{innerHTML} .= "<br>\n\n";
1269
    } else {
1270
      $form{innerHTML} .= "<br>\n";
1271
    }
1272
1273
    $form{innerHTML} .= "    Beta Tester: ";
1274
    if (isUserBeta($uid))
1275
      { $form{innerHTML} .= "<b>yes</b>\n"; } else
1276
      { $form{innerHTML} .= "<b>no</b>\n"; }
1277
1278
    if (isUserBeta($stats->{ID})) {
1279
      $form{innerHTML} .= "<button class=red type=button onclick=\"document.location.href='/beta.pl?$QUERY_UID=$stats->{ID}&beta=0';\">Remove as Beta Tester</button><br>\n";
1280
    } else {
1281
      $form{innerHTML} .= "<button class=green type=button onclick=\"document.location.href='/beta.pl?$QUERY_UID=$stats->{ID}&beta=1';\">Set as Beta Tester</button><br>\n";
1282
    }
1283
    $form{innerHTML} .= "  </div>\n\n";
1284
1285
    ###################################################################################################################################
1286
    $form{innerHTML} .= "  <div id=coins class=center style='display: ";
1287
    if ($tab eq "coins") { $form{innerHTML} .= "block"; } else { $form{innerHTML} .= "none"; }
1288
    $form{innerHTML} .= ";'>\n";
1289
    $form{innerHTML} .= "    Member has <b>" . commafied(User::get_user_points($stats->{ID})) . "</b> coins";
1290
    if (isUserAdmin()) { $form{innerHTML} .= " <input class=yellow type=button value='Clear' title='removes all coins from this account' onclick='addcoins(-1);'><br>\n"; } else { $form{innerHTML} .= "<br>\n"; }
1291
    $form{innerHTML} .= "    <script defer>\n";
1292
    $form{innerHTML} .= "      function addcoins(clear = 0) {\n";
1293
    $form{innerHTML} .= "        var c = document.getElementById('addc');\n";
1294
    $form{innerHTML} .= "        var u = document.getElementById('$QUERY_UID');\n";
1295
    $form{innerHTML} .= "        if (clear)  { document.location.href = \"/addcoins.pl?clear=1&$QUERY_UID=\" + u.value; }\n";
1296
    $form{innerHTML} .= "        else if (c.value) { document.location.href = \"/addcoins.pl?c=\" + c.value + \"&$QUERY_UID=\" + u.value; }\n";
1297
    $form{innerHTML} .= "      }\n";
1298
    $form{innerHTML} .= "    </script>\n";
1299
    $form{innerHTML} .= "\n";
1300
    $form{innerHTML} .= "    <input id=addc size=10 title='add coins to this account' placeholder='1234567890'>\n";
1301
    $form{innerHTML} .= "    <input class=green type=button value='Add' onclick='addcoins();'>\n";
1302
    $form{innerHTML} .= "  </div>\n\n";
1303
1304
    ###################################################################################################################################
1305
    if (isUserAdmin()) {
1306
      $form{innerHTML} .= "  <div class='center' id=friends style='display: ";
1307
      if ($tab eq "friends") { $form{innerHTML} .= "block"; } else { $form{innerHTML} .= "none"; }
1308
      $form{innerHTML} .= ";' class=scrolling_vertical>";
1309
1310
      my %script; {
1311
        $script{tag} = "script";
1312
        $script{defer} = 1;
1313
        $script{innerHTML} = "\n" .
1314
                             "function addFriend() {\n" .
1315
                             "  console_msg('addFriend');\n" .
1316
                             "}\n" .
1317
                             "\n" .
1318
                             "function removeFriend() {\n" .
1319
                             "  console_msg('removeFriend');\n" .
1320
                             "}\n" .
1321
                             "\n";
1322
1323
        $form{innerHTML} .= tag(\%script);
1324
      }
1325
1326
      my @friends = get_user_friends($stats->{ID});
1327
      { my %input;
1328
        $input{tag} = "input";
1329
        $input{type} = "text";
1330
        $input{style} = "width: 123px;";
1331
        $input{name} = "newFriend";
1332
        $input{placeholder} = "UID or Nickname";
1333
        $input{title} = "Type in a UID or a Member's Nickname";
1334
1335
        $form{innerHTML} .= tag(\%input);
1336
      } # end new friend input
1337
1338
      { my %button;
1339
        $button{tag} = "button";
1340
        $button{type} = "button";
1341
        $button{class} = "green";
1342
        $button{onclick} = "addFriend(); return false;";
1343
        $button{innerHTML} = "+";
1344
1345
        $form{innerHTML} .= tag(\%button);
1346
      } # end add new friend button
1347
1348
      if (@friends) {
1349
        { my %scrollingdiv;
1350
          $scrollingdiv{tag} = "div";
1351
          $scrollingdiv{class} = "sunken scrolling_vertical padded-small text-align-left";
1352
          my $sh = "115px";
1353
          my $sw = "250px";
1354
          $scrollingdiv{style} = "min-height: $sh; max-height: $sh; min-width: $sw; max-width: $sw;";
1355
          $scrollingdiv{innerHTML} = "";
1356
1357
          foreach my $friend (@friends) {
1358
            if (user_exists($friend)) {
1359
              my $fn = get_user_stat($friend, "nickname");
1360
1361
              { my %button;
1362
                $button{tag} = "button";
1363
                $button{class} = "red padding-none";
1364
                $button{title} = "Remove";
1365
                $button{onclick} = "removeFriend();";
1366
                $button{innerHTML} = " X ";
1367
1368
                $scrollingdiv{innerHTML} .= tag(\%button);
1369
              } # end remove friend button
1370
              $scrollingdiv{innerHTML} .= "| ";
1371
1372
              { my %link;
1373
                $link{tag} = "a";
1374
                $link{href} = "?$QUERY_UID=" . $friend;
1375
                $link{class} = "small";
1376
                $link{title} = "UID: " . $friend;
1377
                $link{innerHTML} = embolden(shorten_str($fn, 25));
1378
1379
                $scrollingdiv{innerHTML} .= tag(\%link);
1380
              }
1381
1382
              $scrollingdiv{innerHTML} .= br;
1383
            }
1384
          }
1385
1386
          $form{innerHTML} .= tag(\%scrollingdiv);
1387
        } # end scrolling div
1388
      } else {
1389
        $form{innerHTML} .= "    friends list is empty!\n";
1390
      }
1391
      $form{innerHTML} .= "  </div>\n\n";
1392
1393
      ###################################################################################################################################
1394
      $form{innerHTML} .= "  <div id=blocks class=center style='display: ";
1395
      if ($tab eq "blocks") { $form{innerHTML} .= "block"; } else { $form{innerHTML} .= "none"; }
1396
      $form{innerHTML} .= ";'>\n";
1397
      # well, let's see how many times this user has been blocked
1398
      my $blockedsql = "select * from blocks where BID=" . $DB->quote($stats->{ID});
1399
      my $blockedCount = 0;
1400
      my $blockedList = sql_execute($blockedsql, "edit ustats, blockedsql");
1401
      if (ref $blockedList eq "HASH") { $blockedCount = 1; } else { $blockedCount = @$blockedList; }
1402
      my @blocked = get_user_blocked_users($stats->{ID});
1403
      $form{innerHTML} .= "This user has been blocked by <b>$blockedCount</b> " . pluralize("user", $blockedCount) . "<hr>\n";
1404
      if (@blocked) {
1405
        foreach my $block (@blocked) {
1406
          my $n = get_user_stat($block, "nickname");
1407
          $form{innerHTML} .= "    <button class=green_button title='Remove' onClick='return false;'>x</button> | <b>$n</b> <small>($block)</small><br>\n";
1408
        }
1409
      } else {
1410
        $form{innerHTML} .= "    no blocked users\n";
1411
      }
1412
      $form{innerHTML} .= "  </div>\n";
1413
    }
1414
1415
    $form{innerHTML} .= "</div></div></td></tr></table>\n";
1416
1417
    $rv .= tag(\%form);
1418
  } # end form
1419
} else {
1420
  my %notice; {
1421
    my %img; {
1422
      $img{tag} = "img";
1423
      $img{src} = "/images/site/arrow_prev.png";
1424
      $img{height} = 24;
1425
      $img{style} = "margin-top: 4px;";
1426
    }
1427
1428
    $notice{tag} = "div";
1429
    $notice{id} = "MSGS";
1430
    $notice{class} = "notice";
1431
    $notice{innerHTML} = tag(\%img) . "  Select a User";
1432
  }
1433
1434
  $rv .= pre_html_header() .
1435
         header("User Editor", "?nobg_img=1", "", "setTimeout(removeMsg, " . get_constant("REMOVE_MSG_TIMEOUT") . ");", "", "style='width: 100vw; height: 100vh; margin: 0; padding: 0;'") .
1436
         center_content(tag(\%notice), "100vw", "100vh");
1437
}
1438
1439
$rv .= "\n</body>\n</html>\n";
1440
print $rv;
1441
1442
exit 1;