Huge rewrite:
[mailer.git] / inc / libs / rallye_functions.php
1 <?php
2 /************************************************************************
3  * MXChange v0.2.1                                    Start: 08/22/2004 *
4  * ===============                              Last change: 08/24/2004 *
5  *                                                                      *
6  * -------------------------------------------------------------------- *
7  * File              : rallye_functions.php                             *
8  * -------------------------------------------------------------------- *
9  * Short description : Special functions for rallye extension           *
10  * -------------------------------------------------------------------- *
11  * Kurzbeschreibung  : Spezielle Funktion fuer rallye-Erweiterung       *
12  * -------------------------------------------------------------------- *
13  * $Revision::                                                        $ *
14  * $Date::                                                            $ *
15  * $Tag:: 0.2.1-FINAL                                                 $ *
16  * $Author::                                                          $ *
17  * Needs to be in all Files and every File needs "svn propset           *
18  * svn:keywords Date Revision" (autoprobset!) at least!!!!!!            *
19  * -------------------------------------------------------------------- *
20  * Copyright (c) 2003 - 2008 by Roland Haeder                           *
21  * For more information visit: http://www.mxchange.org                  *
22  *                                                                      *
23  * This program is free software; you can redistribute it and/or modify *
24  * it under the terms of the GNU General Public License as published by *
25  * the Free Software Foundation; either version 2 of the License, or    *
26  * (at your option) any later version.                                  *
27  *                                                                      *
28  * This program is distributed in the hope that it will be useful,      *
29  * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
30  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
31  * GNU General Public License for more details.                         *
32  *                                                                      *
33  * You should have received a copy of the GNU General Public License    *
34  * along with this program; if not, write to the Free Software          *
35  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,               *
36  * MA  02110-1301  USA                                                  *
37  ************************************************************************/
38
39 // Some security stuff...
40 if (!defined('__SECURITY')) {
41         $INC = substr(dirname(__FILE__), 0, strpos(dirname(__FILE__), '/inc') + 4) . '/security.php';
42         require($INC);
43 }
44
45 //
46 function RALLYE_AUTOSTART_RALLYES ($result) {
47         // Global data array for LOAD_EMAIL_TEMPLATE()
48         global $DATA;
49         $DATA = array();
50
51         // Load all rallyes (usally we have only one rallye active per time!
52         list($id, $title, $start, $end, $notify, $min_users, $min_prices) = SQL_FETCHROW($result);
53         SQL_FREERESULT($result);
54
55         // Set notified to Y
56         SQL_QUERY_ESC("UPDATE `{!_MYSQL_PREFIX!}_rallye_data` SET notified='Y' WHERE `id`=%s LIMIT 1",
57         array(bigintval($id)), __FUNCTION__, __LINE__);
58
59         // Do a snapshot off all user refs
60         $result_user = SQL_QUERY("SELECT userid FROM `{!_MYSQL_PREFIX!}_user_data` WHERE `status`='CONFIRMED' ORDER BY `userid` ASC", __FUNCTION__, __LINE__);
61
62         // Transfer all neccessary data to the global $DATA array
63         $DATA['uid_cnt']    = SQL_NUMROWS($result_user);
64         $DATA['start']      = generateDateTime($start, '2');
65         $DATA['end']        = generateDateTime($end  , '2');
66         $DATA['now_t']      = generateDateTime(time(), '2');
67         $DATA['title']      = $title;
68         $DATA['id']         = $id;  // ID for the rallye details link
69
70         // Determine min_users and min_prices
71         $DATA['min_users']  = RALLYE_DETERMINE_MIN_USERS($min_users);
72         $DATA['min_prices'] = RALLYE_DETERMINE_MIN_PRICES($min_prices);
73
74         // Load prices
75         $prices = RALLYE_ADD_PRICES($id);
76
77         // Let's begin with the userids...
78         while ($content = SQL_FETCHARRAY($result_user)) {
79                 $un = false;
80
81                 // Get refs by userid
82                 $cnt = RALLYE_GET_REFCOUNT($content['userid']);
83                 if (empty($cnt)) $cnt = 0; // Added prevent some unknown troubles... :-?
84
85                 // Check if line is already included...
86                 $result_ref = SQL_QUERY_ESC("SELECT `id` FROM `{!_MYSQL_PREFIX!}_rallye_users` WHERE rallye_id=%s AND `userid`=%s LIMIT 1",
87                 array(bigintval($id), bigintval($content['userid'])), __FUNCTION__, __LINE__);
88                 if (SQL_NUMROWS($result_ref) == 0) {
89                         // Free memory
90                         SQL_FREERESULT($result_ref);
91
92                         // Add userid and his ref count to table
93                         $result_ref = SQL_QUERY_ESC("SELECT DISTINCT SUM(p.points)
94 FROM `{!_MYSQL_PREFIX!}_user_points` AS p
95 LEFT JOIN `{!_MYSQL_PREFIX!}_user_data` AS d
96 ON p.userid=d.userid
97 WHERE d.`status`='CONFIRMED' AND d.max_mails > 0 AND d.mails_confirmed >= %s AND p.ref_depth=1 AND p.points > 0 AND d.userid=%s",
98                         array(getConfig('ref_payout'), bigintval($content['userid'])), __FUNCTION__, __LINE__);
99                         list($cpoints) = SQL_FETCHROW($result_ref);
100                         SQL_FREERESULT($result_ref);
101
102                         if (empty($cpoints)) $cpoints = "0.00000";
103
104                         // Add info line
105                         SQL_QUERY_ESC("INSERT INTO `{!_MYSQL_PREFIX!}_rallye_users` (rallye_id, userid, refs, curr_points)
106 VALUES ('%s','%s','%s','%s')",
107                         array(bigintval($id), bigintval($content['userid']), bigintval($cnt), $cpoints), __FUNCTION__, __LINE__);
108                         $un = true;
109                 } // END - if
110
111                 // Ignored but for the template required refs (made before start of rallye)
112                 $DATA['refs']  = $cnt;
113
114                 // Shall I notify this member?
115                 if (($notify == 'Y') && ($un)) {
116                         // Load email template and send it to the user
117                         $message = LOAD_EMAIL_TEMPLATE("member_rallye_notify", array('prices' => $prices), $content['userid']);
118                         sendEmail($content['userid'], sprintf(getMessage('RALLYE_MEMBER_NOTIFY'), $title), $message);
119                 } // END - if
120         } // END - while
121
122         // Choose the right admin template
123         $templ = "admin_rallye_no_notify";
124         if ($notify == 'Y') $templ = "admin_rallye_notify";
125
126         // Send email to admin
127         sendAdminNotification(sprintf(getMessage('RALLYE_ADMIN_NOTIFY'), $title), $templ, $prices, '0');
128
129         // Free memory
130         SQL_FREERESULT($result_user);
131 }
132 //
133 function RALLYE_ADD_PRICES ($rallye, $mode='email') {
134         // Output mode
135         switch($mode) {
136                 case 'email': $mode = "\n";     break;
137                 case 'html' : $mode = "<br />\n"; break;
138         } // END - switch
139
140         // Load prices
141         $result_prices = SQL_QUERY("SELECT price_level, points, info FROM `{!_MYSQL_PREFIX!}_rallye_prices` WHERE rallye_id='".$rallye."' ORDER BY price_level", __FUNCTION__, __LINE__);
142         if (SQL_NUMROWS($result_prices) > 0) {
143                 // Load prices
144                 if ($mode == "\n") $prices = "{--RALLYE_MEMBER_PRICES_ADDED--}:".$mode."------------------------------".$mode;
145                 $prices = '';
146                 while ($content = SQL_FETCHARRAY($result_prices)) {
147                         $prices .= $content['price_level'].getMessage('RALLYE_PRICE').": ";
148                         if (!empty($content['info'])) {
149                                 $prices .= $content['info'];
150                         } else {
151                                 $prices .= $content['points']." {!POINTS!}";
152                         }
153                         $prices .= "".$mode;
154                 } // END - if
155
156                 // Free memory
157                 SQL_FREERESULT($result_prices);
158         } else {
159                 // No prices???
160                 $prices = sprintf(getMessage('RALLYE_MEMBER_NO_PRICES'), $mode);
161         }
162
163         // Add last line for email mode
164         if ($mode == "\n") $prices .= "------------------------------";
165
166         // Return price list
167         return $prices;
168 }
169
170 //
171 function RALLYE_ADD_TOPUSERS ($rallye, $default=0) {
172         // First check how many prices are set
173         $result = SQL_QUERY_ESC("SELECT `id` FROM `{!_MYSQL_PREFIX!}_rallye_prices` WHERE rallye_id=%s ORDER BY price_level",
174         array(bigintval($rallye)), __FUNCTION__, __LINE__);
175         $prices = SQL_NUMROWS($result);
176         SQL_FREERESULT($result);
177
178         // And load only limited users
179         $result = SQL_QUERY_ESC("SELECT DISTINCT u.userid, u.refs, u.curr_points FROM `{!_MYSQL_PREFIX!}_rallye_users` AS u
180 LEFT JOIN `{!_MYSQL_PREFIX!}_refsystem` AS r
181 ON u.userid=r.userid
182 WHERE u.rallye_id=%s AND r.counter > 0 ORDER BY u.refs DESC",
183         array(bigintval($rallye)), __FUNCTION__, __LINE__);
184
185         // Load users
186         $DATA = array(
187                 'uid'      => array(),
188                 'ref'      => array(),
189                 'cpoints'  => array()
190         );
191
192         while ($content = SQL_FETCHARRAY($result)) {
193                 // Get current refs
194                 $cnt = RALLYE_GET_REFCOUNT($content['userid'], $content['refs']);
195
196                 // Points of ref's
197                 $result_ref = SQL_QUERY_ESC("SELECT DISTINCT p.points FROM `{!_MYSQL_PREFIX!}_user_points` AS p
198 LEFT JOIN `{!_MYSQL_PREFIX!}_user_data` AS d
199 ON p.userid=d.userid
200 WHERE d.userid=%s AND d.`status`='CONFIRMED' AND p.ref_depth=1 AND d.max_mails > 0 AND d.mails_confirmed >= %s
201 LIMIT 1", array(bigintval($content['userid']), getConfig('ref_payout')), __FUNCTION__, __LINE__);
202                 list($refpoints) = SQL_FETCHROW($result_ref);
203                 SQL_FREERESULT($result_ref);
204
205                 if (empty($refpoints)) $refpoints = 0;
206
207                 // Init userid for list
208                 $_uid = '---';
209                 // List only users with at least one ref!
210                 //* DEBUG: */ echo "*".$cnt.'/'.$content['userid'].'/'.$content['curr_points'].'/'.$refpoints."*<br />\n";
211                 if (($cnt > 0) && ($refpoints > $content['curr_points'])) { $_uid = $content['userid']; } else { $cnt = ''; }
212
213                 // Save values to array
214                 $DATA['uid'][]     = $_uid;
215                 $DATA['ref'][]     = $cnt;
216                 $DATA['cpoints'][] = $content['curr_points'];
217         } // END - while
218
219         // Free memory
220         SQL_FREERESULT($result);
221
222         // Sort whole array
223         array_pk_sort($DATA, array('ref', 'cpoints'), 0, 1, true);
224
225         // Generate table
226         $OUT = LOAD_TEMPLATE("guest_rallye_header", true);
227         $SW = 2;
228         for ($idx = 0; $idx < $prices; $idx++) {
229                 if (empty($DATA['uid'][$idx])) $DATA['uid'][$idx] = '---';
230                 if (empty($DATA['ref'][$idx])) $DATA['ref'][$idx] = '---';
231                 // Add row
232                 $OUT .= "<tr>
233   <td class=\"switch_sw".$SW." bottom2\">&nbsp;&nbsp;".($idx+1).".</td>
234   <td align=\"center\" class=\"switch_sw".$SW." bottom2\">";
235                 if (($DATA['uid'][$idx] == $default) && ($default > 0)) $OUT .= "<strong>";
236                 $OUT .= $DATA['uid'][$idx];
237                 if (($DATA['uid'][$idx] == $default) && ($default > 0)) $OUT .= "</strong>";
238                 $OUT .= "</td>
239   <td align=\"center\" class=\"switch_sw".$SW." bottom2\">";
240                 if (($DATA['uid'][$idx] == $default) && ($default > 0)) $OUT .= "<strong>";
241                 $OUT .= $DATA['ref'][$idx];
242                 if (($DATA['uid'][$idx] == $default) && ($default > 0)) $OUT .= "</strong>";
243                 $OUT .= "</td>
244 </tr>\n";
245                 $SW = 3 - $SW;
246         } // END - for
247
248         // Add footer
249         $OUT .= LOAD_TEMPLATE("guest_rallye_footer", true);
250
251         // And finnally return the output
252         return $OUT;
253 }
254 // Run this function only when a new member has confirmed his email address!
255 function RALLYE_AUTOADD_USER ($uid) {
256         global $DATA;
257         $add = '';
258
259         // Updated extension?
260         if (GET_EXT_VERSION('rallye') >= '0.2.0') {
261                 $add .= ", min_users, min_prices";
262         } // END - if
263
264         // Check for an auto-add rallye
265         $result = SQL_QUERY("SELECT id, title, start_time, end_time, send_notify".$add." FROM `{!_MYSQL_PREFIX!}_rallye_data` WHERE is_active='Y' AND notified='Y' AND auto_add_new_user='Y' AND expired='N' LIMIT 1", __FUNCTION__, __LINE__);
266         if (SQL_NUMROWS($result) == 1) {
267                 // Init variables
268                 $min_users = 0; $min_prices = 0;
269                 // Load data
270                 if (GET_EXT_VERSION('rallye') >= '0.2.0') {
271                         list($id, $title, $start, $end, $notify, $min_users, $min_prices) = SQL_FETCHROW($result);
272                 } else {
273                         list($id, $title, $start, $end, $notify) = SQL_FETCHROW($result);
274                 }
275
276                 // Free result
277                 SQL_FREERESULT($result);
278
279                 // Check if line is already included...
280                 $result = SQL_QUERY_ESC("SELECT `id` FROM `{!_MYSQL_PREFIX!}_rallye_users` WHERE rallye_id=%s AND `userid`=%s LIMIT 1",
281                 array(bigintval($id), bigintval($uid)), __FUNCTION__, __LINE__);
282
283                 // Is this user added?
284                 if (SQL_NUMROWS($result) == 0) {
285                         // Add userid and his ref count to table
286                         SQL_QUERY_ESC("INSERT INTO `{!_MYSQL_PREFIX!}_rallye_users` (rallye_id, userid, refs)
287 VALUES ('%s','%s','0')",
288                         array(bigintval($id), bigintval($uid)), __FUNCTION__, __LINE__);
289                 } // END - if
290
291                 // Free memory
292                 SQL_FREERESULT($result);
293
294                 if ($notify == 'Y') {
295                         // Transfer all neccessary data to the global $DATA array
296                         $DATA['start'] = generateDateTime($start, '2');
297                         $DATA['end']   = generateDateTime($end  , '2');
298                         $DATA['now_t'] = generateDateTime(time(), '2');
299                         $DATA['title'] = $title;
300                         $DATA['id']    = $id;  // ID for the rallye details link
301                         $DATA['ref']   = 0;
302                         $DATA['refs']  = GET_TOTAL_DATA($uid, 'user_data', 'userid', "refid", true);
303
304                         // Load prices
305                         $prices = RALLYE_ADD_PRICES($id);
306
307                         // Determine min_users/prices tring
308                         $DATA['min_users']  = RALLYE_DETERMINE_MIN_USERS($min_users);
309                         $DATA['min_prices'] = RALLYE_DETERMINE_MIN_PRICES($min_prices);
310
311                         // Send notification to member
312                         $message = LOAD_EMAIL_TEMPLATE("member_rallye_notify", array('prices' => $prices), $uid);
313                         sendEmail($uid, sprintf(getMessage('RALLYE_MEMBER_NOTIFY'), $title), $message);
314                 } // END - if
315         } // END - if
316 }
317
318 //
319 function RALLYE_EXPIRE_RALLYES ($result) {
320         global $DATA;
321
322         // Load rallye data
323         list($id, $title, $start, $end, $notify, $min_users, $min_prices) = SQL_FETCHROW($result);
324         SQL_FREERESULT($result);
325
326         // Load users array (!) with assigned prices
327         $prices = RALLYE_LOAD_USERS_ARRAY($id);
328
329         // Init array
330         $DATA = array(); $cnt = 0;
331         $users = array();
332         $DATA['title']  = $title;
333         $DATA['start']  = generateDateTime($start, '1');
334         $DATA['end']    = generateDateTime($end  , '1');
335         $DATA['now_t']  = generateDateTime(time(), '1');
336
337         // Just count...
338         $total = 0;
339         foreach($prices['uid'] as $key => $uid) {
340                 // Check status
341                 //   active = 1: account is still confirmed
342                 //   active = 0: account is deleted or locked
343                 $result = SQL_QUERY_ESC("SELECT
344         COUNT(`userid`) AS active
345 FROM
346         `{!_MYSQL_PREFIX!}_user_data`
347 WHERE
348         `userid`=%s AND `status`='CONFIRMED'
349 LIMIT 1",
350                         array(bigintval($uid)), __FUNCTION__, __LINE__);
351                 list($active) = SQL_FETCHROW($result);
352                 SQL_FREERESULT($result);
353
354                 $prices['active'][$key] = $active;
355
356                 // Allow valid and active users with at least one ref to get points
357                 if (($uid > 0) && ($prices['ref'][$key] > 0) && ($active == 1) && ($prices['cpoints'][$key] > 0)) {
358                         $total++;
359                 } // END - if
360         } // END - foreach
361
362         if (($total < $min_prices) || ($total == 0)) {
363                 // Do not end this rallye!
364                 unset($DATA);
365                 return;
366         } // END - if
367
368         // Expire rallye
369         SQL_QUERY_ESC("UPDATE `{!_MYSQL_PREFIX!}_rallye_data` SET `expired`='Y' WHERE `id`=%s LIMIT 1",
370         array(bigintval($id)), __FUNCTION__, __LINE__);
371
372         // Run array through (by uid is the most important 2nd-level-array)
373         foreach($prices['uid'] as $key => $uid) {
374                 // Allow valid and active users with at least one ref to get points
375                 if (($uid > 0) && ($prices['ref'][$key] > 0) && ($prices['active'][$key] == 1) && ($prices['cpoints'][$key] > 0)) {
376                         // Transfer data to array for the mail template
377                         $DATA['level']  = $prices['level'][$key];
378                         $DATA['points'] = $prices['points'][$key];
379                         $DATA['info']   = $prices['info'][$key];
380                         $DATA['ref']    = $prices['ref'][$key];
381
382                         // Default is other
383                         $winnerLevel = 'other';
384
385                         // Determine winner level
386                         if ($DATA['level'] == 1) {
387                                 // The winner!
388                                 $winnerLevel = '_gold';
389                         } elseif ($DATA['level'] == 2) {
390                                 // The vice winner!
391                                 $winnerLevel = '_silver';
392                         } elseif ($DATA['level'] == 3) {
393                                 // The bronce winner
394                                 $winnerLevel = '_bronce';
395                         }
396
397                         if ($DATA['points'] > 0) {
398                                 // Add points directly to user's account
399                                 ADD_POINTS_REFSYSTEM_DIRECT('rallye_winner' . $winnerLevel, $uid, $DATA['points']);
400                         } // END - if
401
402                         if ($notify == 'Y') {
403                                 // Prepare infos for the mail template
404                                 if (!empty($DATA['info'])) {
405                                         // Take direct infos
406                                         $DATA['infos'] = $DATA['info'];
407                                 } else {
408                                         // Take points
409                                         $DATA['infos'] = $DATA['points'] . ' {!POINTS!}';
410                                 }
411
412                                 // Add suffix to template name
413                                 $template = 'member_rallye_expired' . $winnerLevel;
414
415                                 // Load template
416                                 $message = LOAD_EMAIL_TEMPLATE($template, $DATA, $uid);
417                                 sendEmail($uid, sprintf(getMessage('RALLYE_MEMBER_EXPIRED_SUBJ'), $DATA['level']), $message);
418                         } // END - if
419
420                         // Count userid
421                         $cnt++;
422                         $users['uid'][$uid] = $uid;
423                         $users['poi'][$uid] = $DATA['infos'];
424                 } // END - if
425         } // END - foreach
426
427         // Select template depending on notfication is switch on / off
428         if ($notify == 'Y') {
429                 $templ = "admin_rallye_expired";
430         } elseif (is_array($users['uid'])) {
431                 $templ = "admin_rallye_expired_no";
432                 $cnt = RALLYE_LOAD_USER_DATA($users);
433         }
434
435         // Send mail to admin
436         sendAdminNotification(sprintf(getMessage('RALLYE_ADMIN_EXPIRED_SUBJ'), $title), $templ, $cnt, 0);
437
438         // Add task
439         createNewTask('{--RALLYE_ADMIN_EXPIRED--}: ' . $title, '{--RALLYE_ADMIN_EXPIRED_TEXT--}', 'RALLYE_EXPIRED');
440 }
441
442 //
443 function RALLYE_LOAD_USER_DATA ($uids_array) {
444         // Implode user ids
445         $uid_string = implode(',', $uids_array['uid']);
446
447         // Init result string
448         $ret = '';
449
450         // Load users
451         $result = SQL_QUERY_ESC("SELECT `userid`, `gender`, `surname`, `family`, `email` FROM `{!_MYSQL_PREFIX!}_user_data` WHERE `userid` IN(%s) AND `status`='CONFIRMED' ORDER BY `userid` ASC LIMIT %s",
452                 array($uid_string, count($uids_array)), __FUNCTION__, __LINE__);
453         while ($content = SQL_FETCHARRAY($result)) {
454                 // Construct the message masked and add it
455                 $ret .= sprintf("%s %s %s (%s) - %s\n",
456                 translateGender($content['gender']),
457                 $content['surname'],
458                 $content['family'],
459                 $content['email'],
460                 $uids_array['poi'][$content['userid']]
461                 );
462         } // END - while
463
464         // Return result
465         return substr($ret, 0, -1);
466 }
467
468 //
469 function RALLYE_LOAD_PRICES_ARRAY ($rallye) {
470         // Init multi array
471         $prices = array(
472                 'level'  => array(),
473                 'points' => array(),
474                 'info'   => array()
475         );
476
477         // Load prices
478         $result = SQL_QUERY_ESC("SELECT price_level, points, info FROM `{!_MYSQL_PREFIX!}_rallye_prices` WHERE rallye_id=%s ORDER BY price_level",
479         array(bigintval($rallye)), __FUNCTION__, __LINE__);
480
481         // Transfer elements
482         while ($content = SQL_FETCHARRAY($result)) {
483                 $prices['level'][]  = $content['price_level'];
484                 $prices['points'][] = $content['points'];
485                 $prices['info'][]   = $content['info'];
486         } // END - while
487
488         // Free memory
489         SQL_FREERESULT($result);
490
491         // Return array
492         return $prices;
493 }
494
495 //
496 function RALLYE_LOAD_USERS_ARRAY ($rallye) {
497         // Fix zero points to 0.00000
498         if (getConfig('ref_payout') == '0') setConfigEntry('ref_payout', "0.00000");
499
500         // Init multi array
501         $users = array(
502                 'uid'     => array(),
503                 'ref'     => array(),
504                 'cpoints' => array(),
505         );
506
507         // Load users                          uid    old  points earned
508         $result_user = SQL_QUERY_ESC("SELECT userid, refs, curr_points FROM `{!_MYSQL_PREFIX!}_rallye_users` WHERE rallye_id=%s ORDER BY `userid` ASC",
509         array(bigintval($rallye)), __FUNCTION__, __LINE__);
510         while ($content = SQL_FETCHARRAY($result_user)) {
511                 // Load current ref count
512                 $cnt = RALLYE_GET_REFCOUNT($content['userid'], $content['refs']);
513
514                 // Points of ref's
515                 $result_ref = SQL_QUERY_ESC("SELECT DISTINCT SUM(p.points)
516 FROM `{!_MYSQL_PREFIX!}_user_points` AS p
517 LEFT JOIN `{!_MYSQL_PREFIX!}_user_data` AS d
518 ON p.userid=d.userid
519 WHERE d.`status`='CONFIRMED' AND d.max_mails > 0 AND d.mails_confirmed >= %s AND p.ref_depth=1 AND p.points > 0 AND d.userid=%s",
520                 array(getConfig('ref_payout'), bigintval($content['userid'])), __FUNCTION__, __LINE__);
521                 list($refpoints) = SQL_FETCHROW($result_ref);
522                 SQL_FREERESULT($result_ref);
523
524                 // Fix empty refpoints
525                 if (empty($refpoints)) $refpoints = 0;
526
527                 // Store calculated new refs to array
528                 $users['uid'][]     = $content['userid'];
529                 $users['ref'][]     = abs($cnt - $content['refs']);
530                 $users['cpoints'][] = $refpoints - $content['curr_points'];
531         } // END - while
532
533         // Free memory
534         SQL_FREERESULT($result_user);
535
536         // Sort array for refs (descending)
537         array_pk_sort($users, array("ref", "cpoints"), 0, 1, true);
538
539         // Load prices array (!)
540         $prices = RALLYE_LOAD_PRICES_ARRAY($rallye);
541
542         // Merge users into prices
543         foreach ($prices['level'] as $k => $lvl) {
544                 // We only need to check one element in $users, see above while() block
545                 if (isset($users['uid'][$k])) {
546                         $prices['uid'][$k]  = $users['uid'][$k];
547                         if (empty($prices['uid'][$k])) $prices['uid'][$k]  = '---';
548                         $prices['ref'][$k] = $users['ref'][$k];
549                         if (empty($prices['ref'][$k])) $prices['ref'][$k] = '---';
550                         $prices['cpoints'][$k] = $users['cpoints'][$k];
551                 } // END - if
552         } // END - foreach
553
554         // Return completed array
555         return $prices;
556 }
557
558 //
559 function RALLYE_LIST_WINNERS ($rallye, $default=0) {
560         // First check how many prices are set
561         $result_prices = SQL_QUERY_ESC("SELECT `id` FROM `{!_MYSQL_PREFIX!}_rallye_prices` WHERE rallye_id=%s ORDER BY price_level",
562         array(bigintval($rallye)), __FUNCTION__, __LINE__);
563         $prices = SQL_NUMROWS($result_prices);
564         SQL_FREERESULT($result_prices);
565
566         // Load data
567         $DATA = RALLYE_LOAD_USERS_ARRAY($rallye);
568
569         // Generate table
570         $OUT = LOAD_TEMPLATE("guest_rallye_expired_header", true);
571         $SW = 2;
572         for ($idx = 0; $idx < $prices; $idx++) {
573                 // Check status
574                 //   active = 1: account is still confirmed
575                 //   active = 0: account is deleted or locked
576                 $result_active = SQL_QUERY_ESC("SELECT COUNT(userid) FROM `{!_MYSQL_PREFIX!}_user_data` WHERE userid=%s AND `status`='CONFIRMED' LIMIT 1",
577                 array(bigintval($DATA['uid'][$idx])), __FUNCTION__, __LINE__);
578                 list($active) = SQL_FETCHROW($result_active);
579                 SQL_FREERESULT($result_active);
580
581                 if (empty($DATA['uid'][$idx])) $DATA['uid'][$idx] = '---';
582                 if ((empty($DATA['ref'][$idx])) || ($DATA['ref'][$idx] == 0) || ($active == 0) || ("".round($DATA['cpoints'][$idx])."" == '0') || (empty($DATA['cpoints'][$idx]))) {
583                         // Allow valid and active users with at least one ref to get points
584                         $DATA['ref'][$idx]   = '---';
585                         $DATA['uid'][$idx]   = '---';
586                 } // END - if
587
588                 if (!empty($DATA['info'][$idx])) {
589                         // Take direct infos
590                         $DATA['infos'][$idx] = $DATA['info'][$idx];
591                 } else {
592                         // Take ppints
593                         $DATA['infos'][$idx] = $DATA['points'][$idx]." {!POINTS!}";
594                 }
595
596                 // Add row
597                 $add = '';
598                 $OUT .= "<tr>
599   <td class=\"switch_sw".$SW." bottom2".$add."\">&nbsp;&nbsp;".($idx+1).".</td>
600   <td align=\"center\" class=\"switch_sw".$SW." bottom2".$add."\">";
601                 if (($DATA['uid'][$idx] == $default) && ($default > 0)) $OUT .= "<strong>";
602                 $OUT .= $DATA['uid'][$idx];
603                 if (($DATA['uid'][$idx] == $default) && ($default > 0)) $OUT .= "</strong>";
604                 $OUT .= "</td>
605   <td align=\"center\" class=\"switch_sw".$SW." bottom2".$add."\">";
606                 if (($DATA['uid'][$idx] == $default) && ($default > 0)) $OUT .= "<strong>";
607                 $OUT .= $DATA['ref'][$idx];
608                 if (($DATA['uid'][$idx] == $default) && ($default > 0)) $OUT .= "</strong>";
609                 $OUT .= "</td>
610   <td align=\"center\" class=\"switch_sw".$SW." bottom2".$add."\">";
611                 if (($DATA['uid'][$idx] == $default) && ($default > 0)) $OUT .= "<strong>";
612                 $OUT .= $DATA['infos'][$idx];
613                 if (($DATA['uid'][$idx] == $default) && ($default > 0)) $OUT .= "</strong>";
614                 $OUT .= "</td>
615 </tr>\n";
616                 $SW = 3 - $SW;
617         } // END - for
618
619         // Add footer
620         $OUT .= LOAD_TEMPLATE("guest_rallye_expired_footer", true);
621
622         // And finnally return the output
623         return $OUT;
624 }
625
626 //
627 function RALLYE_DELETE_EXPIRED_RALLYES () {
628         global $DATA;
629
630         // Check for expired rallyes
631         $EXPIRE = getConfig('one_day') * 3; // @TODO The hard-coded value...
632         $result_rallye = SQL_QUERY_ESC("SELECT id, title, start_time, end_time
633 FROM `{!_MYSQL_PREFIX!}_rallye_data`
634 WHERE end_time <= (UNIX_TIMESTAMP() - %s) AND expired='Y'",
635         array($EXPIRE), __FUNCTION__, __LINE__);
636
637         if (SQL_NUMROWS($result_rallye) > 0) {
638                 // Init SQLs
639                 INIT_SQLS();
640
641                 // Expire found rallyes and notify admin
642                 while ($content = SQL_FETCHARRAY($result_rallye)) {
643                         // Prepare data for mail template
644                         $DATA['title']  = $content['title'];
645                         $DATA['start']  = generateDateTime($content['start_time'], '1');
646                         $DATA['end']    = generateDateTime($content['end_time']  , '1');
647                         $DATA['now_t']  = generateDateTime(time(), '1');
648
649                         // Send mail to admin
650                         sendAdminNotification(sprintf(getMessage('RALLYE_ADMIN_PURGED_SUBJ'), $content['title']), "admin_rallye_purged", '', 0);
651
652                         // Purge whole rallye
653                         ADD_SQL(SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{!_MYSQL_PREFIX!}_rallye_data` WHERE `id`=%s LIMIT 1",
654                                 array(bigintval($content['id'])), __FUNCTION__, __LINE__, false));
655                         ADD_SQL(SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{!_MYSQL_PREFIX!}_rallye_prices` WHERE rallye_id=%s LIMIT 1",
656                                 array(bigintval($content['id'])), __FUNCTION__, __LINE__, false));
657                         ADD_SQL(SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{!_MYSQL_PREFIX!}_rallye_users` WHERE rallye_id=%s LIMIT 1",
658                                 array(bigintval($content['id'])), __FUNCTION__, __LINE__, false));
659
660                         // Add task
661                         createNewTask('{--RALLYE_ADMIN_PURGED--}: ' . $content['title'], '{--RALLYE_ADMIN_PURGED_TEXT--}', 'RALLYE_PURGED');
662                 } // END - while
663
664                 // Run all SQLs
665                 runFilterChain('run_sqls');
666         } // END - if
667
668         // Free memory
669         SQL_FREERESULT($result_rallye);
670 }
671
672 //
673 function RALLYE_TEMPLATE_SELECTION ($name = 'template', $default = '') {
674         // Init variables
675         $OUT = '';
676         $ral = array();
677
678         // Check templates directory
679         $basePath = sprintf("templates/%s/html/rallye/", getLanguage());
680
681         // Read the directory
682         $templates = getArrayFromDirectory($basePath, 'rallye_', false, true, array(), '.tpl');
683
684         // And walk through
685         foreach ($templates as $read) {
686                 // Cut prefix and extension away
687                 $read = substr($read, 7, strpos($read, '.') - 7);
688
689                 // Accept only template names between 1 and 255 chars length
690                 if ((strlen($read) < 256) && (!empty($read))) $ral[] = $read;
691         } // END - while
692
693         // Do we have found templates which we can link with the new rallye?
694         if (!empty($ral[0])) {
695                 // Generate selection box for all found templates
696                 // @TODO Rewrite this to our API function
697                 $OUT  = "<select name=\"".$name."\" size=\"1\" class=\"admin_select\">
698   <option value=\"\">{--SELECT_NONE--}</option>\n";
699                 foreach ($ral as $rallye) {
700                         $OUT .= "  <option value=\"".$rallye."\"";
701                         if ($default == $rallye) $OUT .= ' selected="selected"';
702                         $OUT .= ">".$rallye."</option>\n";
703                 } // END - foreach
704                 $OUT .= "</select>\n";
705         } else {
706                 // No rallye templates found
707                 $OUT = getMessage('RALLYE_NO_TEMPLATES_FOUND');
708         }
709
710         // Return selection
711         return $OUT;
712 }
713
714 //
715 function RALLYE_GET_REFCOUNT ($uid, $old = 0) {
716         // Check current refs
717         if (GET_EXT_VERSION('cache') >= '0.1.2') {
718                 // Get refs from cache
719                 $cnt = 0;
720                 foreach ($GLOBALS['cache_array']['refsystem']['userid'] as $id => $uid) {
721                         // Do we have a ref for this user?
722                         //* DEBUG: */ echo "id={$id},uid={$uid},uid={$uid},old={$old},level={$GLOBALS['cache_array']['refsystem']['level'][$id]}<br />\n";
723                         if (($uid == $uid) && ($GLOBALS['cache_array']['refsystem']['level'][$id] == 1)) {
724                                 //* DEBUG: */ echo "uid matches!<br />\n";
725                                 foreach ($GLOBALS['cache_array']['ref_depths']['level'] as $level) {
726                                         if (($level == $GLOBALS['cache_array']['refsystem']['level'][$id]) && ($level == 1)) {
727                                                 // Level does exist so abort here
728                                                 $cnt = $GLOBALS['cache_array']['refsystem']['counter'][$id];
729                                                 //* DEBUG: */ echo "*".$uid.'/'.$cnt."*<br />";
730                                                 break;
731                                         } elseif ($level > 1) {
732                                                 // Not interesting here...
733                                                 break;
734                                         }
735                                 } // END - foreach
736
737                                 // Abort also here!
738                                 if ($cnt > 0) break;
739                         } // END - if
740                 } // END - foreach
741
742                 //* DEBUG: */ echo "<pre>";
743                 //* DEBUG: */ print_r($GLOBALS['cache_array']['refsystem']);
744                 //* DEBUG: */ echo "</pre>";
745                 //* DEBUG: */ die();
746
747                 if ($cnt > 0) {
748                         // Count cache hits
749                         incrementConfigEntry('cache_hits');
750
751                         // Remove old refs
752                         //* DEBUG: */ echo '+'.$cnt.'/'.$old."+<br />";
753                         $cnt -= $old;
754                 } // END - if
755         } else {
756                 // Load current refs from database
757                 $result_ref = SQL_QUERY_ESC("SELECT DISTINCT SUM(s.counter) AS cnt
758 FROM `{!_MYSQL_PREFIX!}_refsystem` AS s
759 LEFT JOIN `{!_MYSQL_PREFIX!}_refdepths` AS d
760 ON s.level=d.level
761 WHERE s.userid=%s AND s.level=1", array(bigintval($uid)), __FUNCTION__, __LINE__);
762                 list($cnt) = SQL_FETCHROW($result_ref);
763                 SQL_FREERESULT($result_ref);
764                 if (empty($cnt)) {
765                         $cnt = 0;
766                 } else {
767                         $cnt -= $old;
768                 }
769         }
770
771         // Return count
772         //* DEBUG: */ echo "*".$uid.'/'.$old.'/'.$cnt."*<br />";
773         return $cnt;
774 }
775
776 // Determines the right language string for min_users
777 function RALLYE_DETERMINE_MIN_USERS ($min_users) {
778         // Rallye ends without user limitation is the default
779         $return = getMessage('RALLYE_END_NO_USER_LIMITATION');
780
781         if ($min_users > 0) {
782                 // Rallye ends when X members are totally in your exchange
783                 $return = sprintf(getMessage('RALLYE_END_USERS'), $min_users);
784         } // END - if
785
786         // Return
787         return $return;
788 }
789
790 // Determines the right language string for min_prices
791 function RALLYE_DETERMINE_MIN_PRICES ($min_prices) {
792         // Rallye ends without user limitation is the default
793         $return = getMessage('RALLYE_END_NO_PRICE_LIMITATION');
794
795         if ($min_prices > 0) {
796                 // Rallye ends when X members are totally in your exchange
797                 $return = sprintf(getMessage('RALLYE_END_PRICES'), $min_prices);
798         } // END - if
799
800         // Return
801         return $return;
802 }
803
804 // Filter for extra-autpurge
805 function FILTER_RALLYE_EXTRA_AUTOPURGE () {
806         // Check expired rallyes (hard-coded 3 days limit for displaying expired rallyes!)
807         RALLYE_DELETE_EXPIRED_RALLYES();
808 }
809
810 //
811 ?>