<?php
/**
 * This file is part of MySQLDumper released under the GNU/GPL 2 license
 * http://www.mysqldumper.net
 *
 * @package         MySQLDumper
 * @subpackage      Forms_Config
 * @version         SVN: $Rev$
 * @author          $Author$
 */

/**
 * Create form to input ftp data on configuration screen
 *
 * @package         MySQLDumper
 * @subpackage      Forms_Config
 */
class Application_Form_Config_Ftp extends Zend_Form_SubForm
{
    /**
     * Msd Translator
     * @var Msd_Language
     */
    protected $_lang;
    /**
     * Init form and add all elements
     *
     * @return void
     */
    public function init()
    {
        $config = Msd_Configuration::getInstance();
        $this->_lang = Msd_Language::getInstance();
        $this->setDisableLoadDefaultDecorators(true);
        $this->setDecorators(array('SubForm'));
        $this->addDisplayGroupPrefixPath(
            'Msd_Form_Decorator',
            'Msd/Form/Decorator/'
        );
        $this->setDisplayGroupDecorators(array('DisplayGroup'));
        $this->_addButtonFtpAdd();

        $ftpConfig = $config->get('config.ftp');
        $ftpKeys = array_keys($ftpConfig);
        $nrOfFtpProfiles = count($ftpKeys, 1);
        foreach ($ftpKeys as $ftpConnectionId) {
            $this->_addRadioActivated($ftpConnectionId);
            $this->_addInputTimeout($ftpConnectionId);
            $this->_addCheckboxPassiveMode($ftpConnectionId);
            $this->_addCheckboxSsl($ftpConnectionId);
            $this->_addInputServerAndPort($ftpConnectionId);
            $this->_addInputUserAndPass($ftpConnectionId);
            $this->_addInputPath($ftpConnectionId);
            
            if ($nrOfFtpProfiles > 1) {
                $buttonDelete = 'ftpDelete' . $ftpConnectionId;
            } else {
                $buttonDelete = '';
            }

            $this->_addButtonsTestAndDelete($ftpConnectionId, $buttonDelete);

            $legend = $this->_lang->getTranslator()->_('L_FTP_CONNECTION')
                . ' ' . ($ftpConnectionId + 1);

            $this->addDisplayGroup(
                array(
                    'ftp_' . $ftpConnectionId . '_use',
                    'ftp_' . $ftpConnectionId . '_timeout',
                    'ftp_' . $ftpConnectionId . '_passiveMode',
                    'ftp_' . $ftpConnectionId . '_ssl',
                    'ftp_' . $ftpConnectionId . '_server',
                    'ftp_' . $ftpConnectionId . '_port',
                    'ftp_' . $ftpConnectionId . '_user',
                    'ftp_' . $ftpConnectionId . '_pass',
                    'ftp_' . $ftpConnectionId . '_dir',
                    'ftpCheck' . $ftpConnectionId,
                    $buttonDelete,
                ),
                'ftp' . $ftpConnectionId,
                array(
                    'disableLoadDefaultDecorators' => true,
                    'decorators' => array('DisplayGroup'),
                    'legend' => $legend,
                )
            );
        }
    }

    /**
     * Add button "Add ftp connection"
     *
     * @return void
     */
    private function _addButtonFtpAdd()
    {
        $this->addElement(
            'button',
            'headElement',
            array(
                'disableLoadDefaultDecorators' => true,
                'content' =>
                    $this->getView()->getIcon('plus') . ' ' .
                    $this->_lang->getTranslator()->_('L_FTP_ADD_CONNECTION'),
                'decorators' => array('Default'),
                'escape' => false,
                'label' => '',
                'class' => 'Formbutton',
                'onclick' => "addFtpConnection();",
            )
        );
    }

    /**
     * Add radio "ftp activated"
     *
     * @param int $index
     *
     * @return void
     */
    private function _addRadioActivated($index)
    {
        $this->addElement(
            'radio',
            'ftp_' . $index . '_use',
            array(
                'class' => 'radio toggler',
                'label' => 'L_FTP_TRANSFER',
                'onclick' => "myToggle(this, 'y', 'ftpToggle" . $index . "');",
                'listsep' => ' ',
                'disableLoadDefaultDecorators' => true,
                'multiOptions' => array(
                    'y' => 'L_ACTIVATED',
                    'n' => 'L_NOT_ACTIVATED',
                ),
                'decorators' => array('Default'),
            )
        );
    }

    /**
     * Add input "ftp timeout"
     *
     * @param int $index
     *
     * @return void
     */
    private function _addInputTimeout($index)
    {
        $this->addElement(
            'text',
            'ftp_' . $index . '_timeout',
            array(
                'class' => 'text ftpToggle' . $index,
                'label' => 'L_FTP_TIMEOUT',
                'secondLabel' => 'L_SECONDS',
                'disableLoadDefaultDecorators' => true,
                'size' => 3,
                'maxlength' => 3,
                'decorators' => array('DoubleLabel'),
                'validators' => array('Digits'),
            )
        );
    }

    /**
     * Add checkbox "passive mode"
     *
     * @param int $index
     *
     * @return void
     */
    private function _addCheckboxPassiveMode($index)
    {
        $this->addElement(
            'checkbox',
            'ftp_' . $index . '_passiveMode',
            array(
                'class' => 'checkbox ftpToggle' . $index,
                'label' => 'L_FTP_CHOOSE_MODE',
                'secondLabel' => 'L_FTP_PASSIVE',
                'disableLoadDefaultDecorators' => true,
                'checkedValue' => 'y',
                'uncheckedValue' => 'n',
                'decorators' => array('DoubleLabel'),
            )
        );
    }

    /**
     * Add checkbox "ssl"
     *
     * @param int $index
     *
     * @return void
     */
    private function _addCheckboxSsl($index)
    {
        $this->addElement(
            'checkbox',
            'ftp_' . $index . '_ssl',
            array(
                'class' => 'checkbox ftpToggle' . $index,
                'label' => 'L_FTP_SSL',
                'secondLabel' => 'L_FTP_USESSL',
                'disableLoadDefaultDecorators' => true,
                'checkedValue' => 'y',
                'uncheckedValue' => 'n',
                'decorators' => array('DoubleLabel'),
            )
        );
    }

    /**
     * Add input "server"
     *
     * @param int $index
     *
     * @return void
     */
    private function _addInputServerAndPort($index)
    {
        $this->addElement(
            'text',
            'ftp_' . $index . '_server',
            array(
                'class' => 'text ftpToggle' . $index,
                'label' => 'L_FTP_SERVER',
                'disableLoadDefaultDecorators' => true,
                'decorators' => array('Default'),
            )
        );

        $this->addElement(
            'text',
            'ftp_' . $index . '_port',
            array(
                'class' => 'text ftpToggle' . $index,
                'label' => 'L_FTP_PORT',
                'disableLoadDefaultDecorators' => true,
                'size' => 4,
                'maxlength' => 5,
                'validators' => array('Digits'),
                'decorators' => array('Default'),
            )
        );
    }
        /**
     * Add input "user"
     *
     * @param int $index
     *
     * @return void
     */
    private function _addInputUserAndPass($index)
    {
        $this->addElement(
            'text',
            'ftp_' . $index . '_user',
            array(
                'class' => 'text ftpToggle' . $index,
                'label' => 'L_FTP_USER',
                'disableLoadDefaultDecorators' => true,
                'size' => 60,
                'decorators' => array('Default'),
            )
        );

        $this->addElement(
            'password',
            'ftp_' . $index . '_pass',
            array(
                'class' => 'text ftpToggle' . $index,
                'label' => 'L_FTP_PASS',
                'disableLoadDefaultDecorators' => true,
                'size' => 60,
                'decorators' => array('Default'),
                'renderPassword' => true,
            )
        );
    }

    /**
     * Add input server
     *
     * @param int $index
     *
     * @return void
     */
    private function _addInputPath($index)
    {
        $this->addElement(
            'text',
            'ftp_' . $index . '_dir',
            array(
                'class' => 'text ftpToggle' . $index,
                'label' => 'L_DIR',
                'disableLoadDefaultDecorators' => true,
                'size' => 60,
                'decorators' => array('Default'),
            )
        );
    }

    /**
     * Add Button "Test connection"
     * Add Button "Delete connection"
     * 
     * @param int $index
     * @param string $buttonDelete
     *
     * @return void
     */
    private function _addButtonsTestAndDelete($index, $buttonDelete)
    {
        if (!empty($buttonDelete)) {
            $buttonDecorator = 'LineStart';
        } else {
            $buttonDecorator = 'Default';
        }
       
        $this->addElement(
            'button',
            'ftpCheck' . $index,
            array(
                'disableLoadDefaultDecorators' => true,
                'content' =>
                    $this->getView()->getIcon('Connect', '', 16) . ' ' .
                    $this->_lang->getTranslator()->_('L_TESTCONNECTION'),
                'decorators' => array($buttonDecorator),
                'escape' => false,
                'label' => '',
                'class' => 'Formbutton ftpToggle' . $index,
                'onclick' => "alert('checkConnection(" .
                    $index . ")');",
            )
        );

        $this->addElement(
            'button',
            'ftpDelete' . $index,
            array(
                'disableLoadDefaultDecorators' => true,
                'content' =>
                    $this->getView()->getIcon('delete') . ' ' .
                    $this->_lang->getTranslator()->_('L_FTP_CONNECTION_DELETE'),
                'decorators' => array('LineEnd'),
                'escape' => false,
                'label' => '',
                'class' => 'Formbutton',
                'onclick' => "deleteFtpConnection(" .
                    $index . ");",
            )
        );
    }

    /**
     * Get valid values
     *
     * @param array $data
     *
     * @return array
     */
    public function getValidValues($data)
    {
        $values = parent::getValidValues($data, true);
        while (false !== (list($key, $value) = each($values))) {
            if (substr($key, 0, 4) != 'ftp_') {
                continue;
            }
            list(, $ftpId, $ftpKey) = explode('_', $key);
            if (!isset($values[$ftpId])) {
                $values[$ftpId] = array();
            }
            $values[$ftpId][$ftpKey] = $value;
            unset($values[$key]);
        }
        return $values;
    }

    /**
     * Set default values
     *
     * @param array $defaults
     *
     * @return Zend_Form
     */
    public function setDefaults($defaults)
    {
        if (!empty($defaults['ftp'])) {
            $ftp = array();
            while (
                false !== (list($ftpId, $ftpData) = each($defaults['ftp']))
            ) {
                foreach ($ftpData as $ftpKey => $ftpValue) {
                    $ftp['ftp_' . $ftpId . '_' . $ftpKey] = $ftpValue;
                }
            }
            $defaults['ftp'] = $ftp;
        }
        return parent::setDefaults($defaults);
    }

    /**
     * Set input default value
     *
     * @param string $name
     * @param string $value
     */
    public function setDefault($name, $value)
    {
        $name = 'ftp_'.str_replace('.', '_', $name);
        parent::setDefault($name, $value);
    }
}
