<?php

/**

 * Zend Framework

 *

 * LICENSE

 *

 * This source file is subject to the new BSD license that is bundled

 * with this package in the file LICENSE.txt.

 * It is also available through the world-wide-web at this URL:

 * http://framework.zend.com/license/new-bsd

 * If you did not receive a copy of the license and are unable to

 * obtain it through the world-wide-web, please send an email

 * to license@zend.com so we can send you a copy immediately.

 *

 * @category   Zend

 * @package    Zend_Barcode

 * @subpackage Object

 * @copyright  Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)

 * @license    http://framework.zend.com/license/new-bsd     New BSD License

 * @version    $Id$

 */



/** @see Zend_Barcode_Object_Code25 */

require_once 'Zend/Barcode/Object/Code25.php';



/** @see Zend_Validate_Barcode */

require_once 'Zend/Validate/Barcode.php';



/**

 * Class for generate Interleaved 2 of 5 barcode

 *

 * @category   Zend

 * @package    Zend_Barcode

 * @copyright  Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)

 * @license    http://framework.zend.com/license/new-bsd     New BSD License

 */

class Zend_Barcode_Object_Code25interleaved extends Zend_Barcode_Object_Code25

{

    /**

     * Drawing of bearer bars

     * @var boolean

     */

    private $_withBearerBars = false;



    /**

     * Default options for Code25interleaved barcode

     * @return void

     */

    protected function _getDefaultOptions()

    {

        $this->_barcodeLength = 'even';

    }



    /**

     * Activate/deactivate drawing of bearer bars

     * @param boolean $value

     * @return Zend_Barcode_Object_Int25

     */

    public function setWithBearerBars($value)

    {

        $this->_withBearerBars = (bool) $value;

        return $this;

    }



    /**

     * Retrieve if bearer bars are enabled

     * @return boolean

     */

    public function getWithBearerBars()

    {

        return $this->_withBearerBars;

    }



    /**

     * Width of the barcode (in pixels)

     * @return integer

     */

    protected function _calculateBarcodeWidth()

    {

        $quietZone       = $this->getQuietZone();

        $startCharacter  = (4 * $this->_barThinWidth) * $this->_factor;

        $characterLength = (3 * $this->_barThinWidth + 2 * $this->_barThickWidth) * $this->_factor;

        $encodedData     = strlen($this->getText()) * $characterLength;

        $stopCharacter   = ($this->_barThickWidth + 2 * $this->_barThinWidth) * $this->_factor;

        return $quietZone + $startCharacter + $encodedData + $stopCharacter + $quietZone;

    }



    /**

     * Prepare array to draw barcode

     * @return array

     */

    protected function _prepareBarcode()

    {

        if ($this->_withBearerBars) {

            $this->_withBorder = false;

        }



        // Start character (0000)

        $barcodeTable[] = array(1, $this->_barThinWidth, 0, 1);

        $barcodeTable[] = array(0, $this->_barThinWidth, 0, 1);

        $barcodeTable[] = array(1, $this->_barThinWidth, 0, 1);

        $barcodeTable[] = array(0, $this->_barThinWidth, 0, 1);



        // Encoded $text

        $text = $this->getText();

        for ($i = 0; $i < strlen($text); $i += 2) { // Draw 2 chars at a time

            $char1 = substr($text, $i, 1);

            $char2 = substr($text, $i + 1, 1);



            // Interleave

            for ($ibar = 0; $ibar < 5; $ibar ++) {

                // Draws char1 bar (fore color)

                $barWidth = (substr($this->_codingMap[$char1], $ibar, 1))

                          ? $this->_barThickWidth

                          : $this->_barThinWidth;



                $barcodeTable[] = array(1, $barWidth, 0, 1);



                // Left space corresponding to char2 (background color)

                $barWidth = (substr($this->_codingMap[$char2], $ibar, 1))

                          ? $this->_barThickWidth

                          : $this->_barThinWidth;

                $barcodeTable[] = array(0, $barWidth, 0 , 1);

            }

        }



        // Stop character (100)

        $barcodeTable[] = array(1 , $this->_barThickWidth, 0, 1);

        $barcodeTable[] = array(0 , $this->_barThinWidth,  0, 1);

        $barcodeTable[] = array(1 , $this->_barThinWidth,  0, 1);

        return $barcodeTable;

    }



    /**

     * Drawing of bearer bars (if enabled)

     *

     * @return void

     */

    protected function _postDrawBarcode()

    {

        if (!$this->_withBearerBars) {

            return;

        }



        $width  = $this->_barThickWidth * $this->_factor;

        $point1 = $this->_rotate(-1, -1);

        $point2 = $this->_rotate($this->_calculateWidth() - 1, -1);

        $point3 = $this->_rotate($this->_calculateWidth() - 1, $width - 1);

        $point4 = $this->_rotate(-1, $width - 1);

        $this->_addPolygon(array(

            $point1,

            $point2,

            $point3,

            $point4,

        ));

        $point1 = $this->_rotate(

            0,

            0 + $this->_barHeight * $this->_factor - 1

        );

        $point2 = $this->_rotate(

            $this->_calculateWidth() - 1,

            0 + $this->_barHeight * $this->_factor - 1

        );

        $point3 = $this->_rotate(

            $this->_calculateWidth() - 1,

            0 + $this->_barHeight * $this->_factor - $width

        );

        $point4 = $this->_rotate(

            0,

            0 + $this->_barHeight * $this->_factor - $width

        );

        $this->_addPolygon(array(

            $point1,

            $point2,

            $point3,

            $point4,

        ));

    }

}

