<?php
/**
* @package RSForm! Pro
* @copyright (C) 2007-2019 www.rsjoomla.com
* @license GPL, http://www.gnu.org/copyleft/gpl.html
*/
defined('_JEXEC') or die;
class RSFormProCalculations
{
protected static function escape($string) {
return addslashes($string);
}
public static function expression($calculation, $formId) {
$return = '';
$pattern = '#{(.*?):value}#is';
$expression = $calculation->expression;
preg_match_all($pattern,$calculation->expression,$matches);
if ($matches) {
foreach ($matches[0] as $i => $match) {
$field = self::clean($matches[1][$i]."_".$formId);
$return .= "\t var total".$field." = 0;\n";
$return .= "\t var values".$field." = RSFormPro.getValue(".$formId.", '".$matches[1][$i]."');\n";
$return .= "\t if (typeof values".$field." == 'object') { \n";
$return .= "\t\t for(i=0;i<values".$field.".length;i++) {\n";
$return .= "\t\t\t thevalue = values".$field."[i]; \n";
$return .= "\t\t\t if (isset(RSFormProPrices['".$formId."_".$matches[1][$i]."'])) { \n";
$return .= "\t\t\t\t total".$field." += isset(RSFormProPrices['".$formId."_".$matches[1][$i]."'][thevalue]) ? parseFloat(RSFormProPrices['".$formId."_".$matches[1][$i]."'][thevalue]) : 0; \n";
$return .= "\t\t\t }\n";
$return .= "\t\t }\n";
$return .= "\t } else { \n";
$return .= "\t\t total".$field." += (values".$field.".indexOf('".self::escape(RSFormProHelper::getConfig('calculations.thousands'))."') === -1 && values".$field.".indexOf('".self::escape(RSFormProHelper::getConfig('calculations.decimal'))."') === -1) ? parseFloat(values".$field.") : parseFloat(RSFormPro.toNumber(values".$field.",'".self::escape(RSFormProHelper::getConfig('calculations.decimal'))."','".self::escape(RSFormProHelper::getConfig('calculations.thousands'))."','".self::escape(RSFormProHelper::getConfig('calculations.nodecimals'))."')); \n";
$return .= "\t } \n";
$return .= "\t total".$field." = !isNaN(total".$field.") ? total".$field." : 0; \n";
$expression = str_replace($match,'total'.$field,$expression);
}
$return .= "\n\t var grandTotal".$calculation->id.$formId." = ".$expression.";\n";
$return .= "\t try {\n";
$return .= "\t\t if (RSFormPro.getFieldsByName($formId, '{$calculation->total}')[0].getAttribute('type') === 'number') {\n";
// No formatting for input type="number"
$return .= "\t\t\t RSFormPro.getFieldsByName($formId, '{$calculation->total}')[0].value = grandTotal".$calculation->id.$formId.";\n";
$return .= "\t\t } else {\n";
$return .= "\t\t\t RSFormPro.getFieldsByName($formId, '{$calculation->total}')[0].value = number_format(grandTotal".$calculation->id.$formId.",".(int) RSFormProHelper::getConfig('calculations.nodecimals').",'".self::escape(RSFormProHelper::getConfig('calculations.decimal'))."','".self::escape(RSFormProHelper::getConfig('calculations.thousands'))."'); \n";
$return .= "\t\t }\n";
$return .= "\t } catch (err) {}\n";
}
return $return;
}
protected static function clean($string) {
return preg_replace('/[^a-z0-9]/i', '_', $string);
}
public static function getFields($calculations, $formId) {
$fields = array();
$return = "\n".'var rsfpCalculationFields'.$formId.' = [];';
$pattern = '#{(.*?):value}#is';
if (!empty($calculations)) {
foreach ($calculations as $calculation) {
if (preg_match_all($pattern,$calculation->expression,$matches)) {
foreach ($matches[1] as $match) {
$fields[] = $match;
}
}
}
if ($fields = array_unique($fields)) {
foreach ($fields as $field) {
$return .= "\n".'rsfpCalculationFields'.$formId.'["'.$formId.'_'.addslashes($field).'"] = {};';
}
}
}
return $return;
}
}