home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / CMS / xoops-2.0.18.1.exe / xoops-2.0.18.1 / htdocs / include / findusers.php < prev    next >
Encoding:
PHP Script  |  2007-09-09  |  28.6 KB  |  686 lines

  1. <?php
  2. /**
  3.  * user selection
  4.  *
  5.  * limit: Only work with javascript enabled
  6.  * TODO: plugins for external applications, including but not limited: sending massive emails/PMs, membership edit
  7.  *
  8.  * @copyright    The XOOPS project http://www.xoops.org/
  9.  * @license        http://www.fsf.org/copyleft/gpl.html GNU public license
  10.  * @author        Taiwen Jiang (phppp or D.J.) <php_pp@hotmail.com>
  11.  * @since        1.00
  12.  * @version        $Id$
  13.  */
  14.  
  15. include "../mainfile.php";
  16. xoops_header(false);
  17.  
  18. $denied = true;
  19. if (!empty($_REQUEST['token'])) {
  20.     if ($GLOBALS['xoopsSecurity']->validateToken($_REQUEST['token'], false)) {
  21.         $denied = false;
  22.     }
  23. } elseif ( is_object($xoopsUser) && $xoopsUser->isAdmin() ) {
  24.     $denied = false;
  25. }
  26. if ($denied) {
  27.     xoops_error(_NOPERM);
  28.     exit();
  29. }
  30.  
  31. $token = @$_REQUEST["token"];
  32. $name_form = 'memberslist';
  33. $name_userid = 'uid' . ( @$_REQUEST['multiple'] ? "[]" : "" );
  34. $name_username = 'uname' . ( @$_REQUEST['multiple'] ? "[]" : "" );
  35.  
  36. if (!@include_once XOOPS_ROOT_PATH."/language/".$xoopsConfig["language"]."/findusers.php") {
  37.     include_once XOOPS_ROOT_PATH."/language/english/findusers.php";
  38. }
  39.  
  40. class XoopsRank extends XoopsObject
  41. {
  42.     function __construct() {
  43.         $this->XoopsRank();
  44.     }
  45.     
  46.     function XoopsRank()
  47.     {
  48.         $this->XoopsObject();
  49.         $this->initVar('rank_id', XOBJ_DTYPE_INT, null, false);
  50.         $this->initVar('rank_title', XOBJ_DTYPE_TXTBOX, null, false);
  51.         $this->initVar('rank_min', XOBJ_DTYPE_INT, 0);
  52.         $this->initVar('rank_max', XOBJ_DTYPE_INT, 0);
  53.         $this->initVar('rank_special', XOBJ_DTYPE_INT, 0);
  54.         $this->initVar('rank_image', XOBJ_DTYPE_TXTBOX, "");
  55.     }
  56. }
  57.  
  58. class XoopsRankHandler extends XoopsObjectHandler
  59. {
  60.     function __construct(&$db) {
  61.         $this->XoopsRankHandler($db);
  62.     }
  63.     
  64.     function XoopsRankHandler(&$db) {
  65.         $this->XoopsObjectHandler($db);
  66.     }
  67.     
  68.     function &create($isNew = true) {
  69.         $obj =& new XoopsRank();
  70.         if ($isNew === true) {
  71.             $obj->setNew();
  72.         }
  73.         return $obj;
  74.     }
  75.     
  76.     function &get($id = 0)
  77.     {
  78.         $object =& $this->create(false);
  79.         $sql = "SELECT * FROM " . $this->db->prefix('ranks') . " WHERE rank_id = " . $this->db->quoteString($id);
  80.         if (!$result = $this->db->query($sql)) {
  81.             $ret = null;
  82.             return $ret;
  83.         }
  84.         while ($row = $this->db->fetchArray($result)) {
  85.             $object->assignVars($row);
  86.         }
  87.  
  88.         return $object;
  89.     }
  90.     
  91.     function getList($criteria = null, $limit = 0, $start = 0) 
  92.     {
  93.         $ret = array();
  94.         if ($criteria == null) {
  95.             $criteria = new CriteriaCompo();
  96.         }
  97.             
  98.         $sql = 'SELECT rank_id, rank_title FROM '.$this->db->prefix('ranks');
  99.         if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
  100.             $sql .= ' '.$criteria->renderWhere();
  101.             if ($criteria->getSort() != '') {
  102.                 $sql .= ' ORDER BY '.$criteria->getSort().' '.$criteria->getOrder();
  103.             }
  104.             $limit = $criteria->getLimit();
  105.             $start = $criteria->getStart();
  106.         }
  107.         $result = $this->db->query($sql, $limit, $start);
  108.         if (!$result) {
  109.             return $ret;
  110.         }
  111.  
  112.         $myts =& MyTextSanitizer::getInstance();
  113.         while ($myrow = $this->db->fetchArray($result)) {
  114.             $ret[$myrow["rank_id"]] = $myts->htmlSpecialChars($myrow["rank_title"]);
  115.         }
  116.         return $ret;
  117.     }
  118. }
  119.  
  120. class XoUser extends XoopsUser
  121. {
  122.     function __construct() {
  123.         $this->XoUser();
  124.     }
  125.  
  126.     function XoUser() {
  127.         $this->XoopsUser();
  128.         
  129.         $unsets = array("actkey", "pass", "theme", "umode", "uorder", "notify_mode");
  130.         foreach($unsets as $var) {
  131.             unset($this->vars[$var]);
  132.         }
  133.     }
  134. }
  135.  
  136. class XoUserHandler extends XoopsObjectHandler
  137. {
  138.     function __construct(&$db) {
  139.         $this->XoUserHandler($db);
  140.     }
  141.     
  142.     function XoUserHandler(&$db) {
  143.         $this->XoopsObjectHandler($db);
  144.     }
  145.     
  146.     function &create($isNew = true) {
  147.         $obj =& new XoUser();
  148.         if ($isNew === true) {
  149.             $obj->setNew();
  150.         }
  151.         return $obj;
  152.     }
  153.     
  154.     function getCount($criteria = null, $groups = array()) {
  155.         if (!is_array($groups)) {
  156.             $groups = array($groups);
  157.         }
  158.         $groups = array_filter($groups);
  159.         if (empty($groups)) {
  160.             $sql =     '    SELECT COUNT(DISTINCT u.uid) FROM '.$this->db->prefix('users'). ' AS u'.
  161.                     '    WHERE 1=1';
  162.         } else {
  163.             $sql =     '    SELECT COUNT(DISTINCT u.uid) FROM '.$this->db->prefix('users'). ' AS u'.
  164.                     '    LEFT JOIN '.$this->db->prefix('groups_users_link'). ' AS g ON g.uid = u.uid'.
  165.                     '    WHERE g.groupid IN ('.implode(', ', array_map('intval', $groups)).')';
  166.         }
  167.         if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement')) {
  168.             // Use the direct renderer, assuming no `uid` in criteria
  169.             if ($render = $criteria->render()) {
  170.                 $sql .= ' AND '.$render;
  171.             }
  172.         }
  173.         $result = $this->db->query($sql);
  174.         list($count) = $this->db->fetchRow($result);
  175.         return $count;
  176.     }
  177.     
  178.     function getAll($criteria = null, $groups = array()) {
  179.         if (!is_array($groups)) {
  180.             $groups = array($groups);
  181.         }
  182.         $groups = array_filter($groups);
  183.         $limit = null;
  184.         $start = null;
  185.         if (empty($groups)) {
  186.             $sql =     '    SELECT u.* FROM '.$this->db->prefix('users'). ' AS u'.
  187.                     '    WHERE 1=1';
  188.         } else {
  189.         
  190.             $sql =     '    SELECT u.* FROM '.$this->db->prefix('users'). ' AS u'.
  191.                     '    LEFT JOIN '.$this->db->prefix('groups_users_link'). ' AS g ON g.uid = u.uid'.
  192.                     '    WHERE g.groupid IN ('.implode(', ', array_map('intval', $groups)).')';
  193.         }
  194.         if (isset($criteria) && is_subclass_of($criteria, "criteriaelement")) {
  195.             if ($render = $criteria->render()) {
  196.                 $sql .= ' AND '.$render;
  197.             }
  198.             if ($sort = $criteria->getSort()) {
  199.                 $sql .= " ORDER BY ".$sort." ".$criteria->getOrder();
  200.                 $orderSet = true;
  201.             }
  202.             $limit = $criteria->getLimit();
  203.             $start = $criteria->getStart();
  204.         }
  205.         if (empty($orderSet)) $sql .= " ORDER BY u.uid ASC";
  206.         $result = $this->db->query($sql, $limit, $start);
  207.         $ret = array();
  208.         while ($myrow = $this->db->fetchArray($result)) {
  209.             $object =& $this->create(false);
  210.             $object->assignVars($myrow);
  211.             $ret[$myrow["uid"]] = $object;
  212.             unset($object);
  213.         }
  214.         
  215.         return $ret;
  216.     }
  217. }
  218.  
  219. $rank_handler = new XoopsRankHandler($xoopsDB);
  220. $user_handler = new XoUserHandler($xoopsDB);
  221.  
  222. $items_match = array(
  223.                 "uname"        => _MA_USER_UNAME, 
  224.                 "name"        => _MA_USER_REALNAME, 
  225.                 "email"        => _MA_USER_EMAIL, 
  226.                 "user_icq"    => _MA_USER_ICQ, 
  227.                 "user_aim"    => _MA_USER_AIM, 
  228.                 "user_yim"    => _MA_USER_YIM,
  229.                 "user_msnm"    => _MA_USER_MSNM
  230.                 );
  231.  
  232. $items_range = array(
  233.                 "user_regdate"    => _MA_USER_RANGE_USER_REGDATE, 
  234.                 "last_login"    => _MA_USER_RANGE_LAST_LOGIN, 
  235.                 "posts"            => _MA_USER_RANGE_POSTS, 
  236.                 );
  237.  
  238. define("FINDUSERS_MODE_SIMPLE",        0);
  239. define("FINDUSERS_MODE_ADVANCED",    1);
  240. define("FINDUSERS_MODE_QUERY",         2);
  241.  
  242. $modes = array(
  243.         FINDUSERS_MODE_SIMPLE    => _MA_USER_MODE_SIMPLE,
  244.         FINDUSERS_MODE_ADVANCED    => _MA_USER_MODE_ADVANCED,
  245.         FINDUSERS_MODE_QUERY    => _MA_USER_MODE_QUERY,
  246.         );
  247.         
  248. if ( empty($_POST["user_submit"]) ) {
  249.     
  250.     include_once XOOPS_ROOT_PATH."/class/xoopsformloader.php";
  251.     
  252.     $form = new XoopsThemeForm(_MA_USER_FINDUS, "uesr_findform", "findusers.php", 'post', true);
  253.     
  254.     $mode = intval( @$_REQUEST["mode"] );
  255.     if ( FINDUSERS_MODE_QUERY == $mode ) {
  256.         $form->addElement(new XoopsFormTextArea(_MA_USER_QUERY, "query", @$_POST["query"]));
  257.     } else {
  258.         if ( FINDUSERS_MODE_ADVANCED == $mode ) {
  259.             foreach ($items_match as $var => $title) {
  260.                 $text = new XoopsFormText("", $var, 30, 100, @$_POST[$var]);
  261.                 $match = new XoopsFormSelectMatchOption("", "{$var}_match", @$_POST["{$var}_match"]);
  262.                 $match_tray = new XoopsFormElementTray($title, " ");
  263.                 $match_tray->addElement($match);
  264.                 $match_tray->addElement($text);
  265.                 $form->addElement($match_tray);
  266.                 unset($text, $match, $match_tray);
  267.             }
  268.             
  269.             $url_text = new XoopsFormText(_MA_USER_URLC, "url", 30, 100, @$_POST["url"]);
  270.             $location_text = new XoopsFormText(_MA_USER_LOCATION, "user_from", 30, 100, @$_POST["user_from"]);
  271.             $occupation_text = new XoopsFormText(_MA_USER_OCCUPATION, "user_occ", 30, 100, @$_POST["user_occ"]);
  272.             $interest_text = new XoopsFormText(_MA_USER_INTEREST, "user_intrest", 30, 100, @$_POST["user_intrest"]);
  273.             foreach ($items_range as $var => $title) {
  274.                 $more = new XoopsFormText("", "{$var}_more", 10, 5, @$_POST["{$var}_more"]);
  275.                 $less = new XoopsFormText("", "{$var}_less", 10, 5, @$_POST["{$var}_less"]);
  276.                 $range_tray = new XoopsFormElementTray($title, " -  ");
  277.                 $range_tray->addElement($less);
  278.                 $range_tray->addElement($more);
  279.                 $form->addElement($range_tray);
  280.                 unset($more, $less, $range_tray);
  281.             }
  282.             
  283.             $mailok_radio = new XoopsFormRadio(_MA_USER_SHOWMAILOK, "user_mailok", empty($_POST["user_mailok"]) ? "both" : $_POST["user_mailok"]);
  284.             $mailok_radio->addOptionArray(array("mailok"=>_MA_USER_MAILOK, "mailng"=>_MA_USER_MAILNG, "both"=>_MA_USER_BOTH));
  285.             $avatar_radio = new XoopsFormRadio(_MA_USER_HASAVATAR, "user_avatar", empty($_POST["user_avatar"]) ? "both" : $_POST["user_avatar"]);
  286.             $avatar_radio->addOptionArray(array("y"=>_YES, "n"=>_NO, "both"=>_MA_USER_BOTH));
  287.             
  288.             $level_radio = new XoopsFormRadio(_MA_USER_LEVEL, "level", @$_POST["level"]);
  289.             $levels = array( 0 => _ALL, 1 => _MA_USER_LEVEL_ACTIVE, 2 => _MA_USER_LEVEL_INACTIVE , 3 => _MA_USER_LEVEL_DISABLED);
  290.             $level_radio->addOptionArray($levels);
  291.             
  292.             $member_handler =& xoops_gethandler('member');
  293.             $groups = $member_handler->getGroupList();
  294.             $groups[0] = _ALL;
  295.             $group_select = new XoopsFormSelect(_MA_USER_GROUP, 'groups', @$_POST['groups'], 3, true);
  296.             $group_select->addOptionArray($groups);
  297.             
  298.             $ranks = $rank_handler->getList();
  299.             $ranks[0] = _ALL;
  300.             $rank_select = new XoopsFormSelect(_MA_USER_RANK, 'rank', intval( @$_POST['rank'] ));
  301.             $rank_select->addOptionArray($ranks);
  302.             
  303.             
  304.             $form->addElement($url_text);
  305.             $form->addElement($location_text);
  306.             $form->addElement($occupation_text);
  307.             $form->addElement($interest_text);
  308.             $form->addElement($mailok_radio);
  309.             $form->addElement($avatar_radio);
  310.             $form->addElement($level_radio);
  311.             
  312.             $form->addElement($group_select);
  313.             $form->addElement($rank_select);
  314.         } else {
  315.             foreach (array("uname", "email") as $var) {
  316.                 $title = $items_match[$var];
  317.                 $text = new XoopsFormText("", $var, 30, 100, @$_POST[$var]);
  318.                 $match = new XoopsFormSelectMatchOption("", "{$var}_match", @$_POST["{$var}_match"]);
  319.                 $match_tray = new XoopsFormElementTray($title, " ");
  320.                 $match_tray->addElement($match);
  321.                 $match_tray->addElement($text);
  322.                 $form->addElement($match_tray);
  323.                 unset($text, $match, $match_tray);
  324.             }
  325.         }
  326.                     
  327.         $sort_select = new XoopsFormSelect(_MA_USER_SORT, "user_sort", @$_POST["user_sort"]);
  328.         $sort_select->addOptionArray(array("uname"=>_MA_USER_UNAME, "last_login"=>_MA_USER_LASTLOGIN, "user_regdate"=>_MA_USER_REGDATE, "posts"=>_MA_USER_POSTS));
  329.         $order_select = new XoopsFormSelect(_MA_USER_ORDER, "user_order", @$_POST["user_order"]);
  330.         $order_select->addOptionArray(array("ASC"=>_MA_USER_ASC,"DESC"=>_MA_USER_DESC));
  331.         
  332.         $form->addElement($sort_select);
  333.         $form->addElement($order_select);
  334.     }
  335.     $form->addElement( new XoopsFormText(_MA_USER_LIMIT, "limit", 6, 6, empty($_REQUEST["limit"]) ? 50 : intval($_REQUEST["limit"])) );
  336.     $form->addElement( new XoopsFormHidden("mode", $mode) );
  337.     $form->addElement( new XoopsFormHidden("target", @$_REQUEST["target"]) );
  338.     $form->addElement( new XoopsFormHidden("multiple", @$_REQUEST["multiple"]) );
  339.     $form->addElement( new XoopsFormHidden("token", $token) );
  340.     $form->addElement( new XoopsFormButton("", "user_submit", _SUBMIT, "submit") );
  341.     
  342.     $acttotal = $user_handler->getCount(new Criteria('level', 0, '>'));
  343.     $inacttotal = $user_handler->getCount(new Criteria('level', 0, '<='));
  344.     echo "</html><body>";
  345.     echo "<h2 style='text-align:left;'>"._MA_USER_FINDUS." - ".$modes[$mode]."</h2>";
  346.     $modes_switch = array();
  347.     foreach ($modes as $_mode => $title) {
  348.         if ($mode == $_mode) continue;
  349.         $modes_switch[] = "<a href='findusers.php?target=".htmlspecialchars(@$_REQUEST["target"], ENT_QUOTES)."&multiple=".htmlspecialchars(@$_REQUEST["multiple"], ENT_QUOTES)."&token=".htmlspecialchars($token, ENT_QUOTES)."&mode={$_mode}'>{$title}</a>";
  350.     }
  351.     echo "<h4>".implode(" | ", $modes_switch)."</h4>";
  352.     echo "(".sprintf(_MA_USER_ACTUS, "<span style='color:#ff0000;'>$acttotal</span>")." ".sprintf(_MA_USER_INACTUS, "<span style='color:#ff0000;'>$inacttotal</span>").")";
  353.     $form->display();
  354.     
  355. } else {
  356.     $myts =& MyTextSanitizer::getInstance();
  357.     
  358.     $limit = empty($_POST['limit']) ? 50 : intval( $_POST['limit'] );
  359.     $start = intval( @$_POST['start'] );
  360.     
  361.     if (!isset($_POST["query"])) {
  362.         $criteria = new CriteriaCompo();
  363.         foreach (array_keys($items_match) as $var) {
  364.             if ( !empty($_POST[$var]) ) {
  365.                 $match = (!empty($_POST["{$var}_match"])) ? intval($_POST["{$var}_match"]) : XOOPS_MATCH_START;
  366.                 $value = str_replace("_", "\\\_", $myts->addSlashes(trim($_POST[$var])));
  367.                 switch ($match) {
  368.                 case XOOPS_MATCH_START:
  369.                     $criteria->add(new Criteria($var, $value.'%', 'LIKE'));
  370.                     break;
  371.                 case XOOPS_MATCH_END:
  372.                     $criteria->add(new Criteria($var, '%'.$value, 'LIKE'));
  373.                     break;
  374.                 case XOOPS_MATCH_EQUAL:
  375.                     $criteria->add(new Criteria($var, $value));
  376.                     break;
  377.                 case XOOPS_MATCH_CONTAIN:
  378.                     $criteria->add(new Criteria($var, '%'.$value.'%', 'LIKE'));
  379.                     break;
  380.                 }
  381.             }
  382.         }
  383.         if ( !empty($_POST['url']) ) {
  384.             $url = formatURL(trim($_POST['url']));
  385.             $criteria->add(new Criteria('url', $url.'%', 'LIKE'));
  386.         }
  387.         if ( !empty($_POST['user_from']) ) {
  388.             $criteria->add(new Criteria('user_from', '%'.$myts->addSlashes(trim($_POST['user_from'])).'%', 'LIKE'));
  389.         }
  390.         if ( !empty($_POST['user_intrest']) ) {
  391.             $criteria->add(new Criteria('user_intrest', '%'.$myts->addSlashes(trim($_POST['user_intrest'])).'%', 'LIKE'));
  392.         }
  393.         if ( !empty($_POST['user_occ']) ) {
  394.             $criteria->add(new Criteria('user_occ', '%'.$myts->addSlashes(trim($_POST['user_occ'])).'%', 'LIKE'));
  395.         }
  396.     
  397.         foreach (array("last_login", "user_regdate") as $var) {
  398.             if ( !empty($_POST["{$var}_more"]) && is_numeric($_POST["{$var}_more"]) ) {
  399.                 $time = time() - (60 * 60 * 24 * intval(trim($_POST["{$var}_more"])));
  400.                 if ( $time > 0 ) {
  401.                     $criteria->add(new Criteria($var, $time, '<='));
  402.                 }
  403.             }
  404.             if ( !empty($_POST["{$var}_less"]) && is_numeric($_POST["{$var}_less"]) ) {
  405.                 $time = time() - (60 * 60 * 24 * intval(trim($_POST["{$var}_less"])));
  406.                 if ( $time > 0 ) {
  407.                     $criteria->add(new Criteria($var, $time, '>='));
  408.                 }
  409.             }
  410.         }
  411.         if ( !empty($_POST['posts_more']) && is_numeric($_POST['posts_more']) ) {
  412.             $criteria->add(new Criteria('posts', intval($_POST['posts_more']), '<='));
  413.         }
  414.         if ( !empty($_POST['posts_less']) && is_numeric($_POST['posts_less']) ) {
  415.             $criteria->add(new Criteria('posts', intval($_POST['posts_less']), '>='));
  416.         }
  417.         if ( !empty($_POST['user_mailok']) ) {
  418.             if ( $_POST['user_mailok'] == "mailng" ) {
  419.                 $criteria->add(new Criteria('user_mailok', 0));
  420.             } elseif ( $_POST['user_mailok'] == "mailok" ) {
  421.                 $criteria->add(new Criteria('user_mailok', 1));
  422.             }
  423.         }
  424.         if ( !empty($_POST['user_avatar']) ) {
  425.             if ( $_POST['user_avatar'] == "y" ) {
  426.                 $criteria->add(new Criteria('user_avatar', "('', 'blank.gif')", 'NOT IN'));
  427.             } elseif ( $_POST['user_avatar'] == "n" ) {
  428.                 $criteria->add(new Criteria('user_avatar', "('', 'blank.gif')", 'IN'));
  429.             }
  430.         }
  431.         if ( !empty($_POST['level']) ) {
  432.             $level_value = array(1 => 1, 2 => 0, 3 => -1);
  433.             $level = isset($level_value[intval($_POST["level"])]) ? $level_value[intval($_POST["level"])] : 1;
  434.             $criteria->add(new Criteria("level", $level));
  435.         }
  436.         if ( !empty($_POST['rank']) ) {
  437.             $rank_obj = $rank_handler->get( $_POST['rank'] );
  438.             if ($rank_obj->getVar("rank_special")) {
  439.                 $criteria->add(new Criteria("rank", intval($_POST['rank'])));
  440.             } else {
  441.                 if ($rank_obj->getVar("rank_min")) {
  442.                     $criteria->add(new Criteria('posts', $rank_obj->getVar("rank_min"), '>='));
  443.                 }
  444.                 if ($rank_obj->getVar("rank_max")) {
  445.                     $criteria->add(new Criteria('posts', $rank_obj->getVar("rank_max"), '<='));
  446.                 }
  447.             }
  448.         }
  449.         
  450.         $total = $user_handler->getCount($criteria, @$_POST["groups"]);
  451.         
  452.         $validsort = array("uname", "email", "last_login", "user_regdate", "posts");
  453.         $sort = (!in_array($_POST['user_sort'], $validsort)) ? "uname" : $_POST['user_sort'];
  454.         $order = "ASC";
  455.         if ( isset($_POST['user_order']) && $_POST['user_order'] == "DESC") {
  456.             $order = "DESC";
  457.         }
  458.         
  459.         $criteria->setSort($sort);
  460.         $criteria->setOrder($order);
  461.         $criteria->setLimit($limit);
  462.         $criteria->setStart($start);
  463.         $foundusers = $user_handler->getAll($criteria, @$_POST["groups"]);
  464.         
  465.     } else {
  466.         $query = trim($_POST["query"]);
  467.         // Query with alias
  468.         if (preg_match("/select[\s]+.*[\s]+from[\s]+(".$xoopsDB->prefix("users")."[\s]+as[\s]+([^\s]+).*)/i", $query, $matches) ) {
  469.             $alias = $matches[2];
  470.             $subquery = $matches[1];
  471.             
  472.         // Query without alias
  473.         } elseif (preg_match("/select[\s]+.*[\s]+from[\s]+(".$xoopsDB->prefix("users")."\b.*)/i", $query, $matches) ) {
  474.             $alias = "";
  475.             $subquery = $matches[1];
  476.             
  477.         // Invalid query
  478.         } else {
  479.             $query = "SELECT * FROM ".$xoopsDB->prefix("users");
  480.             $subquery = $xoopsDB->prefix("users");
  481.         }
  482.         
  483.         $sql_count = "SELECT COUNT(DISTINCT ".(empty($alias) ? "" : $alias . "." )."uid) FROM ". $subquery;
  484.         $result = $xoopsDB->query($sql_count);
  485.         list($total) = $xoopsDB->FetchRow($result);
  486.  
  487.         $result = $xoopsDB->query($query, $limit, $start);
  488.         $foundusers = array();
  489.         while ($myrow = $xoopsDB->fetchArray($result)) {
  490.             $object =& $user_handler->create(false);
  491.             $object->assignVars($myrow);
  492.             $foundusers[$myrow["uid"]] = $object;
  493.             unset($object);
  494.         }
  495.     }
  496.     
  497.     echo $js_adduser='
  498.         <script type="text/javascript">
  499.         var multiple='.intval($_REQUEST['multiple']).';
  500.         function addusers() 
  501.         {
  502.             var sel_str = "";
  503.             var num = 0;
  504.             var mForm = document.forms["'.$name_form.'"];
  505.             for (var i=0;i!=mForm.elements.length;i++) {
  506.                 var id=mForm.elements[i];
  507.                 if ( ( (multiple > 0 && id.type == "checkbox") || (multiple == 0 && id.type == "radio") ) && (id.checked == true) && ( id.name == "'.$name_userid.'" ) ) {
  508.                     var name = mForm.elements[++i];
  509.                     var len = id.value.length + name.value.length;
  510.                     sel_str += len + ":" + id.value + ":" + name.value;
  511.                     num ++;
  512.                 }
  513.             }
  514.             if (num == 0) {
  515.                 alert("'._MA_USER_NOUSERSELECTED.'");
  516.                 return false;
  517.             }
  518.             sel_str = num + ":" + sel_str;
  519.             window.opener.addusers(sel_str);
  520.             alert("'._MA_USER_USERADDED.'");
  521.             if (multiple == 0) {
  522.                 window.close();
  523.                 window.opener.focus();
  524.             }
  525.             return true;
  526.         }
  527.         </script>
  528.     ';
  529.     
  530.     echo "</html><body>";
  531.     echo "<a href='findusers.php?target=".htmlspecialchars(@$_POST["target"], ENT_QUOTES)."&multiple=".intval(@$_POST["multiple"])."&token=".htmlspecialchars($token, ENT_QUOTES)."'>". _MA_USER_FINDUS ."</a> <span style='font-weight:bold;'>»»</span> ". _MA_USER_RESULTS."<br /><br />";
  532.     if ( empty($start) && empty($foundusers) ) {
  533.         echo "<h4>"._MA_USER_NOFOUND,"</h4>";
  534.         $hiddenform = "<form name='findnext' action='findusers.php' method='post'>";
  535.         foreach ( $_POST as $k => $v ) {
  536.             if ($k == 'XOOPS_TOKEN_REQUEST') {
  537.                 // regenerate token value
  538.                 $hiddenform .= $GLOBALS['xoopsSecurity']->getTokenHTML()."\n";
  539.             } else {
  540.                 $hiddenform .= "<input type='hidden' name='".htmlSpecialChars($k, ENT_QUOTES)."' value='".htmlSpecialChars($myts->stripSlashesGPC($v), ENT_QUOTES)."' />\n";
  541.             }
  542.         }
  543.         if (!isset($_POST['limit'])) {
  544.             $hiddenform .= "<input type='hidden' name='limit' value='{$limit}' />\n";
  545.         }
  546.         if (!isset($_POST['start'])) {
  547.             $hiddenform .= "<input type='hidden' name='start' value='{$start}' />\n";
  548.         }
  549.         $hiddenform .= "<input type='hidden' name='token' value='".htmlspecialchars($token, ENT_QUOTES)."' />\n";
  550.         $hiddenform .= "</form>";
  551.         
  552.         echo "<div>".$hiddenform;
  553.         echo "<a href='#' onclick='javascript:document.findnext.start.value=0;document.findnext.user_submit.value=0;document.findnext.submit();'>"._MA_USER_SEARCHAGAIN."</a>\n";
  554.         echo "</div>";
  555.     } elseif ( $start < $total ) {
  556.         if ( !empty($total) ) {
  557.             echo sprintf(_MA_USER_USERSFOUND, $total)."<br />";
  558.         }
  559.         if (!empty($foundusers)) {
  560.             echo "<form action='findusers.php' method='post' name='{$name_form}' id='{$name_form}'>
  561.             <table width='100%' border='0' cellspacing='1' cellpadding='4' class='outer'>
  562.             <tr>
  563.             <th align='center' width='5px'>";
  564.             if (!empty($_POST["multiple"])) {
  565.                 echo "<input type='checkbox' name='memberslist_checkall' id='memberslist_checkall' onclick='xoopsCheckAll(\"{$name_form}\", \"memberslist_checkall\");' />";
  566.             }
  567.             echo "</th>
  568.             <th align='center'>"._MA_USER_UNAME."</th>
  569.             <th align='center'>"._MA_USER_REALNAME."</th>
  570.             <th align='center'>"._MA_USER_REGDATE."</th>
  571.             <th align='center'>"._MA_USER_LASTLOGIN."</th>
  572.             <th align='center'>"._MA_USER_POSTS."</th>
  573.             </tr>";
  574.             $ucount = 0;
  575.             foreach (array_keys($foundusers) as $j) {
  576.                 if ($ucount % 2 == 0) {
  577.                     $class = 'even';
  578.                 } else {
  579.                     $class = 'odd';
  580.                 }
  581.                 $ucount++;
  582.                 $fuser_name = $foundusers[$j]->getVar("name") ? $foundusers[$j]->getVar("name") : " ";
  583.                 echo "<tr class='$class'>
  584.                     <td align='center'>";
  585.                 if (!empty($_POST["multiple"])) {
  586.                     echo "<input type='checkbox' name='{$name_userid}' id='{$name_userid}' value='".$foundusers[$j]->getVar("uid")."' />";
  587.                     echo "<input type='hidden' name='{$name_username}' id='{$name_username}' value='".$foundusers[$j]->getVar("uname")."' />";
  588.                 } else {
  589.                     echo "<input type='radio' name='{$name_userid}' id='{$name_userid}' value='".$foundusers[$j]->getVar("uid")."' />";
  590.                     echo "<input type='hidden' name='{$name_username}' id='{$name_username}' value='".$foundusers[$j]->getVar("uname")."' />";
  591.                 }
  592.                 echo "</td>
  593.                     <td><a href='".XOOPS_URL."/userinfo.php?uid=".$foundusers[$j]->getVar("uid")."' target='_blank'>".$foundusers[$j]->getVar("uname")."</a></td>
  594.                     <td>".$fuser_name."</td>
  595.                     <td align='center'>".($foundusers[$j]->getVar("user_regdate") ? date("Y-m-d", $foundusers[$j]->getVar("user_regdate")) : "")."</td>
  596.                     <td align='center'>".($foundusers[$j]->getVar("last_login") ? date("Y-m-d H:i", $foundusers[$j]->getVar("last_login")) : "")."</td>
  597.                     <td align='center'>".$foundusers[$j]->getVar("posts")."</td>";
  598.                 echo "</tr>\n";
  599.             }
  600.             echo "<tr class='foot'><td colspan='6'>";
  601.             
  602.             // placeholder for external applications
  603.             if (empty($_POST["target"])) {
  604.                 echo "<select name='fct'><option value='users'>"._DELETE."</option><option value='mailusers'>"._MA_USER_SENDMAIL."</option>";
  605.                 echo "</select> ";
  606.                 echo $GLOBALS['xoopsSecurity']->getTokenHTML()."<input type='submit' value='"._SUBMIT."' />";
  607.                 
  608.             // Add selected users
  609.             } else {
  610.                 echo "<input type='button' value='"._MA_USER_ADD_SELECTED."' onclick='addusers();' />";
  611.             }
  612.             echo "<input type='hidden' name='token' value='".htmlspecialchars($token, ENT_QUOTES)."' />\n";
  613.             echo "</td></tr></table></form>\n";
  614.         }
  615.         
  616.         $hiddenform = "<form name='findnext' action='findusers.php' method='post'>";
  617.         foreach ( $_POST as $k => $v ) {
  618.             if ($k == 'XOOPS_TOKEN_REQUEST') {
  619.                 // regenerate token value
  620.                 $hiddenform .= $GLOBALS['xoopsSecurity']->getTokenHTML()."\n";
  621.             } else {
  622.                 $hiddenform .= "<input type='hidden' name='".htmlSpecialChars($k, ENT_QUOTES)."' value='".htmlSpecialChars($myts->stripSlashesGPC($v), ENT_QUOTES)."' />\n";
  623.             }
  624.         }
  625.         if (!isset($_POST['limit'])) {
  626.             $hiddenform .= "<input type='hidden' name='limit' value='".$limit."' />\n";
  627.         }
  628.         if (!isset($_POST['start'])) {
  629.             $hiddenform .= "<input type='hidden' name='start' value='".$start."' />\n";
  630.         }
  631.         $hiddenform .= "<input type='hidden' name='token' value='".htmlspecialchars($token, ENT_QUOTES)."' />\n";
  632.         if ( !isset($total) || ( $totalpages = ceil($total / $limit) ) > 1 ) {
  633.             $prev = $start - $limit;
  634.             if ( $start - $limit >= 0 ) {
  635.                 $hiddenform .= "<a href='#0' onclick='javascript:document.findnext.start.value=".$prev.";document.findnext.submit();'>"._MA_USER_PREVIOUS."</a> \n";
  636.             }
  637.             $counter = 1;
  638.             $currentpage = ($start+$limit) / $limit;
  639.             
  640.             if (!isset($total)) {
  641.                 while ( $counter <= $currentpage ) {
  642.                     if ( $counter == $currentpage ) {
  643.                         $hiddenform .= "<strong>".$counter."</strong> ";
  644.                     } elseif ( ($counter > $currentpage-4 && $counter < $currentpage+4) || $counter == 1 ) {
  645.                         $hiddenform .= "<a href='#".$counter."' onclick='javascript:document.findnext.start.value=".($counter-1)*$limit.";document.findnext.submit();'>".$counter."</a> ";
  646.                         if ( $counter == 1 && $currentpage > 5 ) {
  647.                             $hiddenform .= "... ";
  648.                         }
  649.                     }
  650.                     $counter++;
  651.                 }
  652.             } else {
  653.                 while ( $counter <= $totalpages ) {
  654.                     if ( $counter == $currentpage ) {
  655.                         $hiddenform .= "<strong>".$counter."</strong> ";
  656.                     } elseif ( ($counter > $currentpage-4 && $counter < $currentpage+4) || $counter == 1 || $counter == $totalpages ) {
  657.                         if ( $counter == $totalpages && $currentpage < $totalpages-4 ) {
  658.                             $hiddenform .= "... ";
  659.                         }
  660.                         $hiddenform .= "<a href='#".$counter."' onclick='javascript:document.findnext.start.value=".($counter-1)*$limit.";document.findnext.submit();'>".$counter."</a> ";
  661.                         if ( $counter == 1 && $currentpage > 5 ) {
  662.                             $hiddenform .= "... ";
  663.                         }
  664.                     }
  665.                     $counter++;
  666.                 }
  667.             }
  668.             
  669.             $next = $start + $limit;
  670.             if ( ( isset($total) && $total > $next) || ( !isset($total) && count($foundusers) >= $limit ) ) {
  671.                 $hiddenform .= " <a href='#".$total."' onclick='javascript:document.findnext.start.value=".$next.";document.findnext.submit();'>"._MA_USER_NEXT."</a>\n";
  672.             }
  673.         }
  674.         $hiddenform .= "</form>";
  675.         
  676.         echo "<div>".$hiddenform;
  677.         if (isset($total)) {
  678.             echo "<br />".sprintf(_MA_USER_USERSFOUND, $total) . " ";
  679.         }
  680.         echo "<a href='#' onclick='javascript:document.findnext.start.value=0;document.findnext.user_submit.value=0;document.findnext.submit();'>"._MA_USER_SEARCHAGAIN."</a>\n";
  681.         echo "</div>";
  682.     }
  683. }
  684.  
  685. xoops_footer();
  686. ?>