/**
  * {@inheritDoc}
  */
 public function calculate($request, ShoppingCart $shoppingCart)
 {
     $paymentType = $shoppingCart->getSelectedPaymentType();
     // iterate over all conditions
     $output = array();
     foreach ($this->container->get('settingsService')->get('plugins.paymentSurcharge.conditions', array()) as $condition) {
         if ($paymentType->getId() == $condition['code'] || null === $condition['code']) {
             // payment module match
             if (null != $condition['cvalue']) {
                 $cvalueToken = explode(':', $condition['cvalue']);
                 if (2 == count($cvalueToken)) {
                     $cvalueType = $cvalueToken[0];
                     $cvalueName = $cvalueToken[1];
                 } else {
                     $cvalueType = 'field';
                     $cvalueName = $cvalueToken[0];
                 }
                 // evaluate the value to use with the regexp
                 $cvalueNames = explode(';', $cvalueName);
                 switch ($cvalueType) {
                     case 'field':
                         $cvalue = null;
                         foreach ($cvalueNames as $name) {
                             if (isset($payment->{$name})) {
                                 $cvalue = $payment->{$name};
                             } else {
                                 $cvalue = $request->getParameter($name, null);
                             }
                             if (null !== $cvalue) {
                                 break;
                             }
                         }
                         break;
                     default:
                         $this->container->get('logger')->err('invalid condition value type: ' . $cvalueType);
                         return null;
                 }
             }
             // check eregexp
             if (null == $condition['cvalue'] && null == $condition['regexp'] || ereg($condition['regexp'], $cvalue)) {
                 // match, so apply condition
                 // evaluate the condition's value
                 $amount = 0;
                 if (is_numeric($condition['value'])) {
                     $amount = (double) $condition['value'];
                 }
                 if (0 === strpos($condition['value'], '%:')) {
                     $amount = trim(str_replace('%:', '', $condition['value']));
                     $amount = $shoppingCart->getSubtotal() * ($amount / 100);
                 }
                 $details = Beans::getBean('ZMOrderTotalLineDetails');
                 $details->setTitle($condition['title']);
                 $details->setAmount($amount);
                 $details->setDisplayValue($amount);
                 $output[] = $details;
             }
         }
     }
     return $output;
 }