<?php

/**
 * Slick slider for Contao
 *
 * Copyright (c) 2016 Benjamin Roth
 *
 * @license LGPL-3.0+
 */


/**
 * Table tl_content
 */

/**
 * Add callback
 */
$GLOBALS['TL_DCA']['tl_content']['config']['onload_callback'][] = array('tl_content_eSM_slick', 'showJsLibraryHint');
$GLOBALS['TL_DCA']['tl_content']['config']['onsubmit_callback'][] = array('tl_content_eSM_slick', 'insertEndElement');

/**
 * Add palettes to tl_content
 */
$GLOBALS['TL_DCA']['tl_content']['palettes']['__selector__'][] = 'eSM_addImage';
$GLOBALS['TL_DCA']['tl_content']['palettes']['__selector__'][] = 'eSM_addText';
$GLOBALS['TL_DCA']['tl_content']['palettes']['__selector__'][] = 'eSM_slick_addImageLink';
$GLOBALS['TL_DCA']['tl_content']['palettes']['slickSliderStart'] = '{type_legend},type;{slickSlider_legend},eSM_slick_autoPlaySpeed,eSM_slick_speed,eSM_slick_initialSlide,eSM_slick_lazyLoad,eSM_slick_slidesToShow,eSM_slick_slidesToScroll,eSM_slick_infinite,eSM_slick_arrows,eSM_slick_pagination,eSM_slick_pause,eSM_slick_fade,eSM_slick_adaptiveHeight;{image_legend},eSM_addImage;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop';
$GLOBALS['TL_DCA']['tl_content']['palettes']['slickSliderStop'] = '{type_legend},type;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests;{invisible_legend:hide},invisible,start,stop';
$GLOBALS['TL_DCA']['tl_content']['palettes']['slickSliderSlideStart'] = '{type_legend},type;{slickSlider_legend},eSM_addImage;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop';
$GLOBALS['TL_DCA']['tl_content']['palettes']['slickSliderSlideStop'] = '{type_legend},type;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests;{invisible_legend:hide},invisible,start,stop';
$GLOBALS['TL_DCA']['tl_content']['palettes']['slickSliderImage'] = '{type_legend},type;{slickSlider_legend},multiSRC,size,eSM_slick_bgSize,eSM_slick_bgPosition,eSM_slick_minHeight,eSM_slick_bgOpacity,eSM_slick_bgRepeat,eSM_slick_addImageLink,eSM_addText;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space;{invisible_legend:hide},invisible,start,stop';


$GLOBALS['TL_DCA']['tl_content']['subpalettes']['eSM_addImage'] = 'multiSRC,size,eSM_slick_bgSize,eSM_slick_bgPosition,eSM_slick_minHeight,eSM_slick_bgOpacity,eSM_slick_bgRepeat';
$GLOBALS['TL_DCA']['tl_content']['subpalettes']['eSM_addText'] = 'eSM_slick_text,eSM_slick_url';
$GLOBALS['TL_DCA']['tl_content']['subpalettes']['eSM_slick_addImageLink'] = 'imageUrl,fullsize';

/**
 * Add fields to tl_content
 */

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_autoPlaySpeed'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_autoPlaySpeed'],
  'exclude'                 => true,
  'inputType'               => 'text',
  'eval'                    => array('tl_class'=>'w50','rgxp'=>'digit'),
  'sql'                     => "int(10) unsigned NOT NULL default '0'"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_speed'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_speed'],
  'exclude'                 => true,
  'inputType'               => 'text',
  'default'                 => '500',
  'eval'                    => array('tl_class'=>'w50','rgxp'=>'digit'),
  'sql'                     => "int(10) unsigned NOT NULL default '0'"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_initialSlide'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_initialSlide'],
  'exclude'                 => true,
  'inputType'               => 'text',
  'eval'                    => array('tl_class'=>'w50','rgxp'=>'digit'),
  'sql'                     => "int(10) unsigned NOT NULL default '0'"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_slidesToShow'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_slidesToShow'],
  'exclude'                 => true,
  'inputType'               => 'text',
  'eval'                    => array('rgxp'=>'natural','minval'=>1,'tl_class'=>'w50'),
  'sql'                     => "int(10) unsigned NOT NULL default '1'"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_slidesToScroll'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_slidesToScroll'],
  'exclude'                 => true,
  'inputType'               => 'text',
  'eval'                    => array('rgxp'=>'natural','minval'=>1,'tl_class'=>'w50'),
  'sql'                     => "int(10) unsigned NOT NULL default '1'"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_infinite'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_infinite'],
  'exclude'                 => true,
  'inputType'               => 'checkbox',
  'eval'                    => array('tl_class'=>'w50 m12'),
  'sql'                     => "char(1) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_arrows'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_arrows'],
  'exclude'                 => true,
  'inputType'               => 'checkbox',
  'eval'                    => array('tl_class'=>'w50 m12'),
  'sql'                     => "char(1) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_pagination'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_pagination'],
  'exclude'                 => true,
  'inputType'               => 'checkbox',
  'eval'                    => array('tl_class'=>'w50 m12'),
  'sql'                     => "char(1) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_pause'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_pause'],
  'exclude'                 => true,
  'inputType'               => 'checkbox',
  'eval'                    => array('tl_class'=>'w50 m12'),
  'sql'                     => "char(1) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_lazyLoad'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_lazyLoad'],
  'exclude'                 => true,
  'inputType'               => 'select',
  'default'                 => 'ondemand',
  'options'                 => array('ondemand','progressive'),
  'reference'               => &$GLOBALS['TL_LANG']['MSC']['slick_lazyLoad'],
  'eval'                    => array('tl_class'=>'w50','includeBlankOption'=>true),
  'sql'                     => "varchar(16) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_fade'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_fade'],
  'exclude'                 => true,
  'inputType'               => 'checkbox',
  'eval'                    => array('tl_class'=>'w50 m12'),
  'sql'                     => "char(1) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_adaptiveHeight'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_adaptiveHeight'],
  'exclude'                 => true,
  'inputType'               => 'checkbox',
  'eval'                    => array('tl_class'=>'w50 m12'),
  'sql'                     => "char(1) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_text'] = array
(
    'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_text'],
    'exclude'                 => true,
    'inputType'               => 'textarea',
    'eval'                    => array('rows'=>2,'style'=>'height: 2em;', 'maxlength'=>64),
    'sql'                     => "varchar(64) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_url'] = array
(
    'label'                   => &$GLOBALS['TL_LANG']['MSC']['url'],
    'exclude'                 => true,
    'inputType'               => 'text',
    'eval'                    => array('rgxp'=>'url', 'decodeEntities'=>true, 'maxlength'=>255, 'fieldType'=>'radio', 'filesOnly'=>true, 'tl_class'=>'w50 wizard'),
    'wizard' => array
    (
        array('tl_content', 'pagePicker')
    ),
    'sql'                     => "varchar(255) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_addImage'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['addImage'],
  'exclude'                 => true,
  'inputType'               => 'checkbox',
  'eval'                    => array('submitOnChange'=>true),
  'sql'                     => "char(1) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_addText'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_addText'],
  'exclude'                 => true,
  'inputType'               => 'checkbox',
  'eval'                    => array('tl_class'=>'clr', 'submitOnChange'=>true),
  'sql'                     => "char(1) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_minHeight'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_minHeight'],
  'exclude'                 => true,
  'inputType'               => 'checkbox',
  'eval'                    => array('tl_class'=>'w50 m12'),
  'sql'                     => "char(1) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_addImageLink'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_addImageLink'],
  'exclude'                 => true,
  'inputType'               => 'checkbox',
  'eval'                    => array('tl_class'=>'clr w50','submitOnChange'=>true),
  'sql'                     => "char(1) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_bgPosition'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_bgPosition'],
  'exclude'                 => true,
  'inputType'               => 'select',
  'options'                 => array
  (
    '0 0' => 'Links | Oben',
    '50% 0' => 'Mitte | Oben',
    '100% 0' => 'Rechts | Oben',
    '0 50%' => 'Links | Mitte',
    '50% 50%' => 'Mitte | Mitte',
    '100% 50%' => 'Rechts | Mitte',
    '0 100%' => 'Links | Unten',
    '50% 100%' => 'Mitte | Unten',
    '100% 100%' => 'Rechts | Unten',
  ),
  'eval'                    => array('tl_class' => 'w50','includeBlankOption'=>true),
  'sql'                     => "varchar(16) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_bgSize'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_bgSize'],
  'exclude'                 => true,
  'inputType'               => 'select',
  'options'                 => array
  (
    'contain' => 'Proportional',
    '100% 100%' => 'Verzerrt',
    'auto auto' => 'Originalgröße',
  ),
  'eval'                    => array('tl_class' => 'w50','includeBlankOption'=>true,'blankOptionLabel'=>'Beschnitten'),
  'sql'                     => "varchar(16) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_bgRepeat'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_bgRepeat'],
  'exclude'                 => true,
  'inputType'               => 'select',
  'options'                 => array
  (
    'repeat-x' => 'Horizontal wiederholen',
    'repeat-y' => 'Vertikal wiedeholen',
    'no-repeat' => 'Nicht wiederholen',
  ),
  'eval'                    => array('tl_class' => 'w50','includeBlankOption'=>true,'blankOptionLabel'=>'Wiederholen'),
  'sql'                     => "varchar(16) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['eSM_slick_bgOpacity'] = array
(
  'label'                   => &$GLOBALS['TL_LANG']['tl_content']['eSM_slick_bgOpacity'],
  'exclude'                 => true,
  'inputType'               => 'select',
  'options'                 => array
  (
    '10' => '10%',
    '20' => '20%',
    '30' => '30%',
    '40' => '40%',
    '50' => '50%',
    '60' => '60%',
    '70' => '70%',
    '80' => '80%',
    '90' => '90%',
    '100' => '100%',
  ),
  'eval'                    => array('tl_class' => 'w50','includeBlankOption'=>true),
  'sql'                     => "varchar(16) NOT NULL default ''"
);

$GLOBALS['TL_DCA']['tl_content']['fields']['multiSRC']['load_callback'][] = array('tl_content_eSM_slick', 'setMultiSrcFlags');


class tl_content_eSM_slick extends Backend
{

  /**
   * Import the back end user object
   */
  public function __construct()
  {
    parent::__construct();
    $this->import('BackendUser', 'User');
  }

  /**
   * Show a hint if a JavaScript library needs to be included in the page layout
   *
   * @param object
   */
  public function showJsLibraryHint($dc)
  {
    if ($_POST || Input::get('act') != 'edit')
    {
      return;
    }

    // Return if the user cannot access the layout module (see #6190)
    if (!$this->User->hasAccess('themes', 'modules') || !$this->User->hasAccess('layout', 'themes'))
    {
      return;
    }

    $objCte = ContentModel::findByPk($dc->id);

    if ($objCte === null)
    {
      return;
    }

    switch ($objCte->type)
    {
      case 'slickSliderStart':
      case 'slickSliderStop':
        Message::addInfo(sprintf($GLOBALS['TL_LANG']['tl_content']['includeTemplatesJQuery'], 'j_slickslider'));
        break;
    }
  }

  /**
   * Automatically insert end element if start element ist about to be added
   *
   * @param DataContainer $dc
   */
  public function insertEndElement(\DataContainer $dc)
  {
    $activeRecord = $dc->activeRecord;
    if (!$activeRecord) {
      return;
    }

    if ($activeRecord->type === 'slickSliderStart' || $activeRecord->type === 'slickSliderSlideStart') {

      // Find the next boxwrapper element
      $nextElement = \Database::getInstance()
        ->prepare("
					SELECT type
					FROM tl_content
					WHERE pid = ?
						AND (ptable = ? OR ptable = ?)
            AND type IN ('slickSliderSlideStart', 'slickSliderSlideStop','slickSliderStart', 'slickSliderStop')
						AND sorting > ?
					ORDER BY sorting ASC
					LIMIT 1
				")
        ->execute(
          $activeRecord->pid,
          $activeRecord->ptable ?: 'tl_article',
          $activeRecord->ptable === 'tl_article' ? '' : $activeRecord->ptable,
          $activeRecord->sorting
        );

      // Check if a stop element should be created
      if (
        !$nextElement->type
        || ($activeRecord->type === 'slickSliderStart' && ($nextElement->type === 'slickSliderStart'))
        || ($activeRecord->type === 'slickSliderSlideStart' && ($nextElement->type === 'slickSliderSlideStart' || $nextElement->type === 'slickSliderStart' || $nextElement->type === 'slickSliderStop'))
      ) {
        \Database::getInstance()
          ->prepare('INSERT INTO tl_content %s')
          ->set(array(
            'pid' => $activeRecord->pid,
            'ptable' => $activeRecord->ptable ?: 'tl_article',
            'type' => substr($activeRecord->type, 0, -5) . 'Stop',
            'sorting' => $activeRecord->sorting + 1,
            'tstamp' => time(),
          ))
          ->execute();
      }

    }
  }

  /**
   * Dynamically add flags to the "multiSRC" field
   *
   * @param mixed                $varValue
   * @param Contao\DataContainer $dc
   *
   * @return mixed
   */
  public function setMultiSrcFlags($varValue, Contao\DataContainer $dc)
  {
    if ($dc->activeRecord)
    {
      switch ($dc->activeRecord->type)
      {
        case 'slickSliderStart':
        case 'slickSliderSlideStart':
        case 'slickSliderImage':
          $GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['eval']['isGallery'] = true;
          $GLOBALS['TL_DCA'][$dc->table]['fields'][$dc->field]['eval']['extensions'] = Contao\Config::get('validImageTypes').'mp4,ogv,webm,mov';
          break;
      }
    }
    return $varValue;
  }
}