Rewrote 'we' word a little, rewrote mail order to use SQL_INSERTID() instead of anoth...
[mailer.git] / inc / expression-functions.php
index b5f92fc07d316dc7501709d4595ecc50fa0b2d00..f8e823d9bc9a6694d0321905340bfdbc22ce6dce 100644 (file)
  * $Date::                                                            $ *
  * $Tag:: 0.2.1-FINAL                                                 $ *
  * $Author::                                                          $ *
- * Needs to be in all Files and every File needs "svn propset           *
- * svn:keywords Date Revision" (autoprobset!) at least!!!!!!            *
  * -------------------------------------------------------------------- *
  * Copyright (c) 2003 - 2009 by Roland Haeder                           *
- * Copyright (c) 2009, 2010 by Mailer Developer Team                    *
- * For more information visit: http://www.mxchange.org                  *
+ * 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 *
@@ -49,13 +47,13 @@ function replaceExpressionCode ($data, $replacer) {
        return str_replace($data['matches'][0][$data['key']], $replacer, escapeQuotes($data['code']));
 }
 
-// Private function to determine wether we have a special expression function avaible
+// Private function to determine whether we have a special expression function avaible
 // (mostly located in wrapper-functions.php)
 function isExpressionFunctionAvaiable ($data) {
-       // Get the enty we need
-       $entry = $data['matches'][4][$data['key']];
+       // Get the enty we need and trim it
+       $entry = trim($data['matches'][4][$data['key']]);
 
-       // Do we have cache?
+       // Is there cache?
        if (!isset($GLOBALS['expression_function_available'][$entry])) {
                // Init function name
                $functionName = 'get';
@@ -65,14 +63,14 @@ function isExpressionFunctionAvaiable ($data) {
                        // Add non-empty parts
                        if (!empty($piece)) {
                                // Add it
-                               $functionName .= ucfirst(strtolower($piece));
+                               $functionName .= capitalizeUnderscoreString($piece);
                        } // END - if
                } // END - foreach
 
                // Is that function there?
                if (function_exists($functionName)) {
                        // Cache it all
-                       $GLOBALS['expression_function_name'][$entry] = $functionName;
+                       $GLOBALS['expression_function_name'][$entry]      = $functionName;
                        $GLOBALS['expression_function_available'][$entry] = true;
                } else {
                        // Not avaiable
@@ -83,7 +81,7 @@ function isExpressionFunctionAvaiable ($data) {
                }
        } elseif ($GLOBALS['expression_function_available'][$entry] == false) {
                // Debug message
-               logDebugMessage(__FUNCTION__, __LINE__, 'Expression function for entry ' . $entry . ' requested but not found.');
+               logDebugMessage(__FUNCTION__, __LINE__, 'Expression function for entry ' . $entry . ' requested but does not exist.');
        }
 
        // Return cache
@@ -110,11 +108,17 @@ function doExpressionCode ($data) {
 
 // Expression call-back function for URLs
 function doExpressionUrl ($data) {
-       // Do we have JS-mode?
-       if ($data['callback'] == 'js') $data['mode'] = 1;
+       // Is there JS-mode?
+       if ($data['callback'] == 'js') {
+               // Switch to it
+               $data['output_mode'] = '1';
+       } // END - if
 
        // Handle an URL here
-       $replacer = "{DQUOTE} . encodeUrl('" . $data['matches'][4][$data['key']] . "', " . $data['mode'] . ') . {DQUOTE}';
+       $replacer = "{DQUOTE} . encodeUrl('" . $data['matches'][4][$data['key']] . "', " . $data['output_mode'] . ') . {DQUOTE}';
+
+       // Debug log
+       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'replacer=' . $replacer . ',callback=' . $data['callback']);
 
        // Replace it
        $code = replaceExpressionCode($data, $replacer);
@@ -126,7 +130,7 @@ function doExpressionUrl ($data) {
 // Expression call-back function for reading data from $_SERVER
 function doExpressionServer ($data) {
        // This will make 'foo_bar' to detectFooBar()
-       $functionName = "'detect' . implode('', array_map('ucfirst', explode('_', '" . $data['callback'] . "')))";
+       $functionName = "'detect' . implode('', array_map('firstCharUpperCase', explode('_', '" . $data['callback'] . "')))";
 
        // Generate replacer
        $replacer = '{DQUOTE} . call_user_func(' . $functionName . ') . {DQUOTE}';
@@ -138,42 +142,6 @@ function doExpressionServer ($data) {
        return $code;
 }
 
-// Expression call-back function for fetching user data
-function doExpressionUser ($data) {
-       // Use current userid by default
-       $functionName = 'getMemberId()';
-
-       // User-related data, so is there a userid?
-       if (!empty($data['matches'][4][$data['key']])) {
-               // Do we have a userid or $userid?
-               if ($data['matches'][4][$data['key']] == '$userid') {
-                       // Use dynamic call
-                       $functionName = "getFetchedUserData('userid', \$userid, '" . $data['callback'] . "')";
-               } elseif (!empty($data['matches'][4][$data['key']])) {
-                       // User data found
-                       $functionName = "getFetchedUserData('userid', " . $data['matches'][4][$data['key']] . ", '" . $data['callback'] . "')";
-               }
-       } elseif ((!empty($data['callback'])) && (isUserDataValid())) {
-               // "Call-back" alias column for current logged in user's data
-               $functionName = "getUserData('" . $data['callback'] . "')";
-       }
-
-       // Do we have another function to run (e.g. translations)
-       if (!empty($data['extra_func'])) {
-               // Surround the original function call with it
-               $functionName = $data['extra_func'] . '(' . $functionName . ')';
-       } // END - if
-
-       // Generate replacer
-       $replacer = '{DQUOTE} . ' . $functionName . ' . {DQUOTE}';
-
-       // Now replace the code
-       $code = replaceExpressionCode($data, $replacer);
-
-       // Return replaced code
-       return $code;
-}
-
 // Expression call-back function for getting extension data
 function doExpressionExt ($data) {
        // Not installed is default
@@ -182,14 +150,14 @@ function doExpressionExt ($data) {
        // Is the extension installed?
        if (isExtensionInstalled($data['matches'][4][$data['key']])) {
                // Construct call-back function name
-               $functionName = 'getExtension' . ucfirst(strtolower($data['callback']));
+               $functionName = 'getExtension' . capitalizeUnderscoreString($data['callback']);
 
                // Construct call of the function
                $replacer = "{DQUOTE} . call_user_func_array('" . $functionName . "', array('" . $data['matches'][4][$data['key']] . "', true)) . {DQUOTE}";
        } // END - if
 
        // Generate replacer
-       $replacer = sprintf("&ext=%s&ver=%s&rev={?CURR_SVN_REVISION?}", $data['matches'][4][$data['key']], $replacer);
+       $replacer = sprintf("&ext=%s&ver=%s&rev={?CURRENT_REPOSITORY_REVISION?}", $data['matches'][4][$data['key']], $replacer);
 
        // Replace it and insert parameter for GET request
        $code = replaceExpressionCode($data, $replacer);
@@ -201,13 +169,16 @@ function doExpressionExt ($data) {
 // Expression call-back function for getting configuration data
 // @TODO FILTER_COMPILE_CONFIG does not handle call-back functions so we handle it here again
 function doExpressionConfig ($data) {
-       // Do we have a special expression function for it?
+       // Is there a special expression function for it?
        if (isExpressionFunctionAvaiable($data)) {
                // Then use it
-               $replacer = '{DQUOTE}  . ' . $data['callback'] . '('.getExpressionFunction($data).'(' . "'" . $data['matches'][4][$data['key']] . "'" . ')) . {DQUOTE}';
+               $replacer = '{DQUOTE}  . ' . $data['callback'] . '(' . getExpressionFunction($data) . '()) . {DQUOTE}';
+       } elseif (!isConfigEntrySet($data['matches'][4][$data['key']])) {
+               // Config entry is not set
+               $replacer = '{DQUOTE}  . ' . $data['callback'] . '(NULL) . {DQUOTE}';
        } else {
                // Default replacer is the config value itself
-               $replacer = '{DQUOTE}  . ' . $data['callback'] . '(getConfig(' . "'" . $data['matches'][4][$data['key']] . "'" . ')) . {DQUOTE}';
+               $replacer = '{DQUOTE}  . ' . $data['callback'] . '(getConfig(' . chr(39) . $data['matches'][4][$data['key']] . chr(39) . ')) . {DQUOTE}';
        }
 
        // Replace the config entry
@@ -222,15 +193,19 @@ function doExpressionPipe ($data) {
        // We need callback and extra_func: callback is really the call-back function, extra_func is our value
        $replacer = $data['extra_func'];
 
-       // Do we have a call-back? Should always be there!
+       // Is there a call-back? Should always be there!
        if (!empty($data['callback'])) {
-               //if ($data['callback'] == 'getMemberId') die('<pre>'.encodeEntities(print_r($data, true)).'</pre>');
+               //* DEBUG: */ if ($data['callback'] == 'getMemberId') die('<pre>'.encodeEntities(print_r($data, true)).'</pre>');
                // If the value is empty, we don't add it
-               if (empty($data['value'])) {
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'value[' . gettype($data['value']) . ']=' . $data['value']);
+               if ((empty($data['value'])) && ($data['value'] != '0')) {
                        // No value is set
                        $replacer = '{DQUOTE} . ' . $data['extra_func2'] . '(' . $data['extra_func'] . '(' . $data['callback'] . '())) . {DQUOTE}';
+               } elseif (isXmlTypeBool($data['value'])) {
+                       // Boolean value detected
+                       $replacer = '{DQUOTE} . ' . $data['extra_func2'] . '(' . $data['extra_func'] . '(' . $data['callback'] . '(' . $data['value'] . '))) . {DQUOTE}';
                } else {
-                       // Some value is set
+                       // Some string/integer value is set
                        $replacer = '{DQUOTE} . ' . $data['extra_func2'] . '(' . $data['extra_func'] . '(' . $data['callback'] . "('" . $data['value'] . "'))) . {DQUOTE}";
                }
        } // END - if
@@ -281,7 +256,7 @@ function doExpressionMessage ($data) {
        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'callback=' . $data['callback'] . ',extra_func=' . $data['extra_func'] . ',value=' . $data['value']);
 
        // Message string replacement depends on if message is masked
-       if ((isMessageMasked($data['callback'])) && ((!empty($data['extra_func'])) || ($data['extra_func'] == '0'))) {
+       if ((isMessageMasked($data['callback'], false)) && ((!empty($data['extra_func'])) || ($data['extra_func'] == '0'))) {
                // Message should be masked
                $replacer = "{DQUOTE} . getMaskedMessage('" . $data['callback'] . "', '" . $data['extra_func'] . "') . {DQUOTE}";
        } elseif (!empty($data['value'])) {
@@ -301,9 +276,114 @@ function doExpressionMessage ($data) {
 
 // Expression call-back for template functions
 function doExpressionTemplate ($data) {
+       // Construct call-back function name
+       $callbackFunction = 'doTemplate' . $data['callback'];
+
+       // Init replacer
+       $replacer = '<!-- [' . __FUNCTION__ . ':' . __LINE__.'] Call-back function ' . $callbackFunction  . ' does not exist. //-->';
+
+       // Is the function there?
+       if (!isset($GLOBALS['current_template'])) {
+               // This is very bad and needs fixing
+               reportBug(__FUNCTION__, __LINE__, 'current_template in GLOBALS not set, callbackFunction=' . $callbackFunction . ',function_exists()=' . intval(function_exists($callbackFunction)));
+       } elseif (!function_exists($callbackFunction)) {
+               // Log missing function only in debug mode
+               if (isDebugModeEnabled()) {
+                       // Log it here
+                       logDebugMessage(__FUNCTION__, __LINE__, 'Call-back function ' . $callbackFunction . ' does not exist.');
+               } // END - if
+       } else {
+               // Do the replacement
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'template='.$GLOBALS['current_template']);
+               $replacer = '{DQUOTE} . ' . $callbackFunction . '(' . chr(39) . $GLOBALS['current_template'] . chr(39) . ', true';
+
+               // Is 'value' set?
+               if (!empty($data['value'])) {
+                       // Then include it as well
+                       $replacer .= ', ' . chr(39) . $data['value'] . chr(39);
+               } // END - if
+
+               // Replacer is ready
+               $replacer .= ') . {DQUOTE}';
+       }
+
+       // Replace the code
+       $code = replaceExpressionCode($data, $replacer);
+
+       // Return the (maybe) replaced code
+       return $code;
+}
+
+// Expression call-back for math functions
+function doExpressionMath ($data) {
        // Do the replacement
        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'template='.$GLOBALS['current_template']);
-       $replacer = '{DQUOTE} . doTemplate' . $data['callback'] . "('" . $GLOBALS['current_template'] . "', true) . {DQUOTE}";
+       $replacer = '{DQUOTE} . doCalculate' . $data['callback'] . '(' . $data['value'] . ') . {DQUOTE}';
+
+       // Replace the code
+       $code = replaceExpressionCode($data, $replacer);
+
+       // Load include once
+       loadIncludeOnce('inc/math-functions.php');
+
+       // Return the (maybe) replaced code
+       return $code;
+}
+
+// Expression call-back for GET request
+function doExpressionGet ($data) {
+       // Construct the replacer
+       $replacer = '{%pipe,getRequestElement=' . $data['value'] . '%}';
+
+       // Replace the code
+       $code = replaceExpressionCode($data, $replacer);
+
+       // Return the (maybe) replaced code
+       return $code;
+}
+
+// Expression call-back for POST request
+function doExpressionPost ($data) {
+       // Construct the replacer
+       $replacer = '{%pipe,postRequestElement=' . $data['value'] . '%}';
+
+       // Replace the code
+       $code = replaceExpressionCode($data, $replacer);
+
+       // Return the (maybe) replaced code
+       return $code;
+}
+
+// Expression call-back for session data
+function doExpressionSession ($data) {
+       // Construct the replacer
+       $replacer = '{%pipe,getSession=' . $data['value'] . '%}';
+
+       // Debug message
+       //* NOISY-DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'value=' . $data['value'] . ',replacer=' . $replacer);
+
+       // Replace the code
+       $code = replaceExpressionCode($data, $replacer);
+
+       // Return the (maybe) replaced code
+       return $code;
+}
+
+/**
+ * Expression call-back for session piplining, this means:
+ *
+ * 1) Read session data
+ * 2) Wrap the raw data into {%pipe,fooFunction=$rawValue%}
+ */
+function doExpressionSessionPipe ($data) {
+       // Get the session data
+       $rawValue = getSession($data['value']);
+
+       // Construct the replacer
+       $replacer = '{%pipe,' . $data['callback'] . '=' . $rawValue . '%}';
+
+       // Debug message
+       //* NOISY-DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'value=' . $data['value'] . ',rawValue=' . $rawValue . ',replacer=' . $replacer);
 
        // Replace the code
        $code = replaceExpressionCode($data, $replacer);