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


class Doz1grafik extends DruckGrafik
{
  
  public $zellwidth;

  
  public $zellheight;

  
  public $kurszellende;

  public function getListID()
  {
    return 15;
  }

  

  public function getListTyp()
  {
    return '13';
  }

  

  public function loadFactoryDefaults()
  {
    parent::loadFactoryDefaults();
    
    $this->setTitle1();
  }

  

  public function setTitle1()
  {
    $this->settings->title1 = 'tagesorientierte grafische Übersicht';
  }

  

  public function getDruckbereichEnabled($optionName)
  {
    
    switch ($optionName) {
      case 'querformat':
        return true;
    }

    return false;
  }

  

  
  public function _getFontSize4Times($zellweite)
  {
    $fontsize = 8;
    if ($zellweite > 3) {
      $fontsize = 9;
    } elseif ($zellweite < 1) {
      $fontsize = 2;
    } elseif ($zellweite < 1.5) {
      $fontsize = 4;
    } elseif ($zellweite < 2.0) {
      $fontsize = 5;
    } elseif ($zellweite < 2.5) {
      $fontsize = 7;
    }

    return $fontsize;
  }

  

  
  public function _prepare($pKnr = '')
  {
    parent::_prepare($pKnr);

    
    $this->zellheight = 13;

    
    
    $spaltenzahl = $this->zeitSpanne($this->settings->zeitbereich->zeitvon, $this->settings->zeitbereich->zeitbis, $this->settings->zeitbereich->zeitspanne);
    
    $tabellenbreite = 80;
    
    $tabelledrueber = (ceil($spaltenzahl) - $spaltenzahl) * $tabellenbreite / $spaltenzahl;
    
    $this->zellwidth = ($tabellenbreite + $tabelledrueber) / ceil($spaltenzahl);

    $this->kurszellende = 0;
  }

  

  
  protected function _printDruckListe($pKurs = '')
  {
    $this->_printTabellenKopf();
    
    
    $anzahlkurstage = $this->getAnzTage($this->kurstage->von, $this->kurstage->bis);

    
    for ($i = 0;$i < $anzahlkurstage;$i++) {
      $this->_printKursCell($this->dtop->getNextDate($this->kurstage->von, $i));
      $this->kurszellende = 0;
    }

    $this->_printFarbLegende();
  }

  

  private function _printTabellenKopf()
  {
    
    $zeitbereich_beginn = $this->settings->zeitbereich->zeitvon;
    $zeitbereich_ende = $this->settings->zeitbereich->zeitbis;


    
    $jetztzeit = $zeitbereich_beginn;

    
    $spaltenzahl = $this->zeitSpanne($zeitbereich_beginn, $zeitbereich_ende, $this->settings->zeitbereich->zeitspanne);

    $this->pdf->ln(-$this->height);
    
    $this->setFillColor4Border();	
    $this->pdf->CellAtX('3%', '', '', '', '', '7.5%', 0, 2 * $this->height, 0);
    $this->pdf->ln(0.5 * $this->height);
    $this->pdf->CellAtX('3%', $zeitbereich_beginn . '-' . $zeitbereich_ende, 'B', '', 7, '7.5%', 0, $this->height, 0);
    $this->pdf->ln(-0.5 * $this->height);

    
    for ($i = 0;$i < $spaltenzahl;$i++) {
      
      $nextzeitobj = $this->zeitPlusZeit($jetztzeit, $this->settings->zeitbereich->zeitspanne);
      $zellebeginn = $i * $this->zellwidth + 10.5;

      
      if ($this->zeitSpanne($jetztzeit, $zeitbereich_ende, $this->settings->zeitbereich->zeitspanne) < 1 || ($nextzeitobj->ueberlauf == 1)) {
        
        $zellweite = $this->zellwidth * $this->zeitSpanne($jetztzeit, $zeitbereich_ende, $this->settings->zeitbereich->zeitspanne);
        $nextzeit = $zeitbereich_ende;
      }
      else {
        
        
        $zellweite = $this->zellwidth; 
        $nextzeit = $nextzeitobj->zeitsumme;
      }

      //++++++++++++++ oberste Zeile mit den Zeitwerten ++++++++++++++++++++
      
      if ($zellweite < 0.68) {
        $this->pdf->CellAtX($zellebeginn . '%', '', '', '', '', $zellweite . '%', 1, 2 * $this->height, 1);
      }
      
      elseif ($zellweite < 3) {
        $this->pdf->CellAtX($zellebeginn . '%', '', '', '', '', $zellweite . '%', 1, 2 * $this->height, 1);
        
        $this->pdf->CellAtX($zellebeginn . '%', StringOperations::substr($jetztzeit, 0, 3), 'B', '', $this->_getFontSize4Times($zellweite), $zellweite . '%', 1, 2 * $this->height, 1);
        $this->pdf->ln(3);
        
        $this->pdf->CellAtX($zellebeginn . '%', StringOperations::substr($jetztzeit, 3, 2), 'B', '', $this->_getFontSize4Times($zellweite), $zellweite . '%', 0, $this->height, 0);
        $this->pdf->ln(-3);
      }
      
      else {
        $this->pdf->CellAtX($zellebeginn . '%', '', '', '', '', $zellweite . '%', 1, 2 * $this->height, 1);
        $this->pdf->ln(2.5);
        $this->pdf->CellAtX($zellebeginn . '%', $jetztzeit, 'B', '', $this->_getFontSize4Times($zellweite), $zellweite . '%', 0, $this->height, 0);
        $this->pdf->ln(-2.5);
      }
      
      $jetztzeit = $nextzeit;
    }

    $this->pdf->ln(2 * $this->height);
  }

  

  private function _printFarbLegende()
  {
    if (isset($this->colorAry) && count($this->colorAry) > 0) {
      $this->pdf->ln(2 * $this->height);
      if ($this->pdf->TriggersPageBreak(count($this->colorAry) * 8)) {
        $this->pdf->AddPage();
        $this->pdf->ln(2 * $this->height);
      }

      $this->pdf->CellAtX('3%', '', '', '', '', '26%', 1, count($this->colorAry) * 8);
      $this->pdf->ln(-$this->height);
      $this->pdf->CellAtX('3%', 'Farblegende:', 'B', '', '', '26%', 0, $this->height);
      $this->pdf->ln($this->height);
      $this->pdf->ln(2.5);

      foreach ($this->colorAry as $color => $bool) {
        if ($bool) {
          switch ($color) {
              case 'rot': 
                $this->pdf->SetFillColor(255, 75, 0);
                $this->pdf->CellAtX('4%', '', '', '', '', '1%', 1, 3, 1);
                $this->pdf->ln(-1);
                $this->pdf->CellAtX('6%', 'Doppelbelegung', '', '', 8, '23%', 0, 3, 0);
              break;
              case 'weiss':
                $this->pdf->SetFillColor(255, 255, 255);
                $this->pdf->CellAtX('4%', '', '', '', '', '1%', 1, 3, 1);
                $this->pdf->ln(-1);
                $this->pdf->CellAtX('6%', 'Ausgefallene Kurstage', '', '', 8, '23%', 0, 3, 0);
              break;
              case 'blau':
                $this->pdf->SetFillColor(0, 128, 255);
                $this->pdf->CellAtX('4%', '', '', '', '', '1%', 1, 3, 1);
                $this->pdf->ln(-1);
                $this->pdf->CellAtX('6%', 'Sondertermine wie Vor- oder Nachbesprechung', '', '', 8, '23%', 0, 3, 0);
              break;
              case 'dunkelorange':
                $this->pdf->SetFillColor(220, 190, 5);
                $this->pdf->CellAtX('4%', '', '', '', '', '1%', 1, 3, 1);
                $this->pdf->ln(-1);
                $this->pdf->CellAtX('6%', 'Erster Kurstag', '', '', 8, '23%', 0, 2, 0);
              break;
              default:  
                $this->pdf->SetFillColor(255, 255, 0);
                $this->pdf->CellAtX('4%', '', '', '', '', '1%', 1, 3, 1);
                $this->pdf->ln(-1);
                $this->pdf->CellAtX('6%', 'Normale und zusätzliche Kurstage', '', '', 8, '23%', 0, 3, 0);
              break;
            }
        }
        $this->pdf->ln(9);
      }
    }
  }

  
  public function _printKursCell($pKursdatum)
  {
    $aktWochentagKurz = StringOperations::substr($this->dtop->getWeekDayShort($pKursdatum), 0, 2);
    
    while (!in_array($aktWochentagKurz, $this->selweekdays)) {
      
      
      if (count($this->kursetage) > 0 && strcmp($pKursdatum, $this->kursetage[0]->datum) == 0) {
        array_shift($this->kursetage);
      }
      else {
        return;
      }
    }

        
    $zeitbereich_beginn = $this->settings->zeitbereich->zeitvon;
    $zeitbereich_ende = $this->settings->zeitbereich->zeitbis;



    
    $jetztzeit = $zeitbereich_beginn;

    
    $spaltenzahl = $this->zeitSpanne($this->settings->zeitbereich->zeitvon, $this->settings->zeitbereich->zeitbis, $this->settings->zeitbereich->zeitspanne);

    if ($this->pdf->TriggersPageBreak($this->zellheight)) {
      $this->pdf->AddPage();
      $this->_printTabellenKopf();
    }

    //+++++++++++++++++++++ Erste Spalte mit den Tagesinformationen ++++++++++++++++++++++++++
        
        $this->pdf->CellAtX('3%', '', '', '', 8, '7.5%', 1, $this->zellheight, 1);	
        $this->pdf->ln($this->height / 5);
    $this->pdf->CellAtX('3%', $this->dtop->getWeekDayShort($pKursdatum) . ', ' . $this->dtop->getShortForm4DateStr($pKursdatum), '', '', 8, '7.5%', 0, 4, 0);
    $this->pdf->ln(4 * $this->height / 5);
    
    $kwobj = KalenderwochenAPI::getKalenderWochenNrfromDate(StringOperations::substr($pKursdatum, 0, 2), StringOperations::substr($pKursdatum, 3, 2), StringOperations::substr($pKursdatum, 6, 4));
    $this->pdf->CellAtX('3%', 'KW ' . $kwobj->kwnr, '', '', 8, '7.5%', 0, 4 * $this->height / 5, 0);
    $this->pdf->ln(-$this->height);


    
    while (isset($this->kursetage[0]) && (strcmp($pKursdatum, $this->kursetage[0]->datum) == 0) && (strcmp($zeitbereich_beginn, $this->kursetage[0]->zeit_ende) >= 0)) {
      array_shift($this->kursetage);
    }



    //+++++++++++++++++++ Ausgabe der Zellen und der Kurstage +++++++++++++++++++++++++++
    
    $aktspalte = 0;
    while ($aktspalte < $spaltenzahl) {

            
      $zellebeg = $aktspalte * $this->zellwidth + 10.5;
      
      $nextzeitobj = $this->zeitPlusZeit($jetztzeit, $this->settings->zeitbereich->zeitspanne);



      
      if ($this->zeitSpanne($jetztzeit, $zeitbereich_ende, $this->settings->zeitbereich->zeitspanne) < 1 || ($nextzeitobj->ueberlauf == 1)) {
        
        $zellweite = $this->zellwidth * $this->zeitSpanne($jetztzeit, $zeitbereich_ende, $this->settings->zeitbereich->zeitspanne);
        $nextzeit = $zeitbereich_ende;
      }
      else {
        
                $zellweite = $this->zellwidth; 
                $nextzeit = $nextzeitobj->zeitsumme;
      }


      
      $ktzeitvon = isset($this->kursetage[0]->zeit_beg) ? $this->kursetage[0]->zeit_beg : '';
      $ktzeitbis = isset($this->kursetage[0]->zeit_ende) ? $this->kursetage[0]->zeit_ende : '';



      //+++++++++++++++++++++++ Falls der Kurstag über die Tabelle hinaussteht ++++++++++++++++++++++++++++++++++++++++++++
      
      if ($this->dtop->getTimeStringasFloat($zeitbereich_beginn) > $this->dtop->getTimeStringasFloat($ktzeitvon)
                && $this->dtop->getTimeStringasFloat($ktzeitbis) > $this->dtop->getTimeStringasFloat($zeitbereich_beginn)) {
        $ktzeitvon = $zeitbereich_beginn;
      }

      
      if ($this->dtop->getTimeStringasFloat($zeitbereich_ende) < $this->dtop->getTimeStringasFloat($ktzeitbis)
                   && $this->dtop->getTimeStringasFloat($ktzeitvon) < $this->dtop->getTimeStringasFloat($zeitbereich_ende)) {
        $ktzeitbis = $zeitbereich_ende;
      }

      $datum = isset($this->kursetage[0]->datum) ? $this->kursetage[0]->datum : '';
      //++++++++++++++ Heute ist ein Kurs, und dieser beginnt in der aktuellen Intervall +++++++++++++++++++
      if (strcmp($pKursdatum, $datum) == 0 && strcmp($jetztzeit, $ktzeitvon) <= 0 && strcmp($nextzeit, $ktzeitvon) > 0) {

                 
        $this->_printKurstagBlock($ktzeitvon, $ktzeitbis, $jetztzeit, $zellebeg, $zellweite);
        
        array_shift($this->kursetage);
      
      }

            
      else {
        
        ($this->kurszellende > $zellebeg + $zellweite) ? $zellrand = 'TB' : $zellrand = 'TBR';
        $this->pdf->CellAtX($zellebeg . '%', '', '', '', 8, $zellweite . '%', $zellrand, $this->zellheight, 0);
        
        $jetztzeit = $nextzeit;
        $aktspalte++;
      }
    } 

        if (isset($this->kursetage[0])) {
          $datum = $this->kursetage[0]->datum;
          $zeit_beg = $this->kursetage[0]->zeit_beg;
        }

    
    while ((strcmp($pKursdatum, $datum) == 0) && (strcmp($zeitbereich_ende, $zeit_beg) <= 0) && !empty($this->kursetage)) {
      array_shift($this->kursetage);
    }

    $this->pdf->ln($this->zellheight);
  }

  

  
  public function _printKurstagBlock($pKtzeitvon, $pKtzeitbis, $pJetztzeit, $pZellebeginn, $pZellweite)
  {
    $pFaktor = 1 / $this->dtop->getTimeStringasFloat($this->settings->zeitbereich->zeitspanne);
    $zeitbeg_std = StringOperations::substr($pJetztzeit, 0, 2);
    $zeitbeg_min = StringOperations::substr($pJetztzeit, 3, 2);
    

    
    $std_offset = ((float)StringOperations::substr($pKtzeitvon, 0, 2) - (float)$zeitbeg_std) * $pFaktor * $this->zellwidth;
    
    $min_offset = ((float)StringOperations::substr($pKtzeitvon, 3, 2) - (float)$zeitbeg_min) / 60 * $this->zellwidth * $pFaktor;
    $zellbeginn = $pZellebeginn + $std_offset + $min_offset;

    $zeitende = (strcmp($this->settings->zeitbereich->zeitbis, $pKtzeitbis) > 0) ? $pKtzeitbis : $this->settings->zeitbereich->zeitbis;
    $zellweite = $this->zellwidth * $this->zeitspanne($pKtzeitvon, $zeitende, $this->settings->zeitbereich->zeitspanne);

    $farbe = $this->setFillColor4KTstatus($this->kursetage[0]);
    $this->colorAry[$farbe] = true;

    
    
    $this->pdf->CellAtX($zellbeginn . '%', $this->kursetage[0]->knr . ' ' . $this->kursetage[0]->kurs->kurzbez, 'B', '', 7, $zellweite . '%', 1, $this->zellheight, 1);
    $this->pdf->ln(($this->zellheight - 1) / 4);
    $this->pdf->CellAtX($zellbeginn . '%', $this->kursetage[0]->zeit_beg . '-' . $this->kursetage[0]->zeit_ende, '', '', 8, $zellweite . '%', 0, ($this->zellheight - 1) / 3, 0);
    $this->pdf->ln(($this->zellheight - 1) / 4);
    $this->pdf->CellAtX($zellbeginn . '%', $this->kursetage[0]->ort, '', '', 8, $zellweite . '%', 0, ($this->zellheight - 1) / 3, 0);
    $this->pdf->ln(-($this->zellheight - 1) / 2);

    
    if($this->kurszellende < $zellbeginn + $zellweite) {
      $this->kurszellende = $zellbeginn + $zellweite;
    }

    
    $this->SetFillColor4Border();
  }

  

  
  
  public function isZeitBereichUsed()
  {
    return true;
  }

  public function isZeitSpanneUsed()
  {
    return true;
  }
}