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




class DataMenuLoginRegistrierung extends DataMenuMain
{
  private $prefix = 'wbl_';
  private $optinlink = '';
  protected $varsPflicht = array();
  protected $varsValidierung = array();
  protected $dublettenAlgorithmus = TeilnehmerAPI::ALGORITHM_DUBLETTE_SIMPEL;
  protected $kathaupt;

  public function __construct($pUrlparameter)
  {
    parent::__construct($pUrlparameter);
    $this->exportadapter = new ExpDblOptin();
    $this->exportadapter->setSightInfo('status', '');
    $this->kathaupt = 266;
  }

  public function _getClickPath($pName = 'Teilnehmer-Login - Registrierung')
  {
    $this->_setStdClickPath($pName, 'clickKundenRegistrierung');

    return $this->clickpfad;
  }

  public function mainmenu()
  {
    if ($this->toolsettings->showClickpfad) {
      echo $this->getClickPath();
    }
    echo '<div class="hauptseite_ohnestatus">' . "\n" . $this->getContentAnker();

    $this->internerContent();

    echo '</div>';
  }

  private function isAdditionalClickActivated()
  {
    $settings = ToolSettingsAPI::getToolSettings(0);
    if ($settings->getVarValue('stammhoererOptinAdditionalClick')) {
      return true;
    }

    return false;
  }

  private function isAdditionalClickStep1()
  {
    if ($this->isAdditionalClickActivated() && (!isset($this->urlparameter->schritt) || $this->urlparameter->schritt != 2)) {
      return true;
    }

    return false;
  }

  public function internerContent()
  {
    $this->getsight();

    if (!$this->istZugriffErlaubt()) {
      $this->showAccessDenied();
    } else {
      if ($this->isRegistrierung()) {
        $this->handleRegistrierung();
      } else {
        if ($this->is2ndStep()) {
          
          
          if (!$this->isAdditionalClickStep1()) {
            
            try {
              $dbloptin = $this->handle2ndStep(
                GetOperations::getVarValue('key', '--'),
                GetOperations::getVarValue('hash', '--')
              );

              $this->doWbLogin($this->getLoginValue($dbloptin));
              $this->addStatus('Ihr Login wurde erfolgreich registriert.', 'success');
            } catch (ExpiredException $e) {
              $this->addStatus('Ihr Aktivierungslink ist nicht mehr gültig. Bitte fordern Sie ein neues Login an und beachten Sie, dass die Aktivierungslinks nur für eine begrenzte Zeit gültig sind.', 'error');
            } catch (Exception $e) {
              $this->addStatus('Ihr Login konnte nicht registriert werden. Bitte versuchen Sie es später erneut.', 'error');
            }
          }
        } 
        
        
        
        if (SessionOperations::isStammhoererLoggedIn()) {
          $this->showStammhoererLoginOrForward();
        } elseif ($this->is2ndStep() && $this->isAdditionalClickStep1()) {
          $this->dataarrayheader = array('');
          $urlhelper = URL::loadCurrent();
          $url = $urlhelper->getUrlFull(true, true, false);
          $schritt = '';
          if (WORDPRESS_CMS_USED) {
            $url = str_replace('usertools.php', '', $url);
            $schritt = 'schritt/2';
          } else {
            $schritt = '&schritt=2';
          }
          $this->exportadapter->setSightInfo('currenturl', $url);
          $this->exportadapter->setSightInfo('urlregister', $url . $schritt);
          $this->showsightcomplete(610, $this->exportadapter);
        } else {
          
          $this->showFormular();
        }
      }
    }
  }

  

  
  protected function getLoginValue($pDbloptin)
  {
    return $pDbloptin->email;
  }

  
  protected function showStammhoererLoginOrForward()
  {
    if (DBWorkBASysSettings::isInnsbruckStadt()) {

      
      if (!LoginApi::checkIfTeilnBedingungenAccepted()) {
        if (TYPO3_CMS_USED) {
          $id = CleanOperations::cleanStringForHtml(GetOperations::getVarValue('id'));
          $zielurl = INDEXSCRIPT . '?id=' . $id . '&kathaupt=257';
        } else {
          $zielurl = INDEXSCRIPT . '?kathaupt=257';
        }
        header('Location:' . $zielurl);
      }

      
      else {
        $this->showWillkommen();
      }
    } elseif (DBWorkBASysSettings::isKornwestheimEbz()) {
      $id = CleanOperations::cleanStringForHtml(GetOperations::getVarValue('id'));
      $zielurl = INDEXSCRIPT . '?id=' . $id . '&kathaupt=668';
      header('Location:' . $zielurl);
    } else {
      $this->showWillkommen();
    }
  }

  

  protected function istZugriffErlaubt()
  {
    return BASysSettingsAPI::isSwitchSet(SCHALTER_LOGIN_REGISTRIERUNG_PER_DMZ);
  }

  protected function showAccessDenied()
  {
    echo '<div>Diese Funktion ist nicht freigeschaltet.</div>';
  }

  protected function isRegistrierung()
  {
    return PostOperations::getVarValue('wbl_register', '--') != '--';
  }

  protected function doWbLogin($pLoginKennung)
  {
    $dbw = new DBWorkWBLogins();
    $wblogin = $dbw->getByLogin($pLoginKennung);
    $wblogin = LoginApi::getWbLogin($wblogin); 
    
    SessionOperations::getWBLoginToSession($wblogin);
  }

  
  protected function addStatus($pMessage, $pStatus = 'neutral')
  {
    $cssClass = 'wbl_status bv_status wbl_' . $pStatus . ' bv_' . $pStatus;
    $message = '<div class="' . $cssClass . '">' . $pMessage . '</div>';
    $this->exportadapter->addSightInfo('status', $message);
  }

  protected function handleRegistrierung()
  {
    if ($this->checkVoraussetzungenRegistrierung()) {
      if ($this->prepareDblOptin()) {
        Logger::logg('dbloptin prepared', 1);
        $this->showDblOptinMailVersendet();
      } else {
        
        $this->showTechnischeProbleme();
      }
    } else {
      $this->showFailureFormular();
    }
  }

  protected function checkVoraussetzungenRegistrierung()
  {
    $verbindungOk = $this->checkVoraussetzungenInfrastruktur();
    if ($verbindungOk === true) {
      $this->varsPflicht = $this->checkRegistrierungParameterPflichtfelder();
      $this->varsValidierung = $this->checkRegistrierungParameterValidierung();
    } else {
      $this->varsPflicht = array('verbindung' => $verbindungOk);
      $this->varsValidierung = array();
    }

    return (count($this->varsPflicht) == 0 && count($this->varsValidierung) == 0);
  }

  
  protected function checkVoraussetzungenInfrastruktur()
  {
    if (SessionOperations::isDmzBetrieb()) {
      try {
        $abgleichapi = new AbgleichAPI();
        $nutzlast = new Nutzlast('Ping');
        $abgleichapi->sendeNachricht(AbgleichAPI::ABGLEICH_PING, $nutzlast);

        return true;
      } catch (Exception $e) {
        Logger::logg(WB_LOG_PREFIX_STAMMHOERER . ' DMZ nicht erreichbar: ' . $e->getMessage(), 55);

        return 'Dieser Dienst steht momentan nicht zur Verfügung';
      }
    } else {
      Logger::logg(WB_LOG_PREFIX_STAMMHOERER . ' DMZ ist nicht aktiviert, das ist aber Voraussetzung für Stammhoerer-Registrierung.', 55);

      return 'In dieser Konfiguration ist die Registrierung nicht m&ouml;glich.';
    }
  }

  protected function showFailureFormular()
  {
    $this->exportadapter->setFehler($this->varsPflicht, $this->varsValidierung);
    $failures = array_merge($this->varsPflicht, $this->varsValidierung);
    

    if (count($failures) > 0) {
      $settings = ToolSettingsAPI::getToolSettings(0);
      if (!$settings->wbSichereStatusmeldungenDeaktivieren) {
        $failures = array('allgemein' => 'Die Registrierung war nicht erfolgreich. Bitte überprüfen Sie Ihre Eingaben oder versuchen Sie es später erneut.');
      }
      $message = $this->formatMessage($failures);
      $this->exportadapter->setSightInfo('status', $message);
    }

    
    

    $dblOptin = $this->getDblOptin();
    $this->showFormular($dblOptin);
  }

  protected function formatMessage($pVars)
  {
    
    $result = '<div class="warnungpflichtfelder wbl_register"><ul class="warnungpflichtfelder wbl_register"> ';

    $tool0Settings = ToolSettingsAPI::getToolSettings(0);
    $varsWithoutMessage = array();
    if (!$tool0Settings->stammhoererLoginStatusAusfuehrlich) {
      $varsWithoutMessage = array('pwvoraussetzungen', 'pw', 'pwungleich');
    }
    foreach ($pVars as $key => $var) {
      if (!in_array($key, $varsWithoutMessage)) {
        $additionalattrs = StringOperations::stripos($var, 'passw') !== false && StringOperations::stripos($var, 'login') === false ? ' class="pw-err"' : ''; 
        $result .= "<li{$additionalattrs}>" . $var . '</li>';
      }
    }
    $result .= '</ul></div>';

    return $result;
  }

  protected function is2ndStep()
  {
    return (GetOperations::getVarValue('key', '--') != '--'
            && GetOperations::getVarValue('hash', '--') != '--');
  }

  private function handle2ndStep($pKey, $pHash)
  {
    Logger::logg('in 2ndstep', 1);
    $dbwork = new DBWorkDblOptinStammhoererRegistrierung(1, true);
    $dbloptin = $dbwork->getDblOptinByOptin($pKey);

    if ($dbloptin == null || $dbloptin->getVarValue('emailhash') != $pHash) {
      Logger::logg(WB_LOG_PREFIX_STAMMHOERER . "Fehler beim zweiten Schritt - optin passt nicht zu Mailhash: $pKey, $pHash / kein passender Eintrag gefunden (mehrfach aufgerufen?)", 50);

      throw new Exception('Stammhörerlogin: Double-Optin: Optin wurde nicht gefunden');
    }

    if ($this->isDoubleOptInExpired($dbloptin)) {
      Logger::logg(WB_LOG_PREFIX_STAMMHOERER . "Fehler beim zweiten Schritt - Double-Optin ist nicht mehr gültig. Erstelldatum: $dbloptin->bearbdatum", 50);

      throw new ExpiredException('Stammhörerlogin: Double-Optin ist nicht mehr gültig');
    }

    if (!StammhoererAPI::isLoginUnique($this->getLoginValue($dbloptin))) {
      Logger::logg(WB_LOG_PREFIX_STAMMHOERER . "Fehler beim zweiten Schritt - Login ist schon vergeben: $dbloptin->email", 50);

      throw new Exception('Stammhörerlogin: Double-Optin: Login ist bereits vergeben');
    }

    $stammhAngelegt = $this->checkDublettenAndDoInserts($dbloptin);

    if ($stammhAngelegt) {
      $dbwork->deleteByOptin($pKey);

      return $dbloptin;
    } else {
      throw new Exception('Stammhörerlogin: Fehler beim Anlegen des Stammhörers');
    }
  }

  
  private function isDoubleOptInExpired($dbloptin)
  {
    $tool0Settings = ToolSettingsAPI::getToolSettings(0);
    if (is_numeric($tool0Settings->stammhoererRegistrierungOptinExpires) && $tool0Settings->stammhoererRegistrierungOptinExpires > 0) {
      $dtExpired = new DateTimeObj(DateTimeOperations::getDateTimeNow());
      $dtExpired->addHours(-1 * $tool0Settings->stammhoererRegistrierungOptinExpires);

      $dtBearbdatum = new DateTimeObj($dbloptin->bearbdatum);

      return $dtBearbdatum->compare($dtExpired) <= 0;
    }

    return false;
  }

  protected function isLoginUnique($pDbloptin)
  {
    return StammhoererAPI::isLoginUnique($pDbloptin->email);
  }

  protected function checkDublettenAndDoInserts($pDbloptin)
  {
    $tnObject = $this->getTeilnehmerFromDbloptin($pDbloptin);
    $tnIdAufOriginalDb = false;
    try {
      $tnIdAry = TeilnehmerAPI::isDublette($tnObject, $this->dublettenAlgorithmus);
      if ($tnIdAry == false) { 
        $tnIdAufOriginalDb = false;
      } else {
        $tnIdAufOriginalDb = $tnIdAry['sqlid'];
        
      }
    } catch (Exception $e) {
      Logger::logg($e->getMessage(), 200);
      die('Ein Fehler ist aufgetreten - es konnte kein Dublettenprüfung auf der Original-DB durchgeführt werden');
    }

    $tnAufOriginalDbAngelegt = false;
    if (false === $tnIdAufOriginalDb) {
      Logger::logg(__CLASS__ . 'if zweig', 1);

      try {
        $tnIds = $this->insertTeilnehmerDMZ($tnObject);
        $tnIdAufReplikatDb = $tnIds['replikatid'];
        $tnIdAufOriginalDb = $tnIds['sqlid'];
        $tnAufOriginalDbAngelegt = true;
        
      } catch (Exception $e) {
        Logger::logg($e->getMessage(), 200);
        die('Ein Fehler ist aufgetreten - es konnte kein Teilnehmerdatensatz auf der Original-DB angelegt werden');
      }
    } else {
      if (!is_numeric($tnIdAufOriginalDb)) {
        Logger::logg("Beim StammhörerLogin registrieren: Wahrscheinlich ist die DMZ nicht aktiviert! $tnIdAufOriginalDb", 49);

        return false;
      }
      Logger::logg(__CLASS__ . 'else zweig', 1);
      
    }
    $stammhAngelegt = $this->stammhoererAnlegen($pDbloptin, $tnIdAufOriginalDb);

    if (!$stammhAngelegt && $tnAufOriginalDbAngelegt) {
      
      TeilnehmerAPI::deleteTeilnehmer($tnIdAufOriginalDb, true);
    }

    return $stammhAngelegt;
  }

  protected function getTeilnehmerFromDbloptin($pDbloptin)
  {
    $tnObject = new Teilnehmer();
    $tnObject->setValue2Var('name', $pDbloptin->name);
    $tnObject->setValue2Var('vorname', $pDbloptin->vorname);
    $tnObject->setValue2Var('email', $pDbloptin->email);
    $tnObject->setValue2Var('email_anzeige', $pDbloptin->email);
    $tnObject->setValue2Var('gebdat', $pDbloptin->gebdat);
    if (DateTimeOperations::isValidDate($pDbloptin->gebdat)) {
      $tnObject->gebjahr = DateTimeOperations::getYear($pDbloptin->gebdat);
    }
    if (!DateTimeOperations::isDateTimeEmptyOrDefault($pDbloptin->dse_unterschrieben_datum)) {
      $tnObject->setValue2Var('dse_unterschrieben_datum', $pDbloptin->dse_unterschrieben_datum);
      $tnObject->setValue2Var('dse_unterschrieben_weg', ConstantOperations::getWegForDseUnterschriebenWeg());
    }

    $tnObject->setValue2Var('ort', $pDbloptin->ort);
    $tnObject->setValue2Var('strasse', $pDbloptin->strasse);
    $tnObject->setValue2Var('tel', $pDbloptin->tel);
    $tnObject->setValue2Var('tel2', $pDbloptin->tel2);
    $tnObject->setValue2Var('mobil', $pDbloptin->mobil);
    $tnObject->setValue2Var('name_titel', $pDbloptin->name_titel);
    $tnObject->setValue2Var('sozarbeitgeber', $pDbloptin->sozarbeitgeber);
    $tnObject->setValue2Var('geschlecht', $pDbloptin->geschlecht);

    return $tnObject;
  }

  protected function insertTeilnehmerDMZ($pTnObject)
  {
    $kennzeichen = array();
    $changedFields = array('name', 'vorname', 'email', 'email_anzeige', 'dse_unterschrieben_datum',
        'dse_unterschrieben_weg', 'gebdat', 'gebjahr', 'ort', 'strasse', 'geschlecht',
        'name_titel', 'sozarbeitgeber', 'tel_anzeige', 'tel2_anzeige', 'mobil_anzeige');
    $tool0Settings = ToolSettingsAPI::getToolSettings(0);

    $kennzeichennummer = $tool0Settings->getVarValue('stammhoererKennzeichenZuordnen');

    if (is_numeric($kennzeichennummer)) {
      $dbwKennz = DBWorkKennz::getDefaultInstance();
      if (count($dbwKennz->getByKennz(array($kennzeichennummer)))) {
        $kennzeichen[] = $tool0Settings->getVarValue('stammhoererKennzeichenZuordnen');
      }
    }

    return TeilnehmerAPI::insertTeilnehmer4DMZ(
      $pTnObject,
      $kennzeichen,
      array(),
      $changedFields,
      AbgleichAPI::ABGLEICH_TEILNEHMER,
      true
    );
  }

  protected function stammhoererAnlegenGesamteKommunikationOk($pTnIdAufOriginalDb, $pNameMssql, $pNameDblOptin, $pVornameMssql, $pVornameDblOptin, $pEmailDblOptin)
  {
    if (trim(StringOperations::strtolower($pNameMssql)) === trim(StringOperations::strtolower($pNameDblOptin))
          && trim(StringOperations::strtolower($pVornameMssql)) === trim(StringOperations::strtolower($pVornameDblOptin))) {
      $komms = KommunikationsAPI::getKommunikationInfosPerDMZ($pTnIdAufOriginalDb);
      foreach ($komms as $komm) {
        if ($komm->Art == 'E' && trim(StringOperations::strtolower($komm->Wert)) == trim(StringOperations::strtolower($pEmailDblOptin))) {
          return true;
        }
      }
    }

    return false;
  }

  protected function stammhoererAnlegen($pDblOptin, $pTnIdAufOriginalDb)
  {
    
    $dbwWBP = new DBWorkWBLoginsPasswords();
    $dbwWBP->deleteUnusedPassword($pDblOptin->email);

    
    try {
      $tnMssql = TeilnehmerAPI::getTeilnehmerInfosPerDMZ($pTnIdAufOriginalDb);
      $ok = trim(StringOperations::strtolower($tnMssql->name)) === trim(StringOperations::strtolower($pDblOptin->name))
              && trim(StringOperations::strtolower($tnMssql->vorname)) === trim(StringOperations::strtolower($pDblOptin->vorname))
              && trim(StringOperations::strtolower($tnMssql->email_anzeige)) === trim(StringOperations::strtolower($pDblOptin->email));
      if (DBWorkWBLogins::existiertLogin($pDblOptin->email)) {
        Logger::logg('Nach Klick auf den Double-Optin-Link wurde bei der Stammhörerregistrierung festgestellt, dass potentiell ein falscher Stammhörer (' . $pDblOptin->email . ')
          zugeordnet worden ist, sodass die Registrierung sicherheitshalber verhindert wurde.', 41);

        return false;
      }
      if (!$ok) {
        if (!$this->stammhoererAnlegenGesamteKommunikationOk($pTnIdAufOriginalDb, $tnMssql->name, $pDblOptin->name, $tnMssql->vorname, $pDblOptin->vorname, $pDblOptin->email)) {
          $msg = "Problem bei Stammhoerer-Registrierung: Teilnehmerdaten konnten nicht mit vermeintlicher Tnr (KuferSQL: $pTnIdAufOriginalDb)"
                  . ' aus KuferSQL DB gelesen werden - schlechter Übertragungszeitpunkt?!'
                  . 'KuferSQL: ' . $tnMssql->vorname . ' ' . $tnMssql->name . ' ' . $tnMssql->email_anzeige . ' <> MySQL: ' . $pDblOptin->vorname . ' ' . $pDblOptin->name . ' ' . $pDblOptin->email;
          Logger::logg($msg, 8010);

          return false;
        }
      }
    } catch (Exception $e) {
      $msg = "Problem bei Stammhoerer-Registrierung: Teilnehmerdaten konnten nicht mit vermeintlicher Tnr (KuferSQL: $pTnIdAufOriginalDb)"
                . ' aus KuferSQL DB gelesen werden - kein Datensatz gefunden (wblogin: ' . $pDblOptin->vorname . ' ' . $pDblOptin->name . ' ' . $pDblOptin->email;
      Logger::logg($msg, 8014);

      return false;
    }
    $wblogin = $this->dblOptinToStammhoerer($pDblOptin);
    $wblogin->tnr = $pTnIdAufOriginalDb;

    return StammhoererAPI::insertStammhoerer($wblogin);
  }

  protected function dblOptinToStammhoerer($pDblOptin)
  {
    $wblogin = new WBLogin();
    $wblogin->login = $pDblOptin->email;
    $translateValues = array('email' => 'email', 'name' => 'name', 'vorname' => 'vorname', 'passwort' => 'password', 'salt' => 'salt',
        'dse_unterschrieben_datum' => 'dse_unterschrieben_datum', 'gebdat' => 'gebdatum', 'geschlecht' => 'geschlecht', 'hashversion' => 'hashversion');
    foreach ($translateValues as $fromName => $toName) {
      $wblogin->{$toName} = $pDblOptin->{$fromName};
    }
    if (DateTimeOperations::isValidDate($pDblOptin->gebdat)) {
      $wblogin->gebjahr = DateTimeOperations::getYear($pDblOptin->gebdat);
    }

    return $wblogin;
  }

  protected function showFormular($pDblOptin = '')
  {
    if (!$pDblOptin instanceof WebDblOptin) {
      $pDblOptin = new Datamodul();
    }
    echo $this->getSightPart($this->sight->id, WB_SIGHT_PART_HEADER, array($pDblOptin));
  }

  protected function showWillkommen()
  {
    $this->setSichtvariablenPwVoraussetzungen();
    echo $this->getSightPart($this->sight->id, WB_SIGHT_PART_NOCOLUMN, array(new Datamodul()));
  }

  private function showDblOptinMailVersendet()
  {
    echo $this->getSightPart($this->sight->id, WB_SIGHT_PART_FOOTER, array(new Datamodul()));
  }

  private function showTechnischeProbleme()
  {
    echo $this->getSightPart($this->sight->id, WB_SIGHT_PART_NODATA, array(new Datamodul()));
  }

  
  protected function checkRegistrierungParameterPflichtfelder()
  {
    $result = array();
    $tocheck = array('name', 'vorname', 'email', 'newpw1', 'newpw2');
    $vorlage = $this->sight->header;
    $pflichtFelderAusSicht = StringOperations::getPflichtFelder('dbloptinedit', $vorlage);

    
    
    $moeglichePflichtfelder = array('email2', 'pflicht', 'gebdat');
    foreach ($moeglichePflichtfelder as $moeglichesPflichtfeld) {
      if (array_key_exists($moeglichesPflichtfeld, $pflichtFelderAusSicht)) {
        $tocheck[] = $moeglichesPflichtfeld;
      }
    }

    $meldungen = array('name' => 'Name', 'vorname' => 'Vorname', 'email' => 'E-Mail',
        'newpw1' => 'Passwort', 'newpw2' => 'Passwort wiederholen',
        'pw' => 'Die angegebenen Passwörter stimmen nicht überein.',
        'pwvoraussetzungen' => 'Das Passwort erfüllt die Voraussetzungen nicht.',
        'email2' => 'Die wiederholte E-Mail wurde nicht angegeben.',
        'email2ungleich' => 'Die wiederholte E-Mail stimmt nicht mit dem Original überein.',
        'pflicht' => 'Das weitere Pflichtfeld wurde nicht aktiviert.',
        'gebdat' => 'Das Geburtsdatum wurde nicht angegeben.',
        'dmzfehler' => 'Es traten technische Probleme auf, bitte versuchen Sie es später erneut.',
        'vergeben' => 'Dieses Login ist bereits vergeben - fordern Sie doch ein neues Passwort an.',
        'captcha' => 'Das Captcha schlug fehl - der Server denkt, dass Sie kein Mensch sind.');

    $ergebnis = StammhoererAPI::isLoginUniqueMessage($this->getPostVar('email'));
    if ($ergebnis != 'ok' && $ergebnis != false) {
      $result[$ergebnis] = $meldungen[$ergebnis];
    }

    
    foreach ($tocheck as $var) {
      if (trim($this->getPostVar($var)) === '') {
        $result[$var] = $meldungen[$var];
      }
    }

    if ($this->getPostVar('newpw1') != $this->getPostVar('newpw2')) {
      $result['pwungleich'] = $meldungen['pw'];
    }

    if (in_array('email2', $tocheck) && $this->getPostVar('email') != $this->getPostVar('email2')) {
      $result['email2ungleich'] = $meldungen['email2ungleich'];
    }

    if (array_key_exists('captcha', $pflichtFelderAusSicht)) {
      $capi = \Kufer\Web\Classes\Captchas\CaptchaFactory::getCaptcha4KuferWEB();
      if (!$capi->isValid(null, true, 'dbloptinedit')) {
        
        $m = StringOperations::getPflichtfeldFehlerMeldung('captcha', $vorlage);
        if ($m != '') {
          $result['captcha'] = $m;
        } else {
          $result['captcha'] = $meldungen['captcha'];
        }
      }
    }

    return $result;
  }

  protected function checkRegistrierungParameterValidierung()
  {
    $result = array();

    $meldungen = array('email' => 'E-Mail', 'name' => 'Name', 'vorname' => 'Vorname',
        'pwvoraussetzungen' => 'Das Passwort erfüllt die Voraussetzungen nicht.',
        'gebdat_alter' => 'Das Mindestalter zur Beantragung eines Logins ist 18 Jahre.',
        'gebdat_format' => 'Bitte geben Sie beim Geburtsdatum ein gültiges Geburtsdatum im Format TT.MM.JJJJ an.');

    
    $mail = trim($this->getPostVar('email'));
    if ($mail !== '') {
      $validator = ValidierungWB::getInstance();
      if ($validator->isValidVar('email', $mail) !== true) {
        $result['email'] = $meldungen['email'];
      }
      if (DBWorkWBLogins::existiertLogin($mail)) {
        $result['email'] = $meldungen['email'];
        Logger::logg('E-Mailadresse des Stammhörers (' . $mail . ') existiert bereits in web_wblogins (MySQL). Folglich wurde eine potentiell falsche Zuordnung des Stammhörers 
          durch Abbruch der Registrierung verhindert.', 40);
      }
    }

    $result = $this->standardValidierung('name', $result, $meldungen);
    $result = $this->standardValidierung('vorname', $result, $meldungen);

    $pwdop = new PasswordOperations();
    if (!$pwdop->isValid($this->getPostVar('newpw1'))) {
      $result['pwvoraussetzungen'] = $meldungen['pwvoraussetzungen'];
    }

    
    $gebdat = trim($this->getPostVar('gebdat'));
    if ($gebdat !== '') {
      $dtop = new DateTimeOperations();
      if ($dtop->isValidDate($gebdat)) {
        $alter = $dtop->computeAge($gebdat);
        if ($alter < 18) {
          $result['gebdat'] = $meldungen['gebdat_alter'];
        }
      } else {
        $result['gebdat'] = $meldungen['gebdat_format'];
      }
    }

    return $result;
  }

  protected function standardValidierung($varname, $result, $meldungen)
  {
    $val = trim($this->getPostVar($varname));
    if ($val !== '') {
      $validator = ValidierungWB::getInstance();
      if ($validator->isValidVar($varname, $val) !== true) {
        $result[$varname] = $meldungen[$varname];
      }
    }

    return $result;
  }

  protected function getPostVar($pVarname, $pDefault = '')
  {
    return PostOperations::getVarValue($this->prefix . $pVarname, $pDefault);
  }

  public function getsight($sightid = 482)
  {
    parent::getsight($sightid);
  }

  private function prepareDblOptin()
  {
    $dbloptin = $this->getDblOptin();

    
    $dbwork = new DBWorkDblOptinStammhoererRegistrierung(1, true);
    $optincode = $dbwork->saveDblOptin($dbloptin);

    $this->setOptinLink($dbloptin, $optincode);
    $dbloptin->optinlink = $this->optinlink;

    
    $result = $this->sendOptInMail($dbloptin);

    if (!$result) {
      $dbwork->deleteByOptin($optincode);
    }

    return $result;
  }

  private function setOptinLink($pDbloptin, $pOptincode)
  {
    $hash = md5($pDbloptin->getVarValue('email'));

    if (!WORDPRESS_CMS_USED) {
      $this->optinlink = $this->getTypo3OptinLink($hash, $pOptincode);
    } else {
      $this->optinlink = $this->getWordpressOptinLink($hash, $pOptincode);
    }
    $this->optinlink = trim($this->optinlink);
  }

  private function getWordpressOptinLink($phash, $pOptincode)
  {
    $commonPart = "key/$pOptincode/hash/$phash";
    $url = URL::loadCurrent();
    $optinlink = $url->getUrlFull(false, false, false);

    return str_replace('usertools.php', $commonPart, $optinlink);
  }

  private function getTypo3OptinLink($phash, $pOptincode)
  {
    $t3id = GetOperations::getVarValue('id', '');
    if ($t3id != '') {
      $t3id = "&id=$t3id";
    }
    $commonPart = '?kathaupt=' . $this->kathaupt . "&key=$pOptincode&hash=$phash";
    if (SERVER_PFAD != '') {
      $optinlink = SERVER_PFAD . $commonPart . $t3id;
    } else {
      $optinlink = StringOperations::getCompleteUrlToSkript() . $commonPart . $t3id;
    }

    return $optinlink;
  }

  protected function getDblOptin()
  {
    $optin = new WebDblOptin();
    $optin->feature = WebDblOptin::FEATURE_STAMMHOERER_REGISTRIERUNG;
    $optin->name = trim($this->getPostVar('name'));
    $optin->vorname = trim($this->getPostVar('vorname'));
    $optin->email = $this->getPostVar('email');
    $optin->status = 'R'; 
    $optin->salt = SecurityOperations::generateSalt();
    $algorithmus = \PasswordFactory::getLatestKuferWeb($optin->salt);
    $optin->hashversion = $algorithmus->getHashversion();
    if ($algorithmus->getHashversion() != PasswordHashWindows1252SaltedMD5::getHashversion()) {
      $optin->salt = '';
    }
    $optin->passwort = $algorithmus->getHash($this->getPostVar('newpw1'));
    $dtop = new DateTimeOperations();
    $optin->bearbdatum = $dtop->getDateTimeNow();
    $dse = $this->getPostVar('dse');
    if ($dse) {
      $optin->dse_unterschrieben_datum = DateTimeOperations::getDateTimeNow();
    }
    $gebdat = $this->getPostVar('gebdat');
    if (DateTimeOperations::isValidDate($gebdat)) {
      $optin->gebdat = $gebdat;
    }

    return $optin;
  }

  
  public function sendOptInMail($pDbloptin)
  {
    if ($this->optinlink != '' && !$pDbloptin->isEmpty()) {
      $tmpExpAdapter = $this->exportadapter;
      $this->exportadapter = new ExpTeilnehmer();
      $mailText = $this->getSightPart($this->sight->id, WB_SIGHT_PART_BODY, array($pDbloptin));
      $subject = StringOperations::getBestaetigungSubject($mailText);
      $mailText = StringOperations::getBestaetigungBody($mailText);
      $this->exportadapter = $tmpExpAdapter;

      $email = new smtpMail();
      $email->SetVar2Value('to', $pDbloptin->getVarValue('email'));
      $email->SetVar2Value('subject', html_entity_decode($subject, ENT_COMPAT | ENT_HTML5, 'cp1252'));
      $email->SetVar2Value('contenttype', SMTP_CONTENTTYPE_HTML);
      $email->SetVar2Value('body', $mailText);
      $retour = $email->sendMail();
      if (!$retour) {
        Logger::logg(WB_LOG_PREFIX_STAMMHOERER . 'Fehler beim Versenden der eMail an ' . $pDbloptin->getVarValue('email'), 50);
      } else {
        Logger::logg('dbloptin mail sent (stammh)', 1);
      }

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