<?php
/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, D-84453 Mühldorf
 */




class DataMenuNewsletter extends DataMenuMain
{
  private static $alreadyHandled = false;

  public function _getClickPath($pName = 'Newsletter')
  {
    if ($this->isAbmeldungStep1() || $this->isAbmeldungStep2()) {
      $this->_setStdClickPath($pName, 'clickNewsletterAbmeldungText');
    } else {
      $this->_setStdClickPath($pName, 'clickNewsletterText');
    }

    return $this->clickpfad;
  }

  public function mainmenu()
  {
    if ($this->toolsettings->showClickpfad) {
      echo $this->getClickPath();
    }
    echo '<div class="hauptseite_ohnestatus">' . "\n" . $this->getContentAnker();
    $basysSettings = BASysSettingsAPI::getBASysSettings();
    if ($basysSettings->newsletter) {
      echo $this->internerContent();
    } else {
      echo 'Der Newsletter Baustein ist nicht aktiviert!' . BR
       . 'Nähere Informationen finden Sie auf der Webseite '
       . '<a href="http://www.kufer.de" title="Homepage der Kufer Software GmbH">www.kufer.de</a>';
    }
    echo '</div>';
  }

  public function internerContent()
  {
    $nlAnmeldung = new NlAnmeldung();

    
    if ($this->isAbmeldungStep2()) {
      $nlAnmeldung->getNlAnmeldungFromRequest2Session();
      
      $abmeldeFormular = GetOperations::getVarValue('abmeldeformular', '--') != '--';
      
      if ($nlAnmeldung->checkPflichtfelder($abmeldeFormular)) {
        $result = '';
        if (static::$alreadyHandled || $nlAnmeldung->direkteAnAbmeldung(false)) {
          
          $result = $nlAnmeldung->showBestaetigungAbmeldung();
          static::$alreadyHandled = true;
        } else {
          $result = $nlAnmeldung->showTechnischeProbleme();
        }
        NlSessionOperations::clearNlVarsFromSession();

        return $result;
      }
    }
    
    elseif (PostOperations::getVarValue('nl_anmeldung', '--') != '--') {
      
      $nlAnmeldung->getNlAnmeldungFromRequest2Session();
      if ($nlAnmeldung->checkPflichtfelder()) {
        
        
        $result = '';
        if (!$this->toolsettings->nlAnmeldungDirekt) {
          if (static::$alreadyHandled || ($nlAnmeldung->prepareOptInAnmeldung() && $nlAnmeldung->sendOptInMail())) {
            $result = $nlAnmeldung->showOptinMeldung();
            static::$alreadyHandled = true;
          } else {
            $result = $nlAnmeldung->showTechnischeProbleme();
          }
        }
        
        else {
          if (static::$alreadyHandled || $nlAnmeldung->direkteAnAbmeldung()) {
            $result = $nlAnmeldung->showDankeschoen();
            static::$alreadyHandled = true;
          } else {
            $result = $nlAnmeldung->showTechnischeProbleme();
          }
        }
        NlSessionOperations::clearNlVarsFromSession();

        return $result;
      }
    } elseif (GetOperations::getVarValue('nlkey', '--') != '--'
            && GetOperations::getVarValue('nlhash', '--') != '--') {
      $optin = GetOperations::getVarValue('nlkey', '--');
      $mailhash = GetOperations::getVarValue('nlhash', '--');
      $result = '';
      if (static::$alreadyHandled || $nlAnmeldung->doOptInAnmeldungSecondPart($optin, $mailhash)) {
        $result = $nlAnmeldung->showDankeschoen();
        static::$alreadyHandled = true;
      } else {
        $result = $nlAnmeldung->showTechnischeProbleme();
      }
      NlSessionOperations::clearNlVarsFromSession();

      return $result;
    } elseif ($this->isAbmeldungStep1()) {
      return $nlAnmeldung->showFormular(true);
    } else {
      return $nlAnmeldung->showFormular();
    }

    return '';
  }

  private function isAbmeldungStep1()
  {
    return $this->urlparameter->abmelden == 1;
  }

  private function isAbmeldungStep2()
  {
    return PostOperations::getVarValue('nl_abmeldung', '--') != '--' || GetOperations::getVarValue('abmeldeformular', '--') != '--';
  }

  
  public function getVarValue($pVarname, $pParams)
  {
    switch ($pVarname) {
      default:
        return 'undefinierte Newsletter-Plugin Variable';
    }
  }
}

class NlAnmeldung
{
  public $formularSightId = 262;
  public $mailSightId = 263;
  public $abmeldeSightId = 264;

  public $expAdapter;

  public $optinlink;

  public $toolsettings;

  private $nlapi;

  public function __construct()
  {
    $this->expAdapter = new ExpNewsletter();
    $this->nlapi = new \Kufer\Web\Classes\Api\NewsletterAPI();
    $this->toolsettings = ToolSettingsAPI::getToolSettings(4);
  }

  
  public function prepareOptInAnmeldung()
  {
    $nlanmeldung = NlSessionOperations::getNlAnmeldungFromSession();
    if (count($nlanmeldung) > 0) {
      $anmeldung = $nlanmeldung[0];
      $anmeldung->status = 'J';
      $interessengebiete = NlSessionOperations::getNlInteressengebieteKennzFromSession();

      $this->speichereDatenFuerDoubleOptIn($anmeldung, $interessengebiete);

      return true;
    } else {
      return false;
    }
  }

  
  public function speichereDatenFuerDoubleOptIn($pAnmeldung, $pInteressengebiete)
  {
    $dtop = new DateTimeOperations();
    $pAnmeldung->bearbdatum = $dtop->getDateTimeNow();

    $dbwork = new DBWorkDblOptinNewsletter();
    $optin = $dbwork->saveNewsletterAnmeldung($pAnmeldung, $pInteressengebiete);

    $this->optinlink = $this->getOptinLink($optin, $pAnmeldung->getVarValue('email'));
  }

  public function getOptinLink($optin, $mail)
  {
    $hash = md5($mail);
    
    $up = new URLParameterNewsletter(false);
    $up->kathaupt = 228;
    $up->nlhash = $hash;
    $up->nlkey = $optin;
    $up->pid = 'Newsletter';
    $anb = CmsAnb::getAnbindung();
    $result = $anb->rewriteUrl($up);
    if ($anb instanceof \NoCmsAnb) {
      $result .= '&nlhash=' . $hash . '&nlkey=' . $optin;
    }

    return trim($result);
  }

  
  public function doOptInAnmeldungSecondPart($pOptin, $pMailHash)
  {
    
    $dbwork = new DBWorkDblOptinNewsletter();
    $nlanmeldung = $dbwork->getCompleteNewsletterAnmeldungByHash($pOptin, $pMailHash);

    if ($nlanmeldung == null) {
      Logger::logg(WB_LOG_PREFIX_NL . "Fehler beim Auslesen aus der Datenbank: $pOptin, $pMailHash", 50);

      return false;
    }

    
    $dbwi = new DBWorkDblOptinInteressengebiet();
    $interessengebiete = $dbwi->getInteressengebieteByOptin($pOptin);

    NlSessionOperations::getNlAnmeldung2Session($nlanmeldung, $interessengebiete);

    if ($this->datenSenden($nlanmeldung, $interessengebiete)) {
      
      if ($this->toolsettings->nlSendAnmeldeInfoMail) {
        $this->sendAnmeldeBenachrichtigung($nlanmeldung);
      }
      $dbwork->deleteByOptin($pOptin);

      return true;
    } else {
      return false;
    }
  }

  
  public function sendAnmeldeBenachrichtigung($pNlanmeldung)
  {
    $mailText = '';
    if ($pNlanmeldung !== null && $pNlanmeldung instanceof NewsletterAnmeldung) {
      $mailText .= $this->getSightPart($this->formularSightId, WB_SIGHT_PART_HEADER, array($pNlanmeldung));
      $mailText .= $this->getSightPart($this->formularSightId, WB_SIGHT_PART_BODY, array($pNlanmeldung));
      $mailText .= $this->getSightPart($this->formularSightId, WB_SIGHT_PART_FOOTER, array($pNlanmeldung));

      $mailText = $this->simpleDisableInputElements($mailText);

      $mailText = '<html><head></head><body><span style="display: none">VERWENDEN SIE ZUM LESEN DIESER E-MAIL UNBEDINGT DEN HTML MODUS IHRES MAIL-CLIENTS!!</span>' . $mailText . '</body></html>';

      
      $to = $this->toolsettings->bccAnmeldebestaetigungeMailAdresse;
      if ($to == '') {
        $allgSettings = AllgSettingsAPI::getAllgSettings();
        $to = $allgSettings->vhsemail;
      }

      $email = new smtpMail();
      $email->SetVar2Value('to', $to);
      $email->SetVar2Value('subject', 'Newsletter-Anmeldung eingegangen');
      $email->SetVar2Value('contenttype', SMTP_CONTENTTYPE_HTML);
      $email->SetVar2Value('body', $mailText);
      $retour = $email->sendMail();
      if (!$retour) {
        Logger::logg(WB_LOG_PREFIX_NL . 'Fehler beim Versenden der Anmelde-Benachrichtigungs-eMail an ' . $to, 50);
      }

      return $retour;
    } else {
      return false;
    }
  }

  
  private function simpleDisableInputElements($pString)
  {
    $result = $pString;
    $result = str_replace('<select name=', '<select disabled="disabled" name=', $result);
    $result = str_replace(' type="text" id="', ' type="text" readonly="readonly" id="', $result);
    $result = str_replace(' type="checkbox" ', ' type="checkbox" disabled="disabled" ', $result);

    return str_replace('<textarea ', '<textarea disabled="disabled"', $result);
  }

  
  public function direkteAnAbmeldung($pAnmeldung = true)
  {
    $nlanmeldung = NlSessionOperations::getNlAnmeldungFromSession();
    if (count($nlanmeldung) > 0) {
      $anmeldung = $nlanmeldung[0];
      if ($pAnmeldung) {
        $anmeldung->status = 'J';
      } else {
        $anmeldung->status = 'N';
      }
      $interessengebiete = NlSessionOperations::getNlInteressengebieteKennzFromSession();
      $result = $this->datenSenden($anmeldung, $interessengebiete);
      if ($result && $this->toolsettings->nlSendAnmeldeInfoMail) {
        $this->sendAnmeldeBenachrichtigung($anmeldung);
      }

      return $result;
    }

    return false;
  }

  
  public function datenSenden($pNlAnmeldung, $pInteressensgebiete)
  {
    $pNlAnmeldung->sessiontime = SessionOperations::getSessionTime();

    $xml = $this->getXMLText($pNlAnmeldung, $pInteressensgebiete);

    $zentralsettings = ToolSettingsAPI::getToolSettings(0);

    $erfolg = false;
    if ($zentralsettings->savemail2file == ANMELDUNGPER_FILE) {
      $erfolg = $this->nlapi->writeToFile($xml, $zentralsettings->emailfilepath);
    } elseif ($zentralsettings->savemail2file == ANMELDUNGPER_MAIL) {
      $allgsettings = AllgSettingsAPI::getAllgSettings();
      $erfolg = $this->nlapi->writeToMail($xml, $allgsettings->emailanm);
    } elseif ($zentralsettings->savemail2file == ANMELDUNGPER_ONLINE) {
      $erfolg = $this->writeToDb($pNlAnmeldung, $pInteressensgebiete);
    } elseif ($zentralsettings->savemail2file == ANMELDUNGPER_DMZ) {
      $erfolg = $this->sendToDmz($pNlAnmeldung, $pInteressensgebiete);
    }
    if ($erfolg && $this->toolsettings->nlSaveBak
       && ($zentralsettings->savemail2file == ANMELDUNGPER_ONLINE || $zentralsettings->savemail2file == ANMELDUNGPER_DMZ)) {
      $this->nlapi->writeToFile($xml, $zentralsettings->emailfilepath, '.nbak');
    }

    return $erfolg;
  }

  
  public function writeToDb($pNlAnmeldung, $pInteressensgebiete)
  {
    $dbNewsl = new DBWorkNewslXml(2);

    return $dbNewsl->doNewsletterAnmeldung($pNlAnmeldung, $pInteressensgebiete);
  }

  
  public function sendToDmz($pNlAnmeldung, $pInteressensgebiete)
  {
    
    $newslxml = NewsletterXml::loadFromNewsletterAnmeldung($pNlAnmeldung);
    $newslxml->gridstatus = -1; 
    
    $newslxml->sessiontime = SessionOperations::getSessionTime();

    $node = XMLNode::getXMLNode($newslxml, 'NewsletterAnmeldung', array(), true);

    if ($newslxml->hasKennzeichen()) {
      $node2 = new XMLNode('Kennzeichen');
      $kennzeichen = $newslxml->getKennzeichen();
      foreach ($kennzeichen as $item) {
        $node2->addChild(XMLNode::getXMLNode($item, 'Kennzeichen', array(), true));
      }
      $node->addChild($node2);
    }

    if (is_array($pInteressensgebiete) && count($pInteressensgebiete) > 0) {
      $node3 = new XMLNode('Interessen');
      foreach ($pInteressensgebiete as $interesse) {
        $n = new XMLNode('Interesse');
        $n->addChild(new XMLNode('kennz', $interesse));
        $node3->addChild($n);
      }
      $node->addChild($node3);
    }

    try {
      $abgleichAPI = new AbgleichAPI();
      $nutzlast = new Nutzlast($node);
      $abgleichAPI->sendeNachricht(AbgleichAPI::ABGLEICH_ANMELDUNGNEWSLETTER, $nutzlast);
    } catch (Exception $e) {
      Logger::logg('Newsletteranmeldung - Folgende Exception ist aufgetreten: ' . $e->getMessage() . ' [' . $e->getTraceAsString() . ']', 200);

      return false;
    }

    return true;
  }

  
  public function getXMLText($pNlAnmeldung, $pInteressensgebiete)
  {
    $xmlNode = new XMLNode('NEWSLETTERANMELDUNGEN');
    $xmlNode->addChild($pNlAnmeldung->getXMLNodeComplete($pInteressensgebiete));

    return '<?xml version="1.0" encoding="' . \CodingOperations::getInternalEncoding() . '" ?' . ">\r\n" . $xmlNode->getXMLstring($xmlNode);
  }

  
  public function showFormular($pAbmeldung = false)
  {
    $sightid = $this->formularSightId;
    if ($pAbmeldung) {
      $sightid = $this->abmeldeSightId;
    }
    
    $result = $this->getSightPart($sightid, WB_SIGHT_PART_HEADER, array(new NewsletterAnmeldung()));
    $result .= $this->getSightPart($sightid, WB_SIGHT_PART_BODY, array(new NewsletterAnmeldung()));
    $result .= $this->getSightPart($sightid, WB_SIGHT_PART_FOOTER, array(new NewsletterAnmeldung()));

    return $result;
  }

  
  public function showTechnischeProbleme()
  {
    return $this->getSightPart($this->formularSightId, WB_SIGHT_PART_NODATA, array(new NewsletterAnmeldung()));
  }

  
  public function showOptinMeldung()
  {
    return $this->getSightPart($this->mailSightId, WB_SIGHT_PART_NOCOLUMN, NlSessionOperations::getNlAnmeldungFromSession());
  }

  
  public function showDankeschoen()
  {
    return $this->getSightPart($this->formularSightId, WB_SIGHT_PART_NOCOLUMN, NlSessionOperations::getNlAnmeldungFromSession());
  }

  
  public function showBestaetigungAbmeldung()
  {
    return $this->getSightPart($this->abmeldeSightId, WB_SIGHT_PART_NOCOLUMN, NlSessionOperations::getNlAnmeldungFromSession());
  }

  
  public function sendAbmeldeMail()
  {
    $mailText = '';
    $nlanmeldung = NlSessionOperations::getNlAnmeldungFromSession();
    if (count($nlanmeldung) > 0) {
      $interessengebiete = NlSessionOperations::getNlInteressengebieteKennzFromSession();
      $mailText .= $this->getSightPart($this->abmeldeSightId, WB_SIGHT_PART_HEADER, $nlanmeldung);
      if (count($interessengebiete) > 0) {
        $dbw = new DBWorkHLNewsletterInteressensgebiete();
        $interessensgebieteFromDB = $dbw->getNewsletterInteressensgebieteByKennz($interessengebiete);
        $mailText .= $this->getSightPart($this->abmeldeSightId, WB_SIGHT_PART_BODY, $interessensgebieteFromDB);
      }
      $mailText .= $this->getSightPart($this->abmeldeSightId, WB_SIGHT_PART_FOOTER, $nlanmeldung);

      $email = new smtpMail();
      $email->SetVar2Value('to', $nlanmeldung[0]->getVarValue('email'));
      $email->SetVar2Value('subject', 'Newsletter-Abmeldung');
      $email->SetVar2Value('contenttype', SMTP_CONTENTTYPE_HTML);
      $email->SetVar2Value('body', $mailText);
      $retour = $email->sendMail();
      if (!$retour) {
        Logger::logg(WB_LOG_PREFIX_NL . 'Fehler beim Versenden der eMail an ' . $nlanmeldung[0]->getVarValue('email'), 50);
      }

      return $retour;
    } else {
      return false;
    }
  }

  
  public function sendOptInMail($pNlAnmeldung = null, $pInteressengebiete = null)
  {
    $mailText = '';
    $nlanmeldung = (!is_null($pNlAnmeldung)) ? $pNlAnmeldung : NlSessionOperations::getNlAnmeldungFromSession();
    if ($this->optinlink != '' && count($nlanmeldung) > 0) {
      $nlanmeldung[0]->optinlink = $this->optinlink;
      $interessengebiete = (!is_null($pInteressengebiete)) ? $pInteressengebiete : NlSessionOperations::getNlInteressengebieteKennzFromSession();
      $mailText .= $this->getSightPart($this->mailSightId, WB_SIGHT_PART_HEADER, $nlanmeldung);
      if (count($interessengebiete) > 0) {
        $dbw = new DBWorkHLNewsletterInteressensgebiete();
        $interessensgebieteFromDB = $dbw->getNewsletterInteressensgebieteByKennz($interessengebiete);
        $mailText .= $this->getSightPart($this->mailSightId, WB_SIGHT_PART_BODY, $interessensgebieteFromDB);
      }
      $mailText .= $this->getSightPart($this->mailSightId, WB_SIGHT_PART_FOOTER, $nlanmeldung);

      $betreff = trim(StringOperations::getBestaetigungSubject($mailText));
      if ($betreff == '') {
        $betreff = 'Newsletter-Anmeldung';
      }

      $body = StringOperations::getBestaetigungBody($mailText);

      $email = new smtpMail();
      $email->SetVar2Value('to', $nlanmeldung[0]->getVarValue('email'));
      $email->SetVar2Value('subject', $betreff);
      $email->SetVar2Value('contenttype', SMTP_CONTENTTYPE_HTML);
      $email->SetVar2Value('body', $body);
      $retour = $email->sendMail();
      if (!$retour) {
        Logger::logg(WB_LOG_PREFIX_NL . 'Fehler beim Versenden der eMail an ' . $nlanmeldung[0]->getVarValue('email'), 50);
      }

      return $retour;
    } else {
      return false;
    }
  }

  
  public function checkPflichtfelder($pAbmeldeformular = false)
  {
    $anmeldung = NlSessionOperations::getNlAnmeldungFromSession();
    if (count($anmeldung) == 1) {
      $anmeldung = $anmeldung[0];
    } else {
      $anmeldung = null;
    }
    $sightid = $this->formularSightId;
    if ($pAbmeldeformular) {
      $sightid = $this->abmeldeSightId;
    }
    $sight = $this->getSight($sightid);
    $check = new WBAnmeldungCheckNewslAnm($anmeldung);
    $check->vorlage = $sight->body;
    $result = $check->check();
    if (!$result) {
      $pflichtfeldFehlerArray = $check->pflichtfeldFehlerArray;
      $formatFehlerArray = $check->formatFehlerArray;
      if (count($pflichtfeldFehlerArray) > 0
          || count($formatFehlerArray) > 0) {
        
        
        
        
        
        if (PostOperations::getVarValue('nl_abmeldung', '--') == '--' && GetOperations::getVarValue('abmeldeformular', '--') != '--') {
          $pflichtfeldFehlerArray = array();
          $formatFehlerArray = array();
        }
        $this->warnungpflichtfelder($pflichtfeldFehlerArray, $formatFehlerArray, $pAbmeldeformular);
      }
    }

    return $result;
  }

  
  protected function warnungpflichtfelder($pPflichtfeldFehlerArray, $pFormatFehlerArray, $pAbmeldeformular = false)
  {
    $this->expAdapter->setFehler($pPflichtfeldFehlerArray, $pFormatFehlerArray);
    $sightid = $this->formularSightId;
    if ($pAbmeldeformular) {
      $sightid = $this->abmeldeSightId;
    }
    $sight = $this->getSight($sightid);
    echo $this->getSightPart($sightid, WB_SIGHT_PART_HEADER, array(new Datamodul()));

    echo '<ul class="warnungpflichtfelder nlanmeldung">';
    foreach ($pPflichtfeldFehlerArray as $varname => $meldung) {
      if ($meldung != '') {
        echo '<li class="warnungpflichtfelder">' . CleanOperations::cleanStringForHtml($meldung) . '</li>';
      }
    }

    
    echo $this->warnungValidierung($pFormatFehlerArray);

    echo '</ul>';
    echo $this->getSightPart($sightid, WB_SIGHT_PART_BODY, NlSessionOperations::getNlAnmeldungFromSession());
    echo $this->getSightPart($sightid, WB_SIGHT_PART_FOOTER, array(new Datamodul()));
  }

  
  protected function warnungValidierung($pFormatFehlerArray)
  {
    $ret = '';
    if (count($pFormatFehlerArray) == 0) {
      return $ret;
    }
    foreach ($pFormatFehlerArray as $key => $value) {
      $ret .= '  <li class="warnungvalidierung">' . CleanOperations::cleanStringForHtml($value) . "</li>\n";
    }

    return $ret;
  }

  protected function getSight($pSightId = '')
  {
    if ($pSightId == '') {
      $pSightId = $this->formularSightId;
    }

    return SightsAPI::getSight($pSightId);
  }

  protected function getSightPart($pSightId, $pSightpart, $pData)
  {
    $sight = $this->getSight($pSightId);
    $this->expAdapter->export->initiate();
    $this->expAdapter->export->exportresults = $pData;
    $this->expAdapter->export->setNrOfMainBodyElements(count($pData));
    switch ($pSightpart) {
      case WB_SIGHT_PART_HEADER:
        $this->expAdapter->filestream = $sight->header;
        break;
      case WB_SIGHT_PART_BODY:
        $this->expAdapter->filestream = $sight->body;
        break;
      case WB_SIGHT_PART_FOOTER:
        $this->expAdapter->filestream = $sight->footer;
        break;
      case WB_SIGHT_PART_NOCOLUMN:
        $this->expAdapter->filestream = $sight->nocolumn;
        break;
      case WB_SIGHT_PART_NODATA:
        $this->expAdapter->filestream = $sight->nodata;
        break;
    }
    $this->expAdapter->replaceVarNames();
    if (count($this->expAdapter->resultlist) > 0) {
      return implode("\n", $this->expAdapter->resultlist);
    } else {
      return '';
    }
  }

  public function getNlAnmeldungFromRequest2Session()
  {
    NlSessionOperations::getNlAnmeldungFromRequest2Session();
    NlSessionOperations::getNlInteressengebieteFromRequest2Session();
  }
}