<?php

/**
 *
 * PHP Pro Bid $Id$ K9PfLDm6IYP5RLNLNc//Ik1uYkiidL77Wm6NaMualOA=
 *
 * @link        http://www.phpprobid.com
 * @copyright   Copyright (c) 2015 Online Ventures Software & CodeCube SRL
 * @license     http://www.phpprobid.com/license Commercial License
 *
 * @version     7.4
 */
/**
 * category selector form element
 */

namespace Ppb\Form\Element;

use Cube\Form\Element,
    Cube\Controller\Front,
    Ppb\Service\Table\Relational\Categories as CategoriesService;

class Category extends Element
{

    /**
     *
     * type of element - override the variable from the parent class
     *
     * @var string
     */
    protected $_element = 'category';

    /**
     *
     * base url of the application
     *
     * @var string
     */
    protected $_baseUrl;

    /**
     *
     * categories table service
     *
     * @var \Ppb\Service\Table\Relational\Categories
     */
    protected $_categories;

    /**
     *
     * refresh page on select
     *
     * @var bool
     */
    protected $_refresh = true;

    /**
     *
     * class constructor
     *
     * @param string $name
     */
    public function __construct($name)
    {
        parent::__construct($this->_element, $name);

        $view = Front::getInstance()->getBootstrap()->getResource('view');

        $translate = $this->getTranslate();

        $this->setBodyCode(
            "<script type=\"text/javascript\">" . "\n"
            . " function displayCategoryBoxes(el, selected, option) { " . "\n"
            . "     var storeId = el.find('.btn-category').attr('data-store-id'); " . "\n"
            . "     var categoryId = el.find('.btn-category').attr('data-store-id'); " . "\n"
            . "     var refreshPage = el.find('.btn-category').attr('data-no-refresh'); " . "\n"
            . "     $.post( " . "\n"
            . "         '" . $view->url(array('module' => 'app', 'controller' => 'async', 'action' => 'select-category')) . "', " . "\n"
            . "         { " . "\n"
            . "             id: selected, " . "\n"
            . "             storeId: storeId, " . "\n"
            . "             option: option " . "\n"
            . "         }, " . "\n"
            . "         function(data) { " . "\n"
            . "             el.find('.btn-category').attr('disabled', false).html(data['category_name']); " . "\n"
            . "             el.find('.category-id').val(data['category_id']); " . "\n"
            . "             el.find('.form-boxes').html(data['output']); " . "\n"
            . "             if (!data['output'] && data['refresh'] && refreshPage != 'true') { " . "\n"
            . "                 $('body').addClass('loading'); " . "\n"
            . "                 el.closest('form').submit(); " . "\n"
            . "             } " . "\n"
            . "         },  " . "\n"
            . "         'json' " . "\n"
            . "     ); " . "\n"
            . " } " . "\n"
            . " $(document).on('click', '.btn-category', function(e) { " . "\n"
            . "     e.preventDefault(); " . "\n"
            . "     $(this).attr('disabled', true).text('" . $translate->_('Please wait ...') . "'); " . "\n"
            . "     var el = $(this).closest('.form-group'); " . "\n"
            . "     el.find('.btn-category-cancel').show(); " . "\n"
            . "     var selected = el.find('.category-id').val(); " . "\n"
            . "     displayCategoryBoxes(el, selected, 'change'); " . "\n"
            . " }); " . "\n"
            . " $(document).on('click', '.btn-category-cancel', function(e) { " . "\n"
            . "     e.preventDefault(); " . "\n"
            . "     var el = $(this).closest('.form-group'); " . "\n"
            . "     el.find('.btn-category').attr('disabled', true).text('" . $translate->_('Please wait ...') . "'); " . "\n"
            . "     el.find('.category-id').val(''); " . "\n"
            . "     el.find('.btn-category-cancel').hide(); " . "\n"
            . "     displayCategoryBoxes(el, '', 'reset'); " . "\n"
            . " }); " . "\n"
            . " $(document).on('change', '.category-selector', function(e) { " . "\n"
            . "     e.preventDefault(); " . "\n"
            . "     $(this).closest('.form-group').find('.btn-category').attr('disabled', true).text('" . $translate->_('Please wait ...') . "'); " . "\n"
            . "     var el = $(this).closest('.form-group'); " . "\n"
            . "     var selected = $(this).val(); " . "\n"
            . "     displayCategoryBoxes(el, selected, 'select'); " . "\n"
            . " }); " . "\n"
            . "</script>");
    }

    /**
     *
     * get categories table service
     *
     * @return \Ppb\Service\Table\Relational\Categories
     */
    public function getCategories()
    {
        if (!$this->_categories instanceof CategoriesService) {
            $this->setCategories(
                new CategoriesService()
            );
        }

        return $this->_categories;
    }

    /**
     *
     * set categories table service
     *
     * @param \Ppb\Service\Table\Relational\Categories $categories
     *
     * @return \Ppb\Form\Element\Category
     */
    public function setCategories(CategoriesService $categories)
    {
        $this->_categories = $categories;

        return $this;
    }

    /**
     *
     * set refresh flag
     *
     * @param boolean $refresh
     *
     * @return $this
     */
    public function setRefresh($refresh)
    {
        $this->_refresh = $refresh;

        return $this;
    }

    /**
     *
     * get refresh flag
     *
     * @return boolean
     */
    public function getRefresh()
    {
        return $this->_refresh;
    }


    /**
     *
     * render the form element
     *
     * @return string
     */
    public function render()
    {
        $output = null;

        $translate = $this->getTranslate();

        $value        = (string)$this->getValue();
        $categoryName = $this->getCategories()->getFullName($value); // this is already translated

        $this->removeAttribute('class');

        $output = $this->getPrefix() . ' '
            . '<input type="hidden" name="' . $this->_name . '" value="' . $value . '" class="category-id" '
            . $this->_endTag
            . '<button class="btn btn-primary btn-category" '
            . $this->renderAttributes() . '>'
            . (($categoryName === null) ? $translate->_('Select Category') : $categoryName)
            . '</button> '
            . '<i class="fa fa-times btn-category-cancel" style="display: '
            . (($categoryName === null) ? 'none' : 'inline-block') . '"></i>'
            . $this->getSuffix()
            . '<div class="form-boxes"></div>';

        return $output;
    }

}