]> git.mxchange.org Git - mailer.git/blobdiff - inc/libs/surfbar_functions.php
Extension ext-surfbar continued:
[mailer.git] / inc / libs / surfbar_functions.php
index 72b8c8bb17a204caef20b7605b70ad7a5adf4438..4e641f4cc8951c7f0200bda63e53bce5e760b6e2 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /************************************************************************
- * MXChange v0.2.1                                    Start: 08/31/2008 *
- * ===============                              Last change: 08/31/2008 *
+ * Mailer v0.2.1-FINAL                                Start: 08/31/2008 *
+ * ===================                          Last change: 08/31/2008 *
  *                                                                      *
  * -------------------------------------------------------------------- *
  * File              : surfbar_functions.php                            *
  * -------------------------------------------------------------------- *
  * Kurzbeschreibung  : Funktionen fuer die Surfbar                      *
  * -------------------------------------------------------------------- *
- *                                                                      *
+ * $Revision::                                                        $ *
+ * $Date::                                                            $ *
+ * $Tag:: 0.2.1-FINAL                                                 $ *
+ * $Author::                                                          $ *
  * -------------------------------------------------------------------- *
- * Copyright (c) 2003 - 2008 by Roland Haeder                           *
- * For more information visit: http://www.mxchange.org                  *
+ * Copyright (c) 2003 - 2009 by Roland Haeder                           *
+ * Copyright (c) 2009 - 2012 by Mailer Developer Team                   *
+ * For more information visit: http://mxchange.org                      *
  *                                                                      *
  * This program is free software; you can redistribute it and/or modify *
  * it under the terms of the GNU General Public License as published by *
  ************************************************************************/
 
 // Some security stuff...
-if (ereg(basename(__FILE__), $_SERVER['PHP_SELF'])) {
-       $INC = substr(dirname(__FILE__), 0, strpos(dirname(__FILE__), "/inc") + 4) . "/security.php";
-       require($INC);
+if (!defined('__SECURITY')) {
+       die();
+} // END - if
+
+//------------------------------------------------------------------------------
+//                               Admin functions
+//------------------------------------------------------------------------------
+
+// Admin has added an URL with given user id and so on
+function doSurfbarAdminAddUrl ($url, $limit, $reload, $waiting) {
+       // Do some pre-checks
+       if (!isAdmin()) {
+               // Not an admin
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("Cannot add URL=%s,limit=%s,reload=%s: Not admin.", $url, $limit, $reload));
+               return FALSE;
+       } elseif (!isUrlValid($url)) {
+               // URL invalid
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("Cannot add URL=%s,limit=%s,reload=%s: Invalid URL.", $url, $limit, $reload));
+               return FALSE;
+       } elseif (ifSurfbarHasUrlUserId($url, 0)) {
+               // URL already found in surfbar!
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("Cannot add URL=%s,limit=%s,reload=%s: Already added.", $url, $limit, $reload));
+               return FALSE;
+       } elseif (!ifSurfbarMemberAllowedMoreUrls()) {
+               // No more allowed!
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("Cannot add URL=%s,limit=%s,reload=%s: No more URLs allowed.", $url, $limit, $reload));
+               return FALSE;
+       } elseif ('' . ($limit + 0) . '' != '' . $limit . '') {
+               // Invalid limit entered
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("Cannot add URL=%s,limit=%s,reload=%s: Invalid limit entered.", $url, $limit, $reload));
+               return FALSE;
+       } elseif ('' . ($reload + 0) . '' != '' . $reload . '') {
+               // Invalid amount entered
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("Cannot add URL=%s,limit=%s,reload=%s: Invalid reload entered.", $url, $limit, $reload));
+               return FALSE;
+       } elseif ('' . ($waiting + 0) . '' != '' . $waiting . '') {
+               // Invalid amount entered
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("Cannot add URL=%s,limit=%s,waiting=%s: Invalid waiting entered.", $url, $limit, $waiting));
+               return FALSE;
+       }
+
+       // Register the new URL
+       return doSurfbarRegisterUrl($url, 0, 'ACTIVE', 'unlock', array('limit' => $limit, 'reload' => $reload, 'waiting' => $waiting));
+}
+
+// Admin unlocked an email so we can migrate the URL
+function doSurfbarAdminMigrateUrl ($url, $userid) {
+       // Do some pre-checks
+       if (!isAdmin()) {
+               // Not an admin
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot migrate URL: Not admin, url=' . $url . ',userid=' . $userid);
+               return FALSE;
+       } elseif (!isUrlValid($url)) {
+               // URL invalid
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot migrate URL: Invalid URL, url=' . $url . ',userid=' . $userid);
+               return FALSE;
+       } elseif (ifSurfbarHasUrlUserId($url, $userid)) {
+               // URL already found in surfbar!
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot migrate URL: Already added, url=' . $url . ',userid=' . $userid);
+               return FALSE;
+       } elseif (!ifSurfbarMemberAllowedMoreUrls($userid)) {
+               // No more allowed!
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot migrate URL: Maximum exceeded, url=' . $url . ',userid=' . $userid);
+               return FALSE;
+       }
+
+       // Register the new URL
+       return doSurfbarRegisterUrl($url, $userid, 'MIGRATED', 'migrate');
 }
 
-// Admin has added an URL with given user id
-function SURFBAR_ADMIN_ADD_URL ($url, $uid, $reward, $costs, $paymentId) {
-       // Is this really an admin?
-       if (!IS_ADMIN()) {
-               // Then leave here
-               return false;
+// Admin function for unlocking URLs
+function doSurfbarAdminUnlockUrlIds ($IDs) {
+       // Is this an admin or invalid array?
+       if (!isAdmin()) {
+               // Not admin or invalid ids array
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: Not admin');
+               return FALSE;
+       } elseif (!is_array($IDs)) {
+               // No array
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: IDs type ' . gettype($IDs) . '!=array');
+               return FALSE;
+       } elseif (count($IDs) == 0) {
+               // Empty array
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: IDs is empty');
+               return FALSE;
+       }
+
+       // Set to true to make AND expression valid if first URL got unlocked
+       $done = TRUE;
+
+       // Update the status for all ids
+       foreach ($IDs as $id => $dummy) {
+               // Test all ids through (ignores failed)
+               $done = (($done) && (changeSurfbarUrlStatus($id, 'PENDING', 'ACTIVE')));
        } // END - if
 
-       // Check if that URL does not exist
-       if (SURFBAR_LOOKUP_BY_URL($url, $uid)) {
-               // Already found!
-               return false;
+       // Return total status
+       return $done;
+}
+
+// Admin function for rejecting URLs
+function doSurfbarAdminRejectUrlIds ($IDs) {
+       // Is this an admin or invalid array?
+       if (!isAdmin()) {
+               // Not admin or invalid ids array
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: Not admin');
+               return FALSE;
+       } elseif (!is_array($IDs)) {
+               // No array
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: IDs type ' . gettype($IDs) . '!=array');
+               return FALSE;
+       } elseif (count($IDs) == 0) {
+               // Empty array
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: IDs is empty');
+               return FALSE;
+       }
+
+       // Set to true to make AND expression valid if first URL got unlocked
+       $done = TRUE;
+
+       // Update the status for all ids
+       foreach ($IDs as $id => $dummy) {
+               // Test all ids through (ignores failed)
+               $done = (($done) && (changeSurfbarUrlStatus($id, 'PENDING', 'REJECTED')));
        } // END - if
 
+       // Return total status
+       return $done;
+}
+
+//------------------------------------------------------------------------------
+//                               Member functions
+//------------------------------------------------------------------------------
+
+// Member has added an URL
+function doSurfbarMemberAddUrl ($url, $limit) {
+       // Do some pre-checks
+       if (!isMember()) {
+               // Not a member
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: isMember()=false');
+               return FALSE;
+       } elseif ((!isUrlValid($url)) && (!isAdmin())) {
+               // URL invalid
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: Invalid, url=' . $url . ',limit=' . $limit);
+               return FALSE;
+       } elseif (ifSurfbarHasUrlUserId($url, getMemberId())) {
+               // URL already found in surfbar!
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: Already found, url=' . $url . ',limit=' . $limit);
+               return FALSE;
+       } elseif (!ifSurfbarMemberAllowedMoreUrls(getMemberId())) {
+               // No more allowed!
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: Maximum exceeded, url=' . $url . ',limit=' . $limit);
+               return FALSE;
+       } elseif (''.($limit + 0).'' != ''.$limit.'') {
+               // Invalid amount entered
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: Invalid limit, url=' . $url . ',limit=' . $limit);
+               return FALSE;
+       }
+
        // Register the new URL
-       return SURFBAR_REGISTER_URL($url, $uid, $reward, $costs, $paymentId, "CONFIRMED", "unlock");
+       return doSurfbarRegisterUrl($url, getMemberId(), 'PENDING', 'reg', array('limit' => $limit));
+}
+
+// Create list of actions depending on status for the user
+function generateSurfbarMemberActions ($urlId, $status) {
+       // Load all actions in an array for given status
+       $actionArray = getSurfbarArrayFromStatus($status);
+
+       // Calculate width
+       $width = round(100 / count($actionArray));
+
+       // "Walk" through all actions and create forms
+       $OUT = '';
+       foreach ($actionArray as $actionId => $action) {
+               // Add form for this action
+               $OUT .= loadTemplate('member_list_surfbar_form', TRUE, array(
+                       'width'  => $width,
+                       'url_id' => bigintval($urlId),
+                       'action' => strtolower($action)
+               ));
+       } // END - foreach
+
+       // Load main template
+       $output = loadTemplate('member_list_surfbar_table', TRUE, $OUT);
+
+       // Return code
+       return $output;
+}
+
+// Do the member form request
+function doSurfbarMemberByFormData ($formData, $urlArray) {
+       // By default no action is performed
+       $performed = FALSE;
+
+       // Is this a member?
+       if (!isMember()) {
+               // No member!
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: isMember()=false');
+               return FALSE;
+       } elseif ((!isset($formData['url_id'])) || (!isset($formData['action']))) {
+               // Important form elements are missing!
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: Invalid form data, required field id/action not found');
+               return FALSE;
+       } elseif (!isset($urlArray[$formData['url_id']])) {
+               // Id not found in cache
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: Field url_id not found in cache');
+               return FALSE;
+       } elseif (!isSurfbarMemberActionStatusValid($formData['action'], $urlArray[$formData['url_id']]['url_status'])) {
+               // Action not allowed for current URL status
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cannot add URL: Action not allowed to perform. action=' . $formData['action'] . ',url_status=' . $urlArray[$formData['url_id']]['url_status'] . ',url_id=' . $formData['url_id']);
+               return FALSE;
+       }
+
+       // Secure action
+       $action = secureString($formData['action']);
+
+       // Has it changed?
+       if ($action != $formData['action']) {
+               // Invalid data in action found
+               return FALSE;
+       } // END - if
+
+       // Create the function name for selected action
+       $functionName = sprintf("doSurfbarMember%sAction", firstCharUpperCase($action));
+
+       // Is the function there?
+       if (function_exists($functionName)) {
+               // Load data and add it to globals array
+               $urlData = getSurfbarUrlData($formData['url_id']);
+               $GLOBALS['surfbar_cache'] = merge_array($GLOBALS['surfbar_cache'], $urlData[$formData['url_id']]);
+
+               // Add new status
+               $urlArray[$formData['url_id']]['new_status'] = getSurfbarNewStatus('new_status');
+
+               // Extract URL data for call-back
+               $urlData = array(merge_array($urlArray[$formData['url_id']], array($action => $formData)));
+
+               // Action found so execute it
+               $performed = call_user_func_array($functionName, $urlData);
+       } else {
+               // Log invalid request
+               reportBug(__FUNCTION__, __LINE__, 'Invalid member action! action=' . $formData['action'] . ',url_id=' . $formData['url_id'] . ',function=' . $functionName);
+       }
+
+       // Return status
+       return $performed;
+}
+
+// Getter for surfbar_actions table by given id number
+function getSurfbarActionsDataById ($columnName, $id) {
+       // Is cache set?
+       if (!isset($GLOBALS[__FUNCTION__][$id][$columnName])) {
+               // Default is not found
+               $GLOBALS[__FUNCTION__][$id][$columnName] = '*INVALID*';
+
+               // Search for it
+               $result = SQL_QUERY_ESC("SELECT `%s` FROM `{?_MYSQL_PREFIX?}_surfbar_actions` WHERE `actions_id`=%s LIMIT 1",
+                       array(
+                               $columnName,
+                               bigintval($id)
+                       ), __FUNCTION__, __LINE__);
+
+               // Is there an entry?
+               if (SQL_NUMROWS($result) == 1) {
+                       // Load it
+                       list($GLOBALS[__FUNCTION__][$id][$columnName]) = SQL_FETCHROW($result);
+               } // END - if
+
+               // Free result
+               SQL_FREERESULT($result);
+       } // END - if
+
+       // Return value
+       return $GLOBALS[__FUNCTION__][$id][$columnName];
+}
+
+// Validate if the requested action can be performed on current URL status
+function isSurfbarMemberActionStatusValid ($action, $status) {
+       // Search for the requested action/status combination in database
+       $result = SQL_QUERY_ESC("SELECT `actions_new_status` FROM `{?_MYSQL_PREFIX?}_surfbar_actions` WHERE `actions_action`='%s' AND `actions_status`='%s' LIMIT 1",
+               array(
+                       strtoupper($action),
+                       strtoupper($status)
+               ), __FUNCTION__, __LINE__);
+
+       // Is the entry there?
+       $isValid = (SQL_NUMROWS($result) == 1);
+
+       // Debug message
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'action=' . $action . ',status=' . $status . ',isValid=' . intval($isValid));
+
+       // Fetch the new status if found
+       if ($isValid === TRUE) {
+               // Load new status
+               list($GLOBALS['surfbar_cache']['new_status']) = SQL_FETCHROW($result);
+       } // END - if
+
+       // Free result
+       SQL_FREERESULT($result);
+
+       // Return status
+       return $isValid;
+}
+
+//------------------------------------------------------------------------------
+//                               Member actions
+//------------------------------------------------------------------------------
+
+// Retreat a booked URL
+function doSurfbarMemberRetreatAction ($urlData) {
+       // Create the data array for next function call
+       $data = array(
+               $urlData['url_id'] => $urlData
+       );
+
+       // Simply change the status here
+       return changeSurfbarUrlStatus ($urlData['url_id'], $urlData['url_status'], $urlData['new_status'], $data);
+}
+
+// Book an URL now (from migration)
+function doSurfbarMemberBooknowAction ($urlData) {
+       // Create the data array for next function call
+       $data = array(
+               $urlData['url_id'] => $urlData
+       );
+
+       // Simply change the status here
+       return changeSurfbarUrlStatus ($urlData['url_id'], $urlData['url_status'], $urlData['new_status'], $data);
+}
+
+// Show edit form or do the changes
+function doSurfbarMemberEditAction ($urlData) {
+       // Is the "execute" flag there?
+       if (isset($urlData['edit']['execute'])) {
+               // Execute the changes
+               return executeSurfbarMemberAction('edit', $urlData);
+       } // END - if
+
+       // Display form
+       return displaySurfbarMemberActionForm('edit', $urlData);
+}
+
+// Show delete form or do the changes
+function doSurfbarMemberDeleteAction ($urlData) {
+       // Is the "execute" flag there?
+       if (isset($urlData['delete']['execute'])) {
+               // Execute the changes
+               return executeSurfbarMemberAction('delete', $urlData);
+       } // END - if
+
+       // Display form
+       return displaySurfbarMemberActionForm('delete', $urlData);
+}
+
+// Pause active banner
+function doSurfbarMemberPauseAction ($urlData) {
+       return changeSurfbarUrlStatus($urlData['url_id'], $urlData['url_status'], $urlData['new_status'], array($urlData['url_id'] => $urlData));
+}
+
+// Unpause stopped banner
+function doSurfbarMemberUnpauseAction ($urlData) {
+       // Fix missing entry for template
+       $urlData['edit'] = $urlData['unpause'];
+       $urlData['edit']['url'] = $urlData['url'];
+       $urlData['edit']['limit'] = getSurfbarViewsMax();
+
+       // Return status change
+       return changeSurfbarUrlStatus($urlData['url_id'], $urlData['url_status'], $urlData['new_status'], array($urlData['url_id'] => $urlData));
+}
+
+// Resubmit locked URL
+function doSurfbarMemberResubmitAction ($urlData) {
+       return changeSurfbarUrlStatus($urlData['url_id'], $urlData['url_status'], $urlData['new_status'], array($urlData['url_id'] => $urlData));
+}
+
+// Display selected "action form"
+function displaySurfbarMemberActionForm ($action, $urlData) {
+       // Translate some data if present
+       $content = prepareSurfbarContentForTemplate($urlData);
+
+       // Include fields only for action 'edit'
+       if ($action == 'edit') {
+               // Default is not limited
+               $urlData['limited_yes'] = '';
+               $urlData['limited_no']  = ' checked="checked"';
+               $urlData['limited']     = 'false';
+
+               // Is this URL limited?
+               if (getSurfbarViewsMax() > 0) {
+                       // Then rewrite form data
+                       $urlData['limited_yes'] = ' checked="checked"';
+                       $urlData['limited_no']  = '';
+                       $urlData['limited']     = 'true';
+               } // END - if
+       } // END - if
+
+       // Load the form and display it
+       loadTemplate(sprintf("member_surfbar_%s_action_form", $action), FALSE, $urlData);
+
+       // All fine by default ... ;-)
+       return TRUE;
+}
+
+// Execute choosen action
+function executeSurfbarMemberAction ($action, $urlData) {
+       // By default nothing is executed
+       $executed = FALSE;
+
+       // Is limitation "no" and "limit" is > 0?
+       if ((isset($urlData[$action]['limited'])) && ($urlData[$action]['limited'] != 'Y') && ((isset($urlData[$action]['limit'])) && ($urlData[$action]['limit'] > 0)) || (!isset($urlData[$action]['limit']))) {
+               // Set it to unlimited
+               $urlData[$action]['limit'] = '0';
+       } // END - if
+
+       // Construct function name
+       $functionName = sprintf("executeSurfbarMember%sAction", firstCharUpperCase($action));
+
+       // Is that function there?
+       if (function_exists($functionName)) {
+               // Execute the function
+               if (call_user_func_array($functionName, array($urlData)) == TRUE) {
+                       // Update status as well
+                       $executed = changeSurfbarUrlStatus($urlData['url_id'], $urlData['url_status'], $urlData['new_status'], array($urlData['url_id'] => $urlData));
+               } // END - if
+       } else {
+               // Not found
+               reportBug(__FUNCTION__, __LINE__, 'Callback function ' . $functionName . ' does not exist.');
+       }
+
+       // Return status
+       return $executed;
+}
+
+// "Execute edit" function: Update changed data
+function executeSurfbarMemberEditAction ($urlData) {
+       // Default is nothing done
+       $status = FALSE;
+
+       // Has the URL or limit changed?
+       if (TRUE) {
+               // @TODO if (($urlData['url_views_allowed'] != $urlData['edit']['limit']) || ($url1 != $url2)) {
+               // Run the query
+               SQL_QUERY_ESC("UPDATE
+       `{?_MYSQL_PREFIX?}_surfbar_urls`
+SET
+       `url`='%s',
+       `url_views_allowed`=%s,
+       `url_views_max`=%s
+WHERE
+       `url_id`=%s AND
+       `url_status`='%s'
+LIMIT 1",
+                       array(
+                               $urlData['url'],
+                               $urlData['edit']['limit'],
+                               $urlData['edit']['limit'],
+                               $urlData['url_id'],
+                               $urlData['url_status']
+                       ), __FUNCTION__, __LINE__);
+
+               // All fine
+               $status = TRUE;
+       } // END - if
+
+       // Return status
+       return $status;
+}
+
+// "Execute delete" function: Does nothing...
+function executeSurfbarMemberDeleteAction ($urlData) {
+       // Nothing special to do (see above function for such "special actions" to perform)
+       return TRUE;
+}
+
+//------------------------------------------------------------------------------
+//                           Self-maintenance functions
+//------------------------------------------------------------------------------
+
+// Main function
+function doSurfbarSelfMaintenance () {
+       // Handle URLs which limit has depleted so we can stop them
+       doHandleSurfbarDepletedViews();
+
+       // Handle low-points amounts
+       doHandleSurfbarLowPoints();
+}
+
+// Handle URLs which limit has depleted
+function doHandleSurfbarDepletedViews () {
+       // Get all URLs
+       $urlArray = getSurfbarUrlData(0, 'url_views_max', 'url_id', 'ASC', 'url_id', " AND `url_views_allowed` > 0 AND `url_status`='ACTIVE'");
+
+       // Are there some entries?
+       if (count($urlArray) > 0) {
+               // Then handle all!
+               foreach ($urlArray as $id => $urlData) {
+                       // Backup data
+                       $data = $urlData;
+
+                       // Rewrite array for next call
+                       $urlData = array(
+                               $id => $data
+                       );
+
+                       // Handle the status
+                       changeSurfbarUrlStatus($id, 'ACTIVE', 'DEPLETED', $urlData);
+               } // END - foreach
+       } // END - if
+}
+
+// Alert users which have URLs booked and are low on points amount
+function doHandleSurfbarLowPoints () {
+       // Get all userids
+       $userids = determineSurfbarDepletedUserids(getConfig('surfbar_warn_low_points'));
+
+       // "Walk" through all URLs
+       foreach ($userids['url_userid'] as $userid => $dummy) {
+               // Is the last notification far enougth away to notify again?
+               if ((time() - $userids['notified'][$userid]) >= getConfig('surfbar_low_interval')) {
+                       // Prepare content
+                       $content = array(
+                               'url_userid' => $userid,
+                               'points'     => $userids['points'][$userid],
+                               'notified'   => $userids['notified'][$userid]
+                       );
+
+                       // Notify this user
+                       doSurfbarNotifyMember('low_points', $content);
+
+                       // Update last notified
+                       SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_user_data` SET `surfbar_low_notified`=NOW() WHERE `userid`=%s LIMIT 1",
+                               array($userid), __FUNCTION__, __LINE__);
+               } // END - if
+       } // END - foreach
 }
+
+//
+//------------------------------------------------------------------------------
+//                               Generic functions
+//------------------------------------------------------------------------------
+//
+
 // Looks up by an URL
-function SURFBAR_LOOKUP_BY_URL ($url) {
+function ifSurfbarHasUrlUserId ($url, $userid) {
        // Now lookup that given URL by itself
-       $urlArray = SURFBAR_GET_URL_DATA($url, "url");
+       $urlArray = getSurfbarUrlData($url, 'url', 'url_id', 'ASC', 'url_id', sprintf(" AND `url_userid`=%s", bigintval($userid)));
 
        // Was it found?
        return (count($urlArray) > 0);
 }
-// Load URL data by given search term and column
-function SURFBAR_GET_URL_DATA ($searchTerm, $column="id", $order="id", $sort="ASC", $group="id") {
-       global $lastUrlData;
 
+// Load URL data by given search term and column
+function getSurfbarUrlData ($searchTerm, $column = 'url_id', $order = 'url_id', $sort = 'ASC', $group = 'url_id', $add = '') {
        // By default nothing is found
-       $lastUrlData = array();
+       $GLOBALS['last_url_data'] = array();
 
        // Is the column an id number?
-       if (($column == "id") || ($column == "userid")) {
+       if (($column == 'url_id') || ($column == 'url_userid')) {
                // Extra secure input
                $searchTerm = bigintval($searchTerm);
        } // END - if
 
+       // If the column is 'url_id' there can be only one entry
+       $limit = '';
+       if ($column == 'url_id') {
+               $limit = 'LIMIT 1';
+       } // END - if
+
        // Look up the record
-       $result = SQL_QUERY_ESC("SELECT id, userid, url, reward, costs, views_total, status, registered, last_locked, lock_reason
-FROM "._MYSQL_PREFIX."_surfbar_urls
-WHERE %s='%s'
-ORDER BY %s %s",
-               array($column, $searchTerm, $order, $sort), __FILE__, __LINE__);
+       $result = SQL_QUERY_ESC("SELECT
+       `url_id`,
+       `url_userid`,
+       `url_package_id`,
+       `url`,
+       `url_views_total`,
+       `url_views_max`,
+       `url_views_allowed`,
+       `url_status`,
+       UNIX_TIMESTAMP(`url_registered`) AS `url_registered`,
+       UNIX_TIMESTAMP(`url_last_locked`) AS `url_last_locked`,
+       `url_lock_reason`,
+       `url_views_max`,
+       `url_views_allowed`,
+       `url_fixed_reload`,
+       `url_fixed_waiting`
+FROM
+       `{?_MYSQL_PREFIX?}_surfbar_urls`
+WHERE
+       `%s`='%s'" . $add . "
+ORDER BY
+       `%s` %s
+%s",
+               array(
+                       $column,
+                       $searchTerm,
+                       $order,
+                       $sort,
+                       $limit
+               ), __FUNCTION__, __LINE__);
 
        // Is there at least one record?
-       if (SQL_NUMROWS($result) > 0) {
+       if (!SQL_HASZERONUMS($result)) {
                // Then load all!
                while ($dataRow = SQL_FETCHARRAY($result)) {
                        // Shall we group these results?
-                       if ($group == "id") {
+                       if ($group == 'url_id') {
                                // Add the row by id as index
-                               $lastUrlData[$dataRow['id']] = $dataRow;
+                               $GLOBALS['last_url_data'][$dataRow['url_id']] = $dataRow;
                        } else {
                                // Group entries
-                               $lastUrlData[$dataRow[$group]][$dataRow['id']] = $dataRow;
+                               $GLOBALS['last_url_data'][$dataRow[$group]][$dataRow['url_id']] = $dataRow;
                        }
                } // END - while
        } // END - if
@@ -101,352 +655,703 @@ ORDER BY %s %s",
        SQL_FREERESULT($result);
 
        // Return the result
-       return $lastUrlData;
+       return $GLOBALS['last_url_data'];
 }
-// Registers an URL with the surfbar. You should have called SURFBAR_LOOKUP_BY_URL() first!
-function SURFBAR_REGISTER_URL ($url, $uid, $reward, $paymentId, $costs, $status="PENDING", $addMode="reg") {
-       global $_CONFIG;
 
+// Registers an URL with the surfbar. You should have called ifSurfbarHasUrlUserId() first!
+function doSurfbarRegisterUrl ($url, $userid, $status = 'PENDING', $addMode = 'reg', $extraFields = array()) {
        // Make sure by the user registered URLs are always pending
-       if ($addMode == "reg") $status = "PENDING";
+       if ($addMode == 'reg') {
+               $status = 'PENDING';
+       } // END - if
 
        // Prepare content
-       $content = array(
+       $content = merge_array($extraFields, array(
                'url'         => $url,
-               'frametester' => FRAMETESTER($url),
-               'uid'         => $uid,
-               'reward'      => $reward,
-               'costs'       => $costs,
-               'payment_id'  => $paymentId,
-               'status'      => $status
-       );
+               'url_userid'  => $userid,
+               'url_status'  => $status,
+       ));
+
+       // Is limit/reload set?
+       if (!isset($content['limit'])) {
+               $content['limit']  = '0';
+       } // END - if
+       if (!isset($content['reload'])) {
+               $content['reload'] = '0';
+       } // END - if
+       if (!isset($content['waiting'])) {
+               $content['waiting'] = '0';
+       } // END - if
 
        // Insert the URL into database
-       $content['insert_id'] = SURFBAR_INSERT_URL_BY_ARRAY($content);
+       $content['insert_id'] = insertSurfbarUrlByArray($content);
 
-       // Translate status, reward and costs
-       $content['status'] = SURFBAR_TRANSLATE_STATUS($content['status']);
-       $content['reward'] = TRANSLATE_COMMA($content['reward']);
-       $content['costs']  = TRANSLATE_COMMA($content['costs']);
+       // Is this id valid?
+       if ($content['insert_id'] == '0') {
+               // INSERT did not insert any data!
+               return FALSE;
+       } // END - if
 
        // If in reg-mode we notify admin
-       if (($addMode == "reg") || ($_CONFIG['surfbar_notify_admin_unlock'] == "Y")) {
+       if (($addMode == 'reg') || (getConfig('surfbar_notify_admin_unlock') == 'Y')) {
                // Notify admin even when he as unlocked an email
-               SURFBAR_NOTIFY_ADMIN("url_{$addMode}", $content);
+               doSurfbarNotifyAdmin('url_' . $addMode, $content);
        } // END - if
 
        // Send mail to user
-       SURFBAR_NOTIFY_USER("url_{$addMode}", $content);
+       doSurfbarNotifyMember('url_' . $addMode, $content);
 
        // Return the insert id
        return $content['insert_id'];
 }
+
 // Inserts an url by given data array and return the insert id
-function SURFBAR_INSERT_URL_BY_ARRAY ($urlData) {
+function insertSurfbarUrlByArray ($urlData) {
+       // Get userid
+       $userid = bigintval($urlData['url_userid']);
+
+       // Is the id set?
+       if (empty($userid)) {
+               $userid = 'NULL';
+       } // END - if
+
        // Just run the insert query for now
-       SQL_QUERY_ESC("INSERT INTO "._MYSQL_PREFIX."_surfbar_urls (userid, url, reward, costs, payment_id, status) VALUES(%s, '%s', %s, %s, %s, '%s')",
+       SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_surfbar_urls` (`url_userid`, `url`, `url_status`, `url_views_max`, `url_views_allowed`, `url_fixed_reload`, `url_fixed_waiting`) VALUES (%s, '%s', '%s', %s, %s, %s, %s)",
                array(
-                       bigintval($urlData['uid']),
+                       $userid,
                        $urlData['url'],
-                       (float)$urlData['reward'],
-                       (float)$urlData['costs'],
-                       bigintval($urlData['payment_id']),
-                       $urlData['status']
-               ), __FILE__, __LINE__
+                       $urlData['url_status'],
+                       $urlData['limit'],
+                       $urlData['limit'],
+                       $urlData['reload'],
+                       $urlData['waiting']
+               ), __FUNCTION__, __LINE__
        );
 
        // Return insert id
        return SQL_INSERTID();
 }
+
 // Notify admin(s) with a selected message and content
-function SURFBAR_NOTIFY_ADMIN ($messageType, $content) {
+function doSurfbarNotifyAdmin ($messageType, $content) {
        // Prepare template name
        $templateName = sprintf("admin_surfbar_%s", $messageType);
 
        // Prepare subject
-       $eval = sprintf("\$subject = ADMIN_SURFBAR_NOTIFY_%s_SUBJECT;",
+       $subject = sprintf("{--ADMIN_SURFBAR_NOTIFY_%s_SUBJECT--}",
                strtoupper($messageType)
        );
-       eval($eval);
+
+       // Is the subject line there?
+       if ((substr($subject, 0, 1) == '!') && (substr($subject, -1, 1) == '!')) {
+               // Set default subject if following eval() wents wrong
+               $subject = '{%message,ADMIN_SURFBAR_NOTIFY_DEFAULT_SUBJECT=' . strtoupper($messageType) . '%}';
+       } // END - if
+
+       // Translate some data if present
+       $content = prepareSurfbarContentForTemplate($content);
 
        // Send the notification out
-       SEND_ADMIN_NOTIFICATION($subject, $templateName, $content, $content['uid']);
+       return sendAdminNotification($subject, $templateName, $content, $content['url_userid']);
 }
+
 // Notify the user about the performed action
-function SURFBAR_NOTIFY_USER ($messageType, $content) {
+function doSurfbarNotifyMember ($messageType, $content) {
+       // Skip notification if userid is zero
+       if ($content['url_userid'] == '0') {
+               return FALSE;
+       } // END - if
+
        // Prepare template name
        $templateName = sprintf("member_surfbar_%s", $messageType);
 
        // Prepare subject
-       $eval = sprintf("\$subject = MEMBER_SURFBAR_NOTIFY_%s_SUBJECT;",
+       $subject = sprintf("{--MEMBER_SURFBAR_NOTIFY_%s_SUBJECT--}",
                strtoupper($messageType)
        );
-       eval($eval);
+
+       // Is the subject line there?
+       if ((substr($subject, 0, 1) == '!') && (substr($subject, -1, 1) == '!')) {
+               // Set default subject if following eval() wents wrong
+               $subject = '{--MEMBER_SURFBAR_NOTIFY_DEFAULT_SUBJECT--}';
+       } // END - if
+
+       // Translate some data if present
+       $content = prepareSurfbarContentForTemplate($content);
 
        // Load template
-       $mailText = LOAD_EMAIL_TEMPLATE($templateName, $content);
+       $mailText = loadEmailTemplate($templateName, $content, $content['url_userid']);
 
        // Send the email
-       SEND_EMAIL($content['uid'], $subject, $mailText);
+       return sendEmail($content['url_userid'], $subject, $mailText);
+}
+
+// Translates some data for template usage
+// @TODO Can't we use our new expression language instead of this ugly code?
+function prepareSurfbarContentForTemplate ($content) {
+       // Prepare some code
+       if (isset($content['url_registered']))  $content['url_registered']  = generateDateTime($content['url_registered'], 2);
+       if (isset($content['url_last_locked'])) $content['url_last_locked'] = generateDateTime($content['url_last_locked'], 2);
+
+       // Return translated content
+       return $content;
 }
+
+// Translates the limit
+function translateSurfbarLimit ($limit) {
+       // Is this zero?
+       if ($limit == '0') {
+               // Unlimited!
+               $return = '{--MEMBER_SURFBAR_UNLIMITED_VIEWS--}';
+       } else {
+               // Translate comma
+               $return = '{%pipe,translateComma=' . $limit . '%}';
+       }
+
+       // Return value
+       return $return;
+}
+
 // Translate the URL status
-function SURFBAR_TRANSLATE_STATUS ($status) {
-       // Create constant name
-       $constantName = sprintf("SURFBAR_URL_STATUS_%s", strtoupper($status));
+function translateSurfbarUrlStatus ($status) {
+       // NULL must be handled carfefully
+       if ((is_null($status)) || (trim($status) == '')) {
+               // Is NULL, so return other language string
+               return '{--SURFBAR_URL_STATUS_NONE--}';
+       } else {
+               // Return regular result
+               return sprintf("{--SURFBAR_URL_STATUS_%s--}", strtoupper($status));
+       }
+}
+
+// Translates the given action into a link title for members
+function translateMemberSurfbarActionToTitle ($action) {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__][$action])) {
+               // Construct default return string (unknown
+               $GLOBALS[__FUNCTION__][$action] = '{%message,MEMBER_SURFBAR_ACTION_UNKNOWN_TITLE=' . $action . '%}';
 
-       // Set default translated status
-       $statusTranslated = "!".$constantName."!";
+               // ... and the id's name
+               $messageId = 'MEMBER_SURFBAR_ACTION_' . strtoupper($action) . '_TITLE';
 
-       // Generate eval() command
-       if (defined($constantName)) {
-               $eval = "\$statusTranslated = ".$constantName.";";
-               eval($eval);
+               // Is the id there?
+               if (isMessageIdValid($messageId)) {
+                       // Then use it
+                       $GLOBALS[__FUNCTION__][$action] = '{--' . $messageId . '--}';
+               } // END - if
        } // END - if
 
-       // Return result
-       return $statusTranslated;
+       // Return cache
+       return $GLOBALS[__FUNCTION__][$action];
+}
+
+// Translates the given action into a submit button for members
+function translateMemberSurfbarActionToSubmit ($action) {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__][$action])) {
+               // Construct default return string (unknown
+               $GLOBALS[__FUNCTION__][$action] = '{%message,MEMBER_SURFBAR_ACTION_UNKNOWN_SUBMIT=' . $action . '%}';
+
+               // ... and the id's name
+               $messageId = 'MEMBER_SURFBAR_ACTION_' . strtoupper($action) . '_SUBMIT';
+
+               // Is the id there?
+               if (isMessageIdValid($messageId)) {
+                       // Then use it
+                       $GLOBALS[__FUNCTION__][$action] = '{--' . $messageId . '--}';
+               } // END - if
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__][$action];
+}
+
+// Determine reward
+function determineSurfbarReward ($onlyMin = FALSE) {
+       // Static values are default
+       $reward = getSurfbarStaticReward();
+
+       // Is there static or dynamic?
+       if (getSurfbarPaymentModel() == 'DYNAMIC') {
+               // "Calculate" dynamic reward
+               if ($onlyMin === TRUE) {
+                       $reward += calculateSurfbarDynamicMininumValue();
+               } else {
+                       $reward += calculateSurfbarDynamicAddValue();
+               }
+       } // END - if
+
+       // Return reward
+       return $reward;
+}
+
+// Determine costs
+function determineSurfbarCosts ($onlyMin=false) {
+       // Static costs is default
+       $costs  = getConfig('surfbar_static_costs');
+
+       // Is there static or dynamic?
+       if (getSurfbarPaymentModel() == 'DYNAMIC') {
+               // "Calculate" dynamic costs
+               if ($onlyMin) {
+                       $costs += calculateSurfbarDynamicMininumValue();
+               } else {
+                       $costs += calculateSurfbarDynamicAddValue();
+               }
+       } // END - if
+
+       // Return costs
+       return $costs;
+}
+
+// "Calculate" dynamic add
+function calculateSurfbarDynamicAddValue () {
+       // Get min/max values
+       $min = calculateSurfbarDynamicMininumValue();
+       $max = calculateSurfbarDynamicMaximumValue();
+
+       // "Calculate" dynamic part and return it
+       return mt_rand($min, $max);
 }
+
 // Determine right template name
-function SURFBAR_DETERMINE_TEMPLATE_NAME() {
+function determineSurfbarTemplateName() {
        // Default is the frameset
-       $templateName = "surfbar_frameset";
+       $templateName = 'surfbar_frameset';
 
        // Any frame set? ;-)
-       if (isset($_GET['frame'])) {
+       if (!isFullPage()) {
                // Use the frame as a template name part... ;-)
                $templateName = sprintf("surfbar_frame_%s",
-                       SQL_ESCAPE($_GET['frame'])
+                       getRequestElement('frame')
                );
        } // END - if
 
        // Return result
        return $templateName;
 }
-// Check if the "reload lock" of the current user is full, call this function
-// before you call SURFBAR_CHECK_RELOAD_LOCK().
-function SURFBAR_CHECK_RELOAD_FULL() {
-       global $SURFBAR_CACHE, $_CONFIG;
 
+/**
+ * Check if the "reload lock" of the current user is full, call this function
+ * before you call ifSurfbarReloadLock().
+ */
+function isSurfbarReloadFull () {
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Fixed surf lock is ' . getConfig('surfbar_static_lock') . ' - ENTERED!');
        // Default is full!
-       $isFull = true;
+       $isFull = TRUE;
+
+       // Cache static reload lock
+       $GLOBALS['surfbar_cache']['surf_lock'] = getConfig('surfbar_static_lock');
 
-       // Do we have static or dynamic mode?
-       if ($_CONFIG['surfbar_pay_model'] == "STATIC") {
-               // Cache static reload lock
-               $SURFBAR_CACHE['surf_lock'] = $_CONFIG['surfbar_static_lock'];
-               //DEBUG_LOG(__FUNCTION__.":Fixed surf lock is ".$_CONFIG['surfbar_static_lock']."");
+       // Is there dynamic model?
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'surf_lock=' . $GLOBALS['surfbar_cache']['surf_lock'] . ' - BEFORE');
+       if (getSurfbarPaymentModel() == 'DYNAMIC') {
+               // "Calculate" dynamic lock
+               $GLOBALS['surfbar_cache']['surf_lock'] += calculateSurfbarDynamicAddValue();
+       } // END - if
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'surf_lock=' . $GLOBALS['surfbar_cache']['surf_lock'] . ' - AFTER');
 
-               // Ask the database
-               $result = SQL_QUERY_ESC("SELECT COUNT(id) AS cnt FROM "._MYSQL_PREFIX."_surfbar_locks
-WHERE userid=%s AND (UNIX_TIMESTAMP() - ".SURFBAR_GET_DATA('surf_lock').") < UNIX_TIMESTAMP(last_surfed)
+       // Ask the database
+       $result = SQL_QUERY_ESC("SELECT
+       COUNT(l.`locks_id`) AS `cnt`
+FROM
+       `{?_MYSQL_PREFIX?}_surfbar_locks` AS `l`
+INNER JOIN
+       `{?_MYSQL_PREFIX?}_surfbar_urls` AS `u`
+ON
+       u.`url_id`=l.`locks_url_id`
+WHERE
+       l.`locks_userid`=%s AND
+       (UNIX_TIMESTAMP() - {%%pipe,getSurfbarSurfLock%%}) < UNIX_TIMESTAMP(l.`locks_last_surfed`) AND
+       (
+               ((UNIX_TIMESTAMP(l.`locks_last_surfed`) - u.`url_fixed_reload`) < 0 AND u.`url_fixed_reload` > 0) OR
+               u.`url_fixed_reload` = 0
+       )
 LIMIT 1",
-                       array($GLOBALS['userid']), __FILE__, __LINE__
-               );
+               array(getMemberId()), __FUNCTION__, __LINE__
+       );
 
-               // Fetch row
-               list($SURFBAR_CACHE['user_locks']) = SQL_FETCHROW($result);
+       // Fetch row
+       list($GLOBALS['surfbar_cache']['user_locks']) = SQL_FETCHROW($result);
 
-               // Is it null?
-               if (is_null($SURFBAR_CACHE['user_locks'])) {
-                       // Then fix it to zero!
-                       $SURFBAR_CACHE['user_locks'] = 0;
-               } // END - if
+       // Is it null?
+       if (is_null($GLOBALS['surfbar_cache']['user_locks'])) {
+               // Then fix it to zero!
+               $GLOBALS['surfbar_cache']['user_locks'] = '0';
+       } // END - if
 
-               // Free result
-               SQL_FREERESULT($result);
+       // Free result
+       SQL_FREERESULT($result);
 
-               // Get total URLs
-               $total = SURFBAR_GET_TOTAL_URLS();
+       // Get total URLs
+       $total = getSurfbarTotalUrls();
 
-               // Do we have some URLs in lock? Admins can always surf on own URLs!
-               //DEBUG_LOG(__FUNCTION__.":userLocks=".SURFBAR_GET_DATA('user_locks').",total={$total}");
-               $isFull = ((SURFBAR_GET_DATA('user_locks') == $total) && ($total > 0));
-       } else {
-               // Dynamic model...
-               die("DYNAMIC not yet implemented!");
-       }
+       // Are there some URLs in lock? Admins can always surf on own URLs!
+       $isFull = ((getSurfbarUserLocks() == $total) && ($total > 0));
 
        // Return result
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userLocks=' . getSurfbarUserLocks() . ',total=' . $total . ',isFull=' . intval($isFull) . ' - EXIT!');
        return $isFull;
 }
-// Get total amount of URLs of given status for current user or of CONFIRMED URLs by default
-function SURFBAR_GET_TOTAL_URLS ($status="CONFIRMED") {
+
+// Get total amount of URLs of given status for current user or of ACTIVE URLs by default
+function getSurfbarTotalUrls ($status = 'ACTIVE', $excludeUserId = NULL) {
        // Determine depleted user account
-       $UIDs = SURFBAR_DETERMINE_DEPLETED_USERIDS();
+       $userids = determineSurfbarDepletedUserids();
+
+       // If we dont get any user ids back, there are no URLs
+       if (count($userids['url_userid']) == 0) {
+               // No user ids found, no URLs!
+               return 0;
+       } // END - if
+
+       // Is the exlude userid set?
+       if (isValidUserId($excludeUserId)) {
+               // Then add it
+               $userids['url_userid'][$excludeUserId] = $excludeUserId;
+       } // END - if
 
        // Get amount from database
-       $result = SQL_QUERY_ESC("SELECT COUNT(id) AS cnt
-FROM "._MYSQL_PREFIX."_surfbar_urls
-WHERE userid NOT IN (".implode(",", $UIDs).") AND status='%s'",
-               array($status), __FILE__, __LINE__
+       $result = SQL_QUERY_ESC("SELECT
+       COUNT(`url_id`) AS `cnt`
+FROM
+       `{?_MYSQL_PREFIX?}_surfbar_urls`
+WHERE
+       (`url_userid` NOT IN (" . implode(', ', $userids['url_userid']) . ") OR `url_userid` IS NULL) AND
+       `url_status`='%s'
+LIMIT 1",
+               array($status), __FUNCTION__, __LINE__
        );
 
        // Fetch row
-       list($cnt) = SQL_FETCHROW($result);
+       list($count) = SQL_FETCHROW($result);
 
        // Free result
        SQL_FREERESULT($result);
 
+       // Debug message
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'cnt=' . $count . ' - EXIT!');
+
        // Return result
-       return $cnt;
+       return $count;
 }
-// Generate a validation code for the given id number
-function SURFBAR_GENERATE_VALIDATION_CODE ($id, $salt="") {
-       global $_CONFIG, $SURFBAR_CACHE;
-
-       // Generate a code until the length matches
-       $valCode = "";
-       while (strlen($valCode) != $_CONFIG['code_length']) {
-               // Is the salt set?
-               if (empty($salt)) {
-                       // Generate random hashed string
-                       $SURFBAR_CACHE['salt'] = sha1(GEN_PASS(255));
-                       //DEBUG_LOG(__FUNCTION__.":newSalt=".SURFBAR_GET_SALT()."");
-               } else {
-                       // Use this as salt!
-                       $SURFBAR_CACHE['salt'] = $salt;
-                       //DEBUG_LOG(__FUNCTION__.":oldSalt=".SURFBAR_GET_SALT()."");
-               }
 
-               // ... and now the validation code
-               $valCode = GEN_RANDOM_CODE($_CONFIG['code_length'], sha1(SURFBAR_GET_SALT().":".$id), $GLOBALS['userid']);
-               //DEBUG_LOG(__FUNCTION__.":valCode={$valCode}");
-       } // END - while
+// Check whether the user is allowed to book more URLs
+function ifSurfbarMemberAllowedMoreUrls ($userid = NULL) {
+       // Is this admin and userid is zero or does the user has some URLs left to book?
+       return (((is_null($userid)) && (isAdmin())) || (getSurfbarTotalUserUrls($userid, '', array('REJECTED')) < getSurfbarMaxOrder()));
+}
+
+// Get total amount of URLs of given status for current user
+function getSurfbarTotalUserUrls ($userid = NULL, $status = '', $exclude = '') {
+       // Is the user 0 and user is logged in?
+       if ((is_null($userid)) && (isMember())) {
+               // Then use this userid
+               $userid = getMemberId();
+       } elseif (is_null($userid)) {
+               // Error!
+               return (getSurfbarMaxOrder() + 1);
+       }
+
+       // Default is all URLs
+       $add = '';
+
+       // Is the status set?
+       if (is_array($status)) {
+               // Only URLs with these status
+               $add = sprintf(" AND `url_status` IN('%s')", implode("','", $status));
+       } elseif (!empty($status)) {
+               // Only URLs with this status
+               $add = sprintf(" AND `url_status`='%s'", $status);
+       } elseif (is_array($exclude)) {
+               // Exclude URLs with these status
+               $add = sprintf(" AND `url_status` NOT IN('%s')", implode("','", $exclude));
+       } elseif (!empty($exclude)) {
+               // Exclude URLs with this status
+               $add = sprintf(" AND `url_status` != '%s'", $exclude);
+       }
+
+       // Get amount from database
+       $count = countSumTotalData($userid, 'surfbar_urls', 'url_id', 'url_userid', TRUE, $add);
+
+       // Return result
+       return $count;
+}
+
+// Generate a validation code for the given id number
+function generateSurfbarValidationCode ($urlId, $salt = '') {
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'urlId=' . $urlId . ',salt=' . $salt . ' - ENTERED!');
+       // Init hash with invalid value
+       if (empty($salt)) {
+                // Generate random hashed string
+               $GLOBALS['surfbar_cache']['salt'] = sha1(generatePassword(mt_rand(200, 255)));
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'newSalt='.getSurfbarSalt().'', FALSE);
+       } else {
+               // Use this as salt!
+               $GLOBALS['surfbar_cache']['salt'] = $salt;
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'oldSalt='.getSurfbarSalt().'', FALSE);
+       }
 
        // Hash it with md5() and salt it with the random string
-       $hashedCode = generateHash(md5($valCode), SURFBAR_GET_SALT());
+       $hashedCode = generateHash(md5($urlId . getEncryptSeparator() . getMemberId()), getSurfbarSalt());
 
        // Finally encrypt it PGP-like and return it
-       $valHashedCode = generatePassString($hashedCode);
-       //DEBUG_LOG(__FUNCTION__.":finalValCode={$valHashedCode}");
+       $valHashedCode = encodeHashForCookie($hashedCode);
+
+       // Return hashed value
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'urlId=' . $urlId . ',salt=' . $salt . ',urlId=' . $urlId . ',salt=' . $salt . ',valHashedCode=' . $valHashedCode . ' - EXIT!');
        return $valHashedCode;
 }
-// Check validation code
-function SURFBAR_CHECK_VALIDATION_CODE ($id, $check, $salt) {
-       global $SURFBAR_CACHE;
 
+// Check validation code
+function isSurfbarValidationCodeValid ($urlId, $check, $salt) {
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'urlId=' . $urlId . ',check=' . $check . ',salt=' . $salt . ' - ENTERED!');
        // Secure id number
-       $id = bigintval($id);
+       $urlId = bigintval($urlId);
 
        // Now generate the code again
-       $code = SURFBAR_GENERATE_VALIDATION_CODE($id, $salt);
+       $code = generateSurfbarValidationCode($urlId, $salt);
 
        // Return result of checking hashes and salts
-       //DEBUG_LOG(__FUNCTION__.":---".$code."|".$check."---");
-       //DEBUG_LOG(__FUNCTION__.":+++".$salt."|".SURFBAR_GET_DATA('last_salt')."+++");
-       return (($code == $check) && ($salt == SURFBAR_GET_DATA('last_salt')));
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'urlId=' . $urlId . ',(code==check)=' . intval($code == $check) . ',(salt==salts_last_salt)=' . intval($salt == getSurfbarData('salts_last_salt')) . ' - EXIT!');
+       return (($code == $check) && ($salt == getSurfbarData('salts_last_salt')));
 }
+
 // Lockdown the userid/id combination (reload lock)
-function SURFBAR_LOCKDOWN_ID ($id) {
-       //* DEBUG: */ print "LOCK!");
-       ///* DEBUG: */ return;
-       // Just add it to the database
-       SQL_QUERY_ESC("INSERT INTO "._MYSQL_PREFIX."_surfbar_locks (userid, url_id) VALUES(%s, %s)",
-               array($GLOBALS['userid'], bigintval($id)), __FILE__, __LINE__);
+function addSurfbarReloadLockById ($urlId) {
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'urlId=' . $urlId . ',getMemberId()=' . getMemberId() . ' - ENTERED!');
+       // Search for an entry
+       $countLock = countSumTotalData(getMemberId(), 'surfbar_locks', 'locks_id', 'locks_userid', TRUE, ' AND `locks_url_id`=' . bigintval($urlId));
+
+       // Is there no record?
+       if ($countLock == 0) {
+               // Just add it to the database
+               SQL_QUERY_ESC('INSERT INTO `{?_MYSQL_PREFIX?}_surfbar_locks` (`locks_userid`, `locks_url_id`) VALUES (%s, %s)',
+                       array(
+                               getMemberId(),
+                               bigintval($urlId)
+                       ), __FUNCTION__, __LINE__);
+       } // END - if
 
        // Remove the salt from database
-       SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM "._MYSQL_PREFIX."_surfbar_salts WHERE url_id=%s AND userid=%s LIMIT 1",
-               array(bigintval($id), $GLOBALS['userid']), __FILE__, __LINE__);
-}
-// Pay points to the user and remove it from the sender
-function SURFBAR_PAY_POINTS ($id) {
-       global $SURFBAR_CACHE, $_CONFIG;
+       SQL_QUERY_ESC('DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_surfbar_salts` WHERE `salts_url_id`=%s AND `salts_userid`=%s LIMIT 1',
+               array(
+                       bigintval($urlId),
+                       getMemberId()
+               ), __FUNCTION__, __LINE__);
 
-       // Re-configure ref-system to surfbar levels
-       $_CONFIG['db_percents'] = "percent";
-       $_CONFIG['db_table']    = "surfbar_reflevels";
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'urlId=' . $urlId . ',getMemberId()=' . getMemberId() . ',SQL_AFFECTEDROWS()=' . SQL_AFFECTEDROWS() . ' - EXIT!');
+}
 
+// Pay points to the user and remove it from the sender if userid is given else it is a "sponsored surf"
+function doSurfbarPayPoints () {
        // Remove it from the URL owner
-       //DEBUG_LOG(__FUNCTION__.":uid=".SURFBAR_GET_USERID().",costs=".SURFBAR_GET_COSTS()."");
-       SUB_POINTS(SURFBAR_GET_USERID(), SURFBAR_GET_COSTS());
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid='.getSurfbarUserid().',costs='.getSurfbarCosts() . ' - ENTERED!');
+       if (isValidUserId(getSurfbarUserid())) {
+               // Subtract points and ignore return status
+               subtractPoints(sprintf("surfbar_%s", getSurfbarPaymentModel()), getSurfbarUserid(), getSurfbarCosts());
+       } // END - if
+
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid='.getMemberId().',reward='.getSurfbarReward());
+       // Init referral system here
+       initReferralSystem();
+
+       // Book it to the user and ignore return status
+       addPointsThroughReferralSystem(sprintf("surfbar:%s", getSurfbarPaymentModel()), getMemberId(), getSurfbarReward());
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid='.getSurfbarUserid().',costs='.getSurfbarCosts() . ' - EXIT!');
+}
+
+// Updates the statistics of current URL/userid
+function updateInsertSurfbarStatisticsRecord () {
+       // Init add
+       $add = '';
+
+       // Get allowed views
+       $allowed = getSurfbarViewsAllowed();
+
+       // Is there a limit?
+       if ($allowed > 0) {
+               // Then count views_max down!
+               $add .= ',`url_views_max`=`url_views_max`-1';
+       } // END - if
+
+       // Update URL stats
+       SQL_QUERY_ESC('UPDATE `{?_MYSQL_PREFIX?}_surfbar_urls` SET `url_views_total`=`url_views_total`+1' . $add . ' WHERE `url_id`=%s LIMIT 1',
+               array(getSurfbarId()), __FUNCTION__, __LINE__);
+
+       // Update the stats entry
+       SQL_QUERY_ESC('UPDATE `{?_MYSQL_PREFIX?}_surfbar_stats` SET `stats_count`=`stats_count`+1 WHERE `stats_userid`=%s AND `stats_url_id`=%s LIMIT 1',
+               array(
+                       getMemberId(),
+                       getSurfbarId()
+               ), __FUNCTION__, __LINE__);
+
+       // Was that update okay?
+       if (SQL_HASZEROAFFECTED()) {
+               // No, then insert entry
+               SQL_QUERY_ESC('INSERT INTO `{?_MYSQL_PREFIX?}_surfbar_stats` (`stats_userid`, `stats_url_id`, `stats_count`) VALUES (%s,%s,1)',
+                       array(
+                               getMemberId(),
+                               getSurfbarId()
+                       ), __FUNCTION__, __LINE__);
+       } // END - if
+
+       // Update total/daily/weekly/monthly counter
+       incrementConfigEntry('surfbar_total_counter');
+       incrementConfigEntry('surfbar_daily_counter');
+       incrementConfigEntry('surfbar_weekly_counter');
+       incrementConfigEntry('surfbar_monthly_counter');
 
-       // Book it to the user
-       //DEBUG_LOG(__FUNCTION__.":uid=".$GLOBALS['userid'].",reward=".SURFBAR_GET_REWARD()."");
-       ADD_POINTS_REFSYSTEM($GLOBALS['userid'], SURFBAR_GET_DATA('reward'));
+       // Update config as well
+       updateConfiguration(array('surfbar_total_counter', 'surfbar_daily_counter', 'surfbar_weekly_counter', 'surfbar_monthly_counter'), array(1,1,1,1), '+');
 }
-// Update the salt for validation
-function SURFBAR_UPDATE_SALT() {
-       // Update views_total
-       SQL_QUERY_ESC("UPDATE "._MYSQL_PREFIX."_surfbar_urls SET views_total=views_total+1 WHERE id=%s LIMIT 1",
-               array(SURFBAR_GET_ID()), __FILE__, __LINE__);
+
+// Update the salt for validation and statistics
+function updateSurfbarSaltStatistics () {
+       // Update salt
+       generateSurfbarValidationCode(getSurfbarId());
+
+       // Make sure only valid salts can pass
+       if (getSurfbarSalt() == 'INVALID') {
+               // Invalid provided
+               reportBug(__FUNCTION__, __LINE__, 'Invalid salt provided, id=' . getSurfbarId() . ',getMemberId()=' . getMemberId());
+       } // END - if
+
+       // Update statistics record
+       updateInsertSurfbarStatisticsRecord();
 
        // Simply store the salt from cache away in database...
-       SQL_QUERY_ESC("UPDATE "._MYSQL_PREFIX."_surfbar_salts SET last_salt='%s' WHERE url_id=%s AND userid=%s LIMIT 1",
-               array(SURFBAR_GET_SALT(), SURFBAR_GET_ID(), $GLOBALS['userid']), __FILE__, __LINE__);
+       SQL_QUERY("UPDATE
+       `{?_MYSQL_PREFIX?}_surfbar_salts`
+SET
+       `salts_last_salt`='{%pipe,getSurfbarSalt%}'
+WHERE
+       `salts_url_id`={%pipe,getSurfbarId%} AND
+       `salts_userid`={%pipe,getMemberId%}
+LIMIT 1", __FUNCTION__, __LINE__);
 
        // Debug message
-       //DEBUG_LOG(__FUNCTION__.":salt=".SURFBAR_GET_SALT().",id=".SURFBAR_GET_ID().",uid=".$GLOBALS['userid']."");
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'salt=' . getSurfbarSalt() . ',id=' . getSurfbarId() . ',userid=' . getMemberId() . ',SQL_AFFECTEDROWS()=' . SQL_AFFECTEDROWS() . ' - UPDATE!');
 
        // Was that okay?
-       if (SQL_AFFECTEDROWS() == 0) {
+       if (SQL_HASZEROAFFECTED()) {
                // Insert missing entry!
-               SQL_QUERY_ESC("INSERT INTO "._MYSQL_PREFIX."_surfbar_salts (url_id,userid,last_salt) VALUES(%s, %s, '%s')",
-                       array(SURFBAR_GET_ID(), $GLOBALS['userid'], SURFBAR_GET_SALT()), __FILE__, __LINE__);
+               SQL_QUERY("INSERT INTO
+       `{?_MYSQL_PREFIX?}_surfbar_salts`
+(
+       `salts_url_id`,
+       `salts_userid`,
+       `salts_last_salt`
+) VALUES (
+       {%pipe,getSurfbarId%},
+       {%pipe,getMemberId%},
+       '{%pipe,getSurfbarSalt%}'
+)", __FUNCTION__, __LINE__);
        } // END - if
 
        // Debug message
-       //DEBUG_LOG(__FUNCTION__.":affectedRows=".SQL_AFFECTEDROWS()."");
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'affectedRows=' . SQL_AFFECTEDROWS() . ' - EXIT!');
 
        // Return if the update was okay
-       return (SQL_AFFECTEDROWS() == 1);
+       return (!SQL_HASZEROAFFECTED());
 }
+
 // Check if the reload lock is active for given id
-function SURFBAR_CHECK_RELOAD_LOCK ($id) {
-       //DEBUG_LOG(__FUNCTION__.":id={$id}");
+function ifSurfbarReloadLock ($urlId) {
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'id=' . $urlId . ' -  ENTERED!');
        // Ask the database
-       $result = SQL_QUERY_ESC("SELECT COUNT(id) AS cnt
-FROM "._MYSQL_PREFIX."_surfbar_locks
-WHERE userid=%s AND url_id=%s AND (UNIX_TIMESTAMP() - ".SURFBAR_GET_DATA('surf_lock').") < UNIX_TIMESTAMP(last_surfed)
-ORDER BY last_surfed ASC
-LIMIT 1",
-               array($GLOBALS['userid'], bigintval($id)), __FILE__, __LINE__
+       $result = SQL_QUERY_ESC('SELECT COUNT(`locks_id`) AS `cnt`
+FROM
+       `{?_MYSQL_PREFIX?}_surfbar_locks`
+WHERE
+       `locks_userid`=%s AND
+       `locks_url_id`=%s AND
+       (UNIX_TIMESTAMP() - {%%pipe,getSurfbarSurfLock%%}) < UNIX_TIMESTAMP(`locks_last_surfed`)
+ORDER BY
+       `locks_last_surfed` ASC
+LIMIT 1',
+               array(getMemberId(), bigintval($urlId)), __FUNCTION__, __LINE__
        );
 
        // Fetch counter
-       list($cnt) = SQL_FETCHROW($result);
+       list($count) = SQL_FETCHROW($result);
 
        // Free result
        SQL_FREERESULT($result);
 
        // Return check
-       //DEBUG_LOG(__FUNCTION__.":cnt={$cnt},".SURFBAR_GET_DATA('surf_lock')."");
-       return ($cnt == 1);
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'urlId=' . $urlId . ',count=' . $count . ',getSurfbarSurfLock()=' . getSurfbarSurfLock() . ' - EXIT!');
+       return ($count == 1);
 }
+
 // Determine which user hash no more points left
-function SURFBAR_DETERMINE_DEPLETED_USERIDS() {
+function determineSurfbarDepletedUserids ($limit=0) {
        // Init array
-       $UIDs = array();
+       $userids = array(
+               'url_userid'   => array(),
+               'points'       => array(),
+               'notified'     => array(),
+       );
 
-       // Do we have a current user id?
-       if (IS_LOGGED_IN()) {
+       // Is there a current user id?
+       if ((isMember()) && ($limit == '0')) {
                // Then add this as well
-               $UIDs[] = $GLOBALS['userid'];
+               $userids['url_userid'][getMemberId()] = getMemberId();
+               $userids['points'][getMemberId()]     = getTotalPoints(getMemberId());
+               $userids['notified'][getMemberId()]   = '0';
 
                // Get all userid except logged in one
-               $result = SQL_QUERY_ESC("SELECT userid FROM "._MYSQL_PREFIX."_surfbar_urls
-WHERE userid != %s AND status='CONFIRMED'
-GROUP BY userid
-ORDER BY userid ASC",
-                       array($GLOBALS['userid']), __FILE__, __LINE__);
+               $result = SQL_QUERY_ESC("SELECT
+       u.`url_userid`,
+       UNIX_TIMESTAMP(d.`surfbar_low_notified`) AS `notified`
+FROM
+       `{?_MYSQL_PREFIX?}_surfbar_urls` AS `u`
+INNER JOIN
+       `{?_MYSQL_PREFIX?}_user_data` AS `d`
+ON
+       u.`url_userid`=d.`userid`
+WHERE
+       u.`url_userid` NOT IN (%s) AND
+       u.`url_userid` IS NOT NULL AND
+       u.`url_status`='ACTIVE'
+GROUP BY
+       u.`url_userid`
+ORDER BY
+       u.`url_userid` ASC",
+                       array(getMemberId()), __FUNCTION__, __LINE__);
        } else {
                // Get all userid
-               $result = SQL_QUERY_ESC("SELECT userid FROM "._MYSQL_PREFIX."_surfbar_urls
-WHERE status='CONFIRMED'
-GROUP BY userid
-ORDER BY userid ASC", __FILE__, __LINE__);
+               $result = SQL_QUERY("SELECT
+       u.`url_userid`,
+       UNIX_TIMESTAMP(d.`surfbar_low_notified`) AS `notified`
+FROM
+       `{?_MYSQL_PREFIX?}_surfbar_urls` AS u
+INNER JOIN
+       `{?_MYSQL_PREFIX?}_user_data` AS d
+ON
+       u.`url_userid`=d.`userid`
+WHERE
+       u.`url_userid` > 0 AND
+       u.`url_status`='ACTIVE'
+GROUP BY
+       u.`url_userid`
+ORDER BY
+       u.`url_userid` ASC", __FUNCTION__, __LINE__);
        }
 
        // Load all userid
-       while (list($uid) = SQL_FETCHROW($result)) {
+       while ($content = SQL_FETCHARRAY($result)) {
                // Get total points
-               $points = GET_TOTAL_DATA($uid, "user_points", "points") - GET_TOTAL_DATA($uid, "user_data", "used_points");
-               //DEBUG_LOG(__FUNCTION__.":uid={$uid},points={$points}");
+               $points = getTotalPoints($content['url_userid']);
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $content['url_userid'] . ',points=' . $points);
 
                // Shall we add this to ignore?
-               if ($points <= 0) {
+               if ($points <= $limit) {
                        // Ignore this one!
-                       $UIDs[] = $uid;
-                       //DEBUG_LOG(__FUNCTION__.":uid={$uid} has depleted points amount!");
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'userid=' . $content['url_userid'] . ' has depleted points amount!');
+                       $userids['url_userid'][$content['url_userid']] = $content['url_userid'];
+                       $userids['points'][$content['url_userid']]     = $points;
+                       $userids['notified'][$content['url_userid']]   = $content['notified'];
                } // END - if
        } // END - while
 
@@ -454,248 +1359,908 @@ ORDER BY userid ASC", __FILE__, __LINE__);
        SQL_FREERESULT($result);
 
        // Debug message
-       //DEBUG_LOG(__FUNCTION__.":UIDs::count=".count($UIDs)." (with own userid=".$GLOBALS['userid'].")");
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'UIDs::count=' . count($userids) . ' (with own userid=' . getMemberId() . ')');
 
        // Return result
-       return $UIDs;
+       return $userids;
+}
+
+// Determine how many users are Online in surfbar
+function determineSurfbarTotalOnline () {
+       // Count all users in surfbar modue and return the value
+       $result = SQL_QUERY('SELECT
+       `stats_id`
+FROM
+       `{?_MYSQL_PREFIX?}_surfbar_stats`
+WHERE
+       (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(`stats_last_surfed`)) <= {?online_timeout?}
+GROUP BY
+       `stats_userid` ASC', __FUNCTION__, __LINE__);
+
+       // Fetch count
+       $count = SQL_NUMROWS($result);
+
+       // Free result
+       SQL_FREERESULT($result);
+
+       // Return result
+       return $count;
+}
+
+// Determine waiting time for one URL
+function determineSurfbarWaitingTime () {
+       // Get fixed reload lock
+       $fixed = getSurfbarFixedWaitingTime();
+
+       // Is the URL's fixed waiting time set?
+       if ($fixed > 0) {
+               // Return it
+               return $fixed;
+       } // END - if
+
+       // Static time is default
+       $time = getSurfbarStaticTime();
+
+       // Which payment model do we have?
+       if (getSurfbarPaymentModel() == 'DYNAMIC') {
+               // "Calculate" dynamic time
+               $time += calculateSurfbarDynamicAddValue();
+       } // END - if
+
+       // Return value
+       return $time;
+}
+
+// Changes the status of an URL from given to other
+function changeSurfbarUrlStatus ($urlId, $prevStatus, $newStatus, $data = array()) {
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'urlId=' . $urlId . ',prevStatus=' . $prevStatus . ',data[]=' . gettype($data) . ',newStatus=' . $newStatus . ' - ENTERED!');
+       // Make new status always lower-case
+       $newStatus = strtolower($newStatus);
+
+       // Get URL data for status comparison if missing
+       if ((!is_array($data)) || (count($data) == 0)) {
+               // Fetch missing URL data
+               $data = getSurfbarUrlData($urlId);
+       } // END - if
+
+       // Prepare array
+       $filterData =  array(
+               'url_id'      => $urlId,
+               'prev_status' => $prevStatus,
+               'new_status'  => $newStatus,
+               'data'        => $data,
+               'abort'       => NULL
+       );
+
+       // Run pre filter chain
+       $filterData = runFilterChain('pre_change_surfbar_url_status', $filterData);
+
+       // Abort here?
+       if (!is_null($filterData['abort'])) {
+               // Abort here
+               return $filterData['abort'];
+       } // END - if
+
+       // Update the status now
+       // ---------- Comment out for debugging/developing member actions! ---------
+       SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_surfbar_urls` SET `url_status`='%s' WHERE `url_id`=%s LIMIT 1",
+               array(
+                       $newStatus,
+                       bigintval($urlId)
+               ), __FUNCTION__, __LINE__);
+       // ---------- Comment out for debugging/developing member actions! ---------
+
+       // Was that fine?
+       // ---------- Comment out for debugging/developing member actions! ---------
+       if (SQL_AFFECTEDROWS() != 1) {
+               // No, something went wrong
+               return FALSE;
+       } // END - if
+       // ---------- Comment out for debugging/developing member actions! ---------
+
+       // Run post filter chain
+       $filterData = runFilterChain('post_change_surfbar_url_status', $filterData);
+
+       // Check if generic 'data' is there
+       assert(isset($filterData['data']));
+
+       // All done!
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'urlId=' . $urlId . ',prevStatus=' . $prevStatus . ',newStatus=' . $newStatus . ' - EXIT!');
+       return TRUE;
+}
+
+// Calculate minimum value for dynamic payment model
+function calculateSurfbarDynamicMininumValue () {
+       // Addon is zero by default
+       $addon = '0';
+
+       // Percentage part
+       $percent = abs(log(getConfig('surfbar_dynamic_percent') / 100 + 1));
+
+       // Get total users
+       $totalUsers = getTotalConfirmedUser();
+
+       // Get online users
+       $onlineUsers = determineSurfbarTotalOnline();
+
+       // Calculate addon
+       $addon += abs(log($onlineUsers / $totalUsers + 1) * $percent * $totalUsers);
+
+       // Get total URLs
+       $totalUrls = getSurfbarTotalUrls('ACTIVE', 0);
+
+       // Get user's total URLs
+       $userUrls = getSurfbarTotalUserUrls(0, 'ACTIVE');
+
+       // Calculate addon
+       if ($totalUrls > 0) {
+               $addon += abs(log($userUrls / $totalUrls + 1) * $percent * $totalUrls);
+       } else {
+               $addon += abs(log($userUrls / 1 + 1) * $percent * $totalUrls);
+       }
+
+       // Return addon
+       return $addon;
+}
+
+// Calculate maximum value for dynamic payment model
+function calculateSurfbarDynamicMaximumValue () {
+       // Addon is zero by default
+       $addon = '0';
+
+       // Maximum value
+       $max = log(2);
+
+       // Percentage part
+       $percent = abs(log(getConfig('surfbar_dynamic_percent') / 100 + 1));
+
+       // Get total users
+       $totalUsers = getTotalConfirmedUser();
+
+       // Calculate addon
+       $addon += abs($max * $percent * $totalUsers);
+
+       // Get total URLs
+       $totalUrls = getSurfbarTotalUrls('ACTIVE', 0);
+
+       // Calculate addon
+       $addon += abs($max * $percent * $totalUrls);
+
+       // Return addon
+       return $addon;
 }
-// Determine next id for surfbar view, always call this before you call other
-// getters below this function!!!
-function SURFBAR_GET_NEXT_ID ($id = 0) {
-       global $SURFBAR_CACHE, $_CONFIG;
 
-       // Default is no id!
-       $nextId = 0; $randNum = 0;
+// Calculate dynamic lock
+function calculateSurfbarDynamicLock () {
+       // Default lock is 30 seconds
+       $addon = 30;
+
+       // Get online users
+       $onlineUsers = determineSurfbarTotalOnline();
+
+       // Calculate lock
+       $addon = abs(log($onlineUsers / $addon + 1));
 
-       // Is the ID set?
-       if ($id == 0) {
-               // Prepare some arrays
-               $IDs = array();
-               $USE = array();
-               $ignored = array();
+       // Return value
+       return $addon;
+}
 
-               // Get all id from locks within the timestamp
-               $result = SQL_QUERY_ESC("SELECT id, url_id, UNIX_TIMESTAMP(last_surfed)
+// "Getter" for lock ids array
+function getSurfbarLockIdsArray () {
+       // Prepare some arrays
+       $IDs = array();
+       $USE = array();
+       $ignored = array();
+
+       // Get all id from locks within the timestamp
+       $result = SQL_QUERY_ESC("SELECT
+       `locks_id`,
+       `locks_url_id`,
+       UNIX_TIMESTAMP(`locks_last_surfed`) AS `last_surfed`
 FROM
-       "._MYSQL_PREFIX."_surfbar_locks
+       `{?_MYSQL_PREFIX?}_surfbar_locks`
 WHERE
-       userid=%s
+       `locks_userid`=%s
 ORDER BY
-       id ASC", array($GLOBALS['userid']),
-                       __FILE__, __LINE__);
-
-               // Load all entries
-               while (list($id, $url, $last) = SQL_FETCHROW($result)) {
-                       //DEBUG_LOG(__FUNCTION__.":next - id={$id},url={$url},last={$last}");
-                       // Skip entries that are too old
-                       if (($last < (time() - SURFBAR_GET_DATA('surf_lock'))) && (!in_array($url, $ignored))) {
-                               //DEBUG_LOG(__FUNCTION__.":okay - id={$id},url={$url},last={$last}");
-                               // Add only if missing or bigger
-                               if ((!isset($IDs[$url])) || ($IDs[$url] <= $last)) {
-                                       // Add this ID
-                                       //DEBUG_LOG(__FUNCTION__.":ADD - id={$id},url={$url},last={$last}");
-                                       $IDs[$url] = $last;
-                                       $USE[$url] = $id;
-                               } // END - if
-                       } else {
-                               // Ignore these old entries!
-                               //DEBUG_LOG(__FUNCTION__.":ignore - id={$id},url={$url},last={$last}");
-                               $ignored[] = $url;
-                               unset($IDs[$url]);
-                               unset($USE[$url]);
-                       }
+       `locks_id` ASC", array(getMemberId()),
+       __FUNCTION__, __LINE__);
+
+       // Load all entries
+       while ($content = SQL_FETCHARRAY($result)) {
+               // Debug message
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'next - lid='.$content['locks_id'].',url='.$content['locks_url_id'].',rest='.(time() - $content['last_surfed']).'/'.getSurfbarSurfLock());
+
+               // Skip entries that are too old
+               if (($content['last_surfed'] > (time() - getSurfbarSurfLock())) && (!in_array($content['locks_url_id'], $ignored))) {
+                       // Debug message
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'okay - lid='.$content['locks_id'].',url='.$content['locks_url_id'].',last='.$content['last_surfed']);
+
+                       // Add only if missing or bigger
+                       if ((!isset($IDs[$content['locks_url_id']])) || ($IDs[$content['locks_url_id']] > $content['last_surfed'])) {
+                               // Debug message
+                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ADD - lid='.$content['locks_id'].',url='.$content['locks_url_id'].',last='.$content['last_surfed']);
+
+                               // Add this id
+                               $IDs[$content['locks_url_id']] = $content['last_surfed'];
+                               $USE[$content['locks_url_id']] = $content['locks_id'];
+                       } // END - if
+               } else {
+                       // Debug message
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ignore - lid='.$content['locks_id'].',url='.$content['locks_url_id'].',last='.$content['last_surfed']);
+
+                       // Ignore these old entries!
+                       array_push($ignored, $content['locks_url_id']);
+                       unset($IDs[$content['locks_url_id']]);
+                       unset($USE[$content['locks_url_id']]);
+               }
+       } // END - while
+
+       // Free result
+       SQL_FREERESULT($result);
+
+       // Return array
+       return $USE;
+}
+
+// "Getter" for maximum random number
+function getSurfbarMaximumRandom ($userids, $add) {
+       // Count max availabe entries
+       $result = SQL_QUERY("SELECT
+       sbu.`url_id` AS `cnt`
+FROM
+       `{?_MYSQL_PREFIX?}_surfbar_urls` AS `sbu`
+LEFT JOIN
+       `{?_MYSQL_PREFIX?}_surfbar_salts` AS `sbs`
+ON
+       sbu.`url_id`=sbs.`salts_url_id`
+LEFT JOIN
+       `{?_MYSQL_PREFIX?}_surfbar_locks` AS `l`
+ON
+       sbu.`url_id`=l.`locks_url_id`
+WHERE
+       sbu.`url_userid` NOT IN (" . implode(',', $userids) . ") AND
+       (sbu.`url_views_allowed`=0 OR (sbu.`url_views_allowed` > 0 AND sbu.`url_views_max` > 0)) AND
+       sbu.`url_status`='ACTIVE'
+       " . $add . "
+GROUP BY
+       sbu.`url_id` ASC", __FUNCTION__, __LINE__);
+
+       // Log last query
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'lastQuery='.getConfig('db_last_query').'|numRows='.SQL_NUMROWS($result).'|Affected='.SQL_AFFECTEDROWS());
+
+       // Fetch max rand
+       $maxRand = SQL_NUMROWS($result);
+
+       // Free result
+       SQL_FREERESULT($result);
+
+       // Return value
+       return $maxRand;
+}
+
+// Load all URLs of the current user and return it as an array
+function getSurfbarUserUrls () {
+       // Init array
+       $urlArray = array();
+
+       // Begin the query
+       $result = SQL_QUERY_ESC("SELECT
+       u.`url_id`,
+       u.`url_userid`,
+       u.`url_package_id`,
+       u.`url`,
+       u.`url_status`,
+       u.`url_views_total`,
+       u.`url_views_max`,
+       u.`url_views_allowed`,
+       UNIX_TIMESTAMP(u.`url_registered`) AS `url_registered`,
+       UNIX_TIMESTAMP(u.`url_last_locked`) AS `url_last_locked`,
+       u.`url_lock_reason`
+FROM
+       `{?_MYSQL_PREFIX?}_surfbar_urls` AS u
+WHERE
+       u.`url_userid`=%s AND
+       u.`url_status` != 'DELETED'
+ORDER BY
+       u.`url_id` ASC",
+               array(getMemberId()), __FUNCTION__, __LINE__);
+
+       // Are there entries?
+       if (!SQL_HASZERONUMS($result)) {
+               // Load all rows
+               while ($row = SQL_FETCHARRAY($result)) {
+                       // Add the row
+                       $urlArray[$row['url_id']] = $row;
                } // END - while
+       } // END - if
 
-               // Free result
-               SQL_FREERESULT($result);
+       // Free result
+       SQL_FREERESULT($result);
+
+       // Return the array
+       return $urlArray;
+}
+
+// "Getter" for member action array for given status
+function getSurfbarArrayFromStatus ($status) {
+       // Init array
+       $returnArray = array();
+
+       // Get all assigned actions
+       $result = SQL_QUERY_ESC("SELECT `actions_action` FROM `{?_MYSQL_PREFIX?}_surfbar_actions` WHERE `actions_status`='%s' ORDER BY `actions_id` ASC",
+               array($status), __FUNCTION__, __LINE__);
+
+       // Some entries there?
+       if (!SQL_HASZERONUMS($result)) {
+               // Load all actions
+               // @TODO This can be somehow rewritten
+               while ($content = SQL_FETCHARRAY($result)) {
+                       array_push($returnArray, $content['actions_action']);
+               } // END - if
+       } // END - if
+
+       // Free result
+       SQL_FREERESULT($result);
+
+       // Return result
+       return $returnArray;
+}
+
+// Reload to configured stop page
+function redirectToSurfbarStopPage ($page = 'stop') {
+       // Internal or external?
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'page=' . $page . ' - ENTERED!');
+       if ((getConfig('surfbar_pause_mode') == 'INTERNAL') || (getConfig('surfbar_pause_url') == '')) {
+               // Reload to internal page
+               redirectToUrl('surfbar.php?frame=' . $page);
+       } else {
+               // Reload to external page
+               redirectToConfiguredUrl('surfbar_pause_url');
+       }
+}
 
-               // Shall we add some ids?
-               $ADD = "";
+/**
+ * Determine next id for surfbar or get data for given id, always call this
+ * before you call other getters below this function!
+ */
+function determineSurfbarNextId ($urlId = NULL) {
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'urlId=' . $urlId . ' - ENTERED!');
+       // Default is no id and no random number
+       $nextId = '0';
+       $randNum = '0';
+
+       // Is the id set?
+       if (is_null($urlId)) {
+               // Get array with lock ids
+               $USE = getSurfbarLockIdsArray();
+
+               // Shall we add some URL ids to ignore?
+               $add = '';
                if (count($USE) > 0) {
-                       $ADD = " AND l.id IN (".implode(",", $USE).")";
+                       // Ignore some!
+                       $add = " AND sbu.`url_id` NOT IN (";
+                       foreach ($USE as $url_id => $lid) {
+                               // Add URL id
+                               $add .= $url_id.',';
+                       } // END - foreach
+
+                       // Add closing bracket
+                       $add = substr($add, 0, -1) . ')';
                } // END - if
 
                // Determine depleted user account
-               $UIDs = SURFBAR_DETERMINE_DEPLETED_USERIDS();
-
-               // Count max availabe entries
-               $result = SQL_QUERY("SELECT sbu.id AS cnt
-FROM "._MYSQL_PREFIX."_surfbar_urls AS sbu
-LEFT JOIN "._MYSQL_PREFIX."_payments AS p
-ON sbu.payment_id=p.id
-LEFT JOIN "._MYSQL_PREFIX."_surfbar_salts AS sbs
-ON sbu.id=sbs.url_id
-LEFT JOIN "._MYSQL_PREFIX."_surfbar_locks AS l
-ON sbu.id=l.url_id
-WHERE sbu.userid NOT IN (".implode(",", $UIDs).") AND sbu.status='CONFIRMED'".$ADD."
-GROUP BY sbu.id", __FILE__, __LINE__);
-
-               // Log last query
-               //DEBUG_LOG(__FUNCTION__.":lastQuery=".$_CONFIG['db_last_query']."|numRows=".SQL_NUMROWS($result)."|Affected=".SQL_AFFECTEDROWS($result)."");
-
-               // Fetch max rand
-               $maxRand = SQL_NUMROWS($result);
+               $userids = determineSurfbarDepletedUserids();
 
-               // Free result
-               SQL_FREERESULT($result);
+               // Get maximum randomness factor
+               $maxRand = getSurfbarMaximumRandom($userids['url_userid'], $add);
 
                // If more than one URL can be called generate the random number!
                if ($maxRand > 1) {
                        // Generate random number
-                       $randNum = mt_rand(0, $maxRand);
+                       $randNum = mt_rand(0, ($maxRand - 1));
                } // END - if
 
                // And query the database
-               //DEBUG_LOG(__FUNCTION__.":randNum={$randNum},maxRand={$maxRand},surfLock=".SURFBAR_GET_DATA('surf_lock')."");
-               $result = SQL_QUERY_ESC("SELECT sbu.id, sbu.userid, sbu.url, sbs.last_salt, sbu.reward, sbu.costs, sbu.views_total, p.time, UNIX_TIMESTAMP(l.last_surfed) AS last_surfed
-FROM "._MYSQL_PREFIX."_surfbar_urls AS sbu
-LEFT JOIN "._MYSQL_PREFIX."_payments AS p
-ON sbu.payment_id=p.id
-LEFT JOIN "._MYSQL_PREFIX."_surfbar_salts AS sbs
-ON sbu.id=sbs.url_id
-LEFT JOIN "._MYSQL_PREFIX."_surfbar_locks AS l
-ON sbu.id=l.url_id
-WHERE sbu.userid NOT IN (".implode(",", $UIDs).") AND sbu.status='CONFIRMED'".$ADD."
-GROUP BY sbu.id
-ORDER BY l.last_surfed ASC, sbu.id ASC
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'randNum='.$randNum.',maxRand='.$maxRand.',surfLock='.getSurfbarSurfLock());
+               $result = SQL_QUERY_ESC("SELECT
+       sbu.`url_id`,
+       sbu.`url_userid`,
+       sbu.`url_package_id`,
+       sbu.`url`,
+       sbs.`salts_last_salt`,
+       sbu.`url_views_total`,
+       sbu.`url_views_max`,
+       sbu.`url_views_allowed`,
+       UNIX_TIMESTAMP(l.`locks_last_surfed`) AS `last_surfed`,
+       sbu.`url_fixed_reload`
+FROM
+       `{?_MYSQL_PREFIX?}_surfbar_urls` AS `sbu`
+LEFT JOIN
+       `{?_MYSQL_PREFIX?}_surfbar_salts` AS `sbs`
+ON
+       sbu.`url_id`=sbs.`salts_url_id`
+LEFT JOIN
+       `{?_MYSQL_PREFIX?}_surfbar_locks` AS `l`
+ON
+       sbu.`url_id`=l.`locks_url_id`
+WHERE
+       (sbu.`url_userid` NOT IN (" . implode(',', $userids['url_userid']) . ") OR sbu.`url_userid` IS NULL) AND
+       sbu.`url_status`='ACTIVE' AND
+       (sbu.`url_views_allowed`=0 OR (sbu.`url_views_allowed` > 0 AND sbu.`url_views_max` > 0))
+       " . $add . "
+GROUP BY
+       sbu.`url_id`
+ORDER BY
+       l.`locks_last_surfed` ASC,
+       sbu.`url_id` ASC
 LIMIT %s,1",
-                       array($randNum), __FILE__, __LINE__
+                       array($randNum), __FUNCTION__, __LINE__
                );
        } else {
                // Get data from specified id number
-               $result = SQL_QUERY_ESC("SELECT sbu.id, sbu.userid, sbu.url, sbs.last_salt, sbu.reward, sbu.costs, sbu.views_total, p.time, UNIX_TIMESTAMP(l.last_surfed) AS last_surfed
-FROM "._MYSQL_PREFIX."_surfbar_urls AS sbu
-LEFT JOIN "._MYSQL_PREFIX."_payments AS p
-ON sbu.payment_id=p.id
-LEFT JOIN "._MYSQL_PREFIX."_surfbar_salts AS sbs
-ON sbu.id=sbs.url_id
-LEFT JOIN "._MYSQL_PREFIX."_surfbar_locks AS l
-ON sbu.id=l.url_id
-WHERE sbu.userid != %s AND sbu.status='CONFIRMED' AND sbu.id=%s
+               $result = SQL_QUERY_ESC("SELECT
+       sbu.`url_id`,
+       sbu.`url_userid`,
+       sbu.`url_package_id`,
+       sbu.`url`,
+       sbs.`salts_last_salt`,
+       sbu.`url_views_total`,
+       sbu.`url_views_max`,
+       sbu.`url_views_allowed`,
+       UNIX_TIMESTAMP(l.`locks_last_surfed`) AS `last_surfed`,
+       sbu.`url_fixed_reload`
+FROM
+       `{?_MYSQL_PREFIX?}_surfbar_urls` AS `sbu`
+LEFT JOIN
+       `{?_MYSQL_PREFIX?}_surfbar_salts` AS `sbs`
+ON
+       sbu.`url_id`=sbs.`salts_url_id`
+LEFT JOIN
+       `{?_MYSQL_PREFIX?}_surfbar_locks` AS `l`
+ON
+       sbu.`url_id`=l.`locks_url_id`
+WHERE
+       (sbu.`url_userid` != %s OR sbu.`url_userid` IS NULL) AND
+       sbu.`url_status`='ACTIVE' AND
+       sbu.`url_id`=%s AND
+       (sbu.`url_views_allowed` = 0 OR (sbu.`url_views_allowed` > 0 AND sbu.`url_views_max` > 0))
 LIMIT 1",
-                       array($GLOBALS['userid'], bigintval($id)), __FILE__, __LINE__
+                       array(getMemberId(), bigintval($urlId)), __FUNCTION__, __LINE__
                );
        }
 
        // Is there an id number?
-       //DEBUG_LOG(__FUNCTION__.":lastQuery=".$_CONFIG['db_last_query']."|numRows=".SQL_NUMROWS($result)."|Affected=".SQL_AFFECTEDROWS($result)."");
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'lastQuery='.getConfig('db_last_query').'|numRows='.SQL_NUMROWS($result).'|Affected='.SQL_AFFECTEDROWS());
        if (SQL_NUMROWS($result) == 1) {
                // Load/cache data
-               //DEBUG_LOG(__FUNCTION__.":count(".count($SURFBAR_CACHE).") - BEFORE");
-               $SURFBAR_CACHE = merge_array($SURFBAR_CACHE, SQL_FETCHARRAY($result));
-               //DEBUG_LOG(__FUNCTION__.":count(".count($SURFBAR_CACHE).") - AFTER");
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'count('.count($GLOBALS['surfbar_cache']).') - BEFORE', FALSE);
+               $GLOBALS['surfbar_cache'] = merge_array($GLOBALS['surfbar_cache'], SQL_FETCHARRAY($result));
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'count('.count($GLOBALS['surfbar_cache']).') - AFTER', FALSE);
 
-               // Is the time there?
-               if (is_null($SURFBAR_CACHE['time'])) {
-                       // Then repair it wit the static!
-                       //DEBUG_LOG(__FUNCTION__.":time - STATIC!");
-                       $SURFBAR_CACHE['time'] = $_CONFIG['surfbar_static_time'];
-               } // END - if
+               // Determine waiting time
+               $GLOBALS['surfbar_cache']['waiting'] = determineSurfbarWaitingTime();
 
                // Is the last salt there?
-               if (is_null($SURFBAR_CACHE['last_salt'])) {
+               if (is_null($GLOBALS['surfbar_cache']['salts_last_salt'])) {
                        // Then repair it wit the static!
-                       //DEBUG_LOG(__FUNCTION__.":last_salt - FIXED!");
-                       $SURFBAR_CACHE['last_salt'] = "";
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'last_salt - FIXED!', FALSE);
+                       $GLOBALS['surfbar_cache']['salts_last_salt'] = '';
                } // END - if
 
                // Fix missing last_surfed
-               if ((!isset($SURFBAR_CACHE['last_surfed'])) || (is_null($SURFBAR_CACHE['last_surfed']))) {
+               if ((!isset($GLOBALS['surfbar_cache']['last_surfed'])) || (is_null($GLOBALS['surfbar_cache']['last_surfed']))) {
                        // Fix it here
-                       //DEBUG_LOG(__FUNCTION__.":last_surfed - FIXED!");
-                       $SURFBAR_CACHE['last_surfed'] = "0";
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'last_surfed - FIXED!', FALSE);
+                       $GLOBALS['surfbar_cache']['last_surfed'] = '0';
                } // END - if
 
-               // Are we in static mode?
-               if ($_CONFIG['surfbar_pay_model'] == "STATIC") {
-                       // Then use static reward/costs!
-                       $SURFBAR_CACHE['reward'] = $_CONFIG['surfbar_static_reward'];
-                       $SURFBAR_CACHE['costs']  = $_CONFIG['surfbar_static_costs'];
-                       //DEBUG_LOG(__FUNCTION__.":FIXED - reward=".SURFBAR_GET_REWARD()."|costs=".SURFBAR_GET_COSTS()."");
-               } else {
+               // Get base/fixed reward and costs
+               $GLOBALS['surfbar_cache']['reward'] = determineSurfbarReward();
+               $GLOBALS['surfbar_cache']['costs']  = determineSurfbarCosts();
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'BASE/STATIC - reward='.getSurfbarReward().'|costs='.getSurfbarCosts());
+
+               // Only in dynamic model add the dynamic bonus!
+               if (getSurfbarPaymentModel() == 'DYNAMIC') {
                        // Calculate dynamic reward/costs and add it
-                       $SURFBAR_CACHE['reward'] += SURFBAR_CALCULATE_DYNAMIC_REWARD_ADD();
-                       $SURFBAR_CACHE['costs']  += SURFBAR_CALCULATE_DYNAMIC_COSTS_ADD();
-                       //DEBUG_LOG(__FUNCTION__.":DYNAMIC - reward=".SURFBAR_GET_REWARD()."|costs=".SURFBAR_GET_COSTS()."");
-               }
+                       $GLOBALS['surfbar_cache']['reward'] += calculateSurfbarDynamicAddValue();
+                       $GLOBALS['surfbar_cache']['costs']  += calculateSurfbarDynamicAddValue();
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'DYNAMIC+ - reward='.getSurfbarReward().'|costs='.getSurfbarCosts());
+               } // END - if
 
                // Now get the id
-               $nextId = SURFBAR_GET_ID();
+               $nextId = getSurfbarId();
        } // END - if
 
        // Free result
        SQL_FREERESULT($result);
 
        // Return result
-       //DEBUG_LOG(__FUNCTION__.":nextId={$nextId}");
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'urlId=' . $urlId . ',nextId=' . $nextId . ' - EXIT!');
        return $nextId;
 }
-// ----------------------------------------------------------------------------
-// PLEASE DO NOT ADD ANY OTHER FUNCTIONS BELOW THIS LINE ELSE THEY "WRAP" THE
-// $SURFBAR_CACHE ARRAY!
-// ----------------------------------------------------------------------------
+
+// Generates an URL to the given booking package
+function generateSurfbarPackageLink ($packageId) {
+       // Base URL
+       $url  = '{%url=modules.php?module=admin&amp;what=list_surfbar_packages';
+
+       // Is package id given?
+       if ((!is_null($packageId)) && ($packageId > 0)) {
+               // Then add it
+               $url .= '&amp;package_id=' . bigintval($packageId);
+       } // END - if
+
+       // Finish URL EL code
+       $url .= '%}';
+
+       // Return it
+       return $url;
+}
+
+//-----------------------------------------------------------------------------
+// Wrapper function
+//-----------------------------------------------------------------------------
+
+// "Getter" for surfbar_dynamic_percent
+function getSurfbarDynamicPercent () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_dynamic_percent');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// "Getter" for surfbar_static_reward
+function getSurfbarStaticReward () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_static_reward');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// "Getter" for surfbar_static_time
+function getSurfbarStaticTime () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_static_time');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// "Getter" for surfbar_max_order
+function getSurfbarMaxOrder () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_max_order');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// "Getter" for surfbar_payment_model
+function getSurfbarPaymentModel () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_payment_model');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// "Getter" for surfbar_stats_reload
+function getSurfbarStatsReload () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_stats_reload');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// "Getter" for surfbar_restart_time
+function getSurfbarRestartTime () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_restart_time');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// "Getter" for surfbar_auto_start
+function getSurfbarAutoStart () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_auto_start');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// Checks whether auto-start is enabled
+function isSurfbarAutoStartEnabled () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = (getSurfbarAutoStart() == 'Y');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// "Getter" for surfbar_daily_counter
+function getSurfbarDailyCounter () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_daily_counter');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// "Getter" for surfbar_yester_counter
+function getSurfbarYesterCounter () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_yester_counter');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// "Getter" for surfbar_weekly_counter
+function getSurfbarWeeklyCounter () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_weekly_counter');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// "Getter" for surfbar_monthly_counter
+function getSurfbarMonthlyCounter () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_monthly_counter');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+// "Getter" for surfbar_total_counter
+function getSurfbarTotalCounter () {
+       // Is there cache?
+       if (!isset($GLOBALS[__FUNCTION__])) {
+               // Determine it
+               $GLOBALS[__FUNCTION__] = getConfig('surfbar_total_counter');
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__];
+}
+
+//------------------------------------------------------------------------------
+//                             Template helper functions
+//------------------------------------------------------------------------------
+
+// Template helper to generate a selection box for surfbar actions
+function doTemplateSurfbarActionsActionSelectionBox ($templateName, $clear = FALSE, $default = NULL) {
+       // Init array
+       $actionsAction = array(
+               0 => array('actions_action' => 'EDIT'),
+               1 => array('actions_action' => 'DELETE'),
+               2 => array('actions_action' => 'PAUSE'),
+               3 => array('actions_action' => 'UNPAUSE'),
+               4 => array('actions_action' => 'FRAMETEST'),
+               5 => array('actions_action' => 'RETREAT'),
+               6 => array('actions_action' => 'RESUBMIT'),
+               7 => array('actions_action' => 'BOOKNOW')
+       );
+
+       // Handle it over to generateSelectionBoxFromArray()
+       $content = generateSelectionBoxFromArray($actionsAction, 'actions_action', 'actions_action', '', '_surfbar', '', $default, '', FALSE, TRUE);
+
+       // Return prepared content
+       return $content;
+}
+
+// Template helper to generate a selection box for surfbar status
+function doTemplateSurfbarActionsStatusSelectionBox ($templateName, $clear = FALSE, $default = NULL) {
+       // Init array
+       $status = array(
+               0 => array('actions_status' => 'PENDING'),
+               1 => array('actions_status' => 'ACTIVE'),
+               2 => array('actions_status' => 'LOCKED'),
+               3 => array('actions_status' => 'STOPPED'),
+               4 => array('actions_status' => 'REJECTED'),
+               5 => array('actions_status' => 'DELETED'),
+               6 => array('actions_status' => 'MIGRATED'),
+               7 => array('actions_status' => 'DEPLETED')
+       );
+
+       // Handle it over to generateSelectionBoxFromArray()
+       $content = generateSelectionBoxFromArray($status, 'actions_status', 'actions_status', '', '_surfbar', '', $default, '', FALSE, TRUE);
+
+       // Return prepared content
+       return $content;
+}
+
+// Template helper to generate a selection box for surfbar status
+function doTemplateSurfbarActionsNewStatusSelectionBox ($templateName, $clear = FALSE, $default = NULL) {
+       // Init array
+       $status = array(
+               0 => array('actions_new_status' => 'PENDING'),
+               1 => array('actions_new_status' => 'ACTIVE'),
+               2 => array('actions_new_status' => 'LOCKED'),
+               3 => array('actions_new_status' => 'STOPPED'),
+               4 => array('actions_new_status' => 'REJECTED'),
+               5 => array('actions_new_status' => 'DELETED'),
+               6 => array('actions_new_status' => 'MIGRATED'),
+               7 => array('actions_new_status' => 'DEPLETED')
+       );
+
+       // Handle it over to generateSelectionBoxFromArray()
+       $content = generateSelectionBoxFromArray($status, 'actions_new_status', 'actions_new_status', '', '_surfbar', '', $default, '', TRUE, TRUE);
+
+       // Return prepared content
+       return $content;
+}
+
+//------------------------------------------------------------------------------
+// PLEASE DO NOT ADD ANY OTHER FUNCTIONS BELOW THIS LINE IF THEY DON'T "WRAP"
+// THE $GLOBALS['surfbar_cache'] ARRAY!
+//------------------------------------------------------------------------------
+
+// Initializes the surfbar
+function initSurfbar () {
+       // Init cache array
+       $GLOBALS['surfbar_cache'] = array();
+}
+
 // Private getter for data elements
-function SURFBAR_GET_DATA ($element) {
-       global $SURFBAR_CACHE;
-       //DEBUG_LOG(__FUNCTION__.":element={$element}");
+function getSurfbarData ($element) {
+       // Debug message
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'element=' . $element . ' - ENTERED!');
 
        // Default is null
-       $data = null;
+       $data = NULL;
 
        // Is the entry there?
-       if (isset($SURFBAR_CACHE[$element])) {
+       if (isset($GLOBALS['surfbar_cache'][$element])) {
                // Then take it
-               $data = $SURFBAR_CACHE[$element];
-       } else { // END - if
-               print("<pre>");
-               print_r($SURFBAR_CACHE);
-               debug_print_backtrace();
-               die("</pre>");
-       }
+               $data = $GLOBALS['surfbar_cache'][$element];
+       } // END - if
 
        // Return result
-       //DEBUG_LOG(__FUNCTION__.":element[$element]={$data}");
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'element[' . $element . ']=[' . gettype($data) . ']' . $data . ' - EXIT!');
        return $data;
 }
+
 // Getter for reward from cache
-function SURFBAR_GET_REWARD () {
+function getSurfbarReward () {
        // Get data element and return its contents
-       return SURFBAR_GET_DATA('reward');
+       return getSurfbarData('reward');
 }
+
 // Getter for costs from cache
-function SURFBAR_GET_COSTS () {
+function getSurfbarCosts () {
        // Get data element and return its contents
-       return SURFBAR_GET_DATA('costs');
+       return getSurfbarData('costs');
 }
+
 // Getter for URL from cache
-function SURFBAR_GET_URL () {
+function getSurfbarUrl () {
        // Get data element and return its contents
-       return SURFBAR_GET_DATA('url');
+       return getSurfbarData('url');
 }
+
 // Getter for salt from cache
-function SURFBAR_GET_SALT () {
+function getSurfbarSalt () {
        // Get data element and return its contents
-       return SURFBAR_GET_DATA('salt');
+       return getSurfbarData('salt');
 }
+
 // Getter for id from cache
-function SURFBAR_GET_ID () {
+function getSurfbarId () {
        // Get data element and return its contents
-       return SURFBAR_GET_DATA('id');
+       return getSurfbarData('url_id');
 }
+
 // Getter for userid from cache
-function SURFBAR_GET_USERID () {
+function getSurfbarUserid () {
        // Get data element and return its contents
-       return SURFBAR_GET_DATA('userid');
+       return getSurfbarData('url_userid');
 }
+
 // Getter for user reload locks
-function SURFBAR_GET_USER_RELOAD_LOCK () {
+function getSurfbarUserLocks () {
        // Get data element and return its contents
-       return SURFBAR_GET_DATA('user_locks');
+       return getSurfbarData('user_locks');
 }
+
 // Getter for reload time
-function SURFBAR_GET_RELOAD_TIME () {
+function getSurfbarWaitingTime () {
        // Get data element and return its contents
-       return SURFBAR_GET_DATA('time');
+       return getSurfbarData('waiting');
 }
-//
+
+// Getter for allowed views
+function getSurfbarViewsAllowed () {
+       // Get data element and return its contents
+       return getSurfbarData('url_views_allowed');
+}
+
+// Getter for maximum views
+function getSurfbarViewsMax () {
+       // Get data element and return its contents
+       return getSurfbarData('url_views_max');
+}
+
+// Getter for fixed reload
+function getSurfbarFixedReload () {
+       // Get data element and return its contents
+       return getSurfbarData('url_fixed_reload');
+}
+
+// Getter for fixed waiting time
+function getSurfbarFixedWaitingTime () {
+       // Get data element and return its contents
+       return getSurfbarData('url_fixed_waiting');
+}
+
+// Getter for package id
+function getSurfbarPackageId () {
+       // Get data element and return its contents
+       return getSurfbarData('url_package_id');
+}
+
+// Getter for surf lock
+function getSurfbarSurfLock () {
+       // Get data element and return its contents
+       return getSurfbarData('surf_lock');
+}
+
+// Getter for new status
+function getSurfbarNewStatus () {
+       // Get data element and return its contents
+       return getSurfbarData('new_status');
+}
+
+// Getter for last salt
+function getSurfbarLastSalt () {
+       // Get data element and return its contents
+       return getSurfbarData('salts_last_salt');
+}
+
+// [EOF]
 ?>