<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/zf2 for the canonical source repository
 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace Zend\Barcode\Object;

/**
 * Class for generate Interleaved 2 of 5 barcode
 */
class Code25interleaved extends Code25
{
    
/**
     * Drawing of bearer bars
     * @var bool
     */
    
private $withBearerBars false;

    
/**
     * Default options for Code25interleaved barcode
     * @return void
     */
    
protected function getDefaultOptions()
    {
        
$this->barcodeLength 'even';
    }

    
/**
     * Activate/deactivate drawing of bearer bars
     * @param  bool $value
     * @return Code25
     */
    
public function setWithBearerBars($value)
    {
        
$this->withBearerBars = (bool) $value;
        return 
$this;
    }

    
/**
     * Retrieve if bearer bars are enabled
     * @return bool
     */
    
public function getWithBearerBars()
    {
        return 
$this->withBearerBars;
    }

    
/**
     * Width of the barcode (in pixels)
     * @return integer
     */
    
protected function calculateBarcodeWidth()
    {
        
$quietZone       $this->getQuietZone();
        
$startCharacter  = ($this->barThinWidth) * $this->factor;
        
$characterLength = ($this->barThinWidth $this->barThickWidth) * $this->factor;
        
$encodedData     strlen($this->getText()) * $characterLength;
        
$stopCharacter   = ($this->barThickWidth $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->barThinWidth01);
        
$barcodeTable[] = array(0$this->barThinWidth01);
        
$barcodeTable[] = array(1$this->barThinWidth01);
        
$barcodeTable[] = array(0$this->barThinWidth01);

        
// Encoded $text
        
$text $this->getText();
        for (
$i 0$len strlen($text); $i $len$i += 2) { // Draw 2 chars at a time
            
$char1 substr($text$i1);
            
$char2 substr($text$i 11);

            
// Interleave
            
for ($ibar 0$ibar 5$ibar ++) {
                
// Draws char1 bar (fore color)
                
$barWidth = (substr($this->codingMap[$char1], $ibar1))
                          ? 
$this->barThickWidth
                          
$this->barThinWidth;

                
$barcodeTable[] = array(1$barWidth01);

                
// Left space corresponding to char2 (background color)
                
$barWidth = (substr($this->codingMap[$char2], $ibar1))
                          ? 
$this->barThickWidth
                          
$this->barThinWidth;
                
$barcodeTable[] = array(0$barWidth1);
            }
        }

        
// Stop character (100)
        
$barcodeTable[] = array($this->barThickWidth01);
        
$barcodeTable[] = array($this->barThinWidth,  01);
        
$barcodeTable[] = array($this->barThinWidth,  01);
        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,
            
$this->barHeight $this->factor 1
        
);
        
$point2 $this->rotate(
            
$this->calculateWidth() - 1,
            
$this->barHeight $this->factor 1
        
);
        
$point3 $this->rotate(
            
$this->calculateWidth() - 1,
            
$this->barHeight $this->factor $width
        
);
        
$point4 $this->rotate(
            
0,
            
$this->barHeight $this->factor $width
        
);
        
$this->addPolygon(array(
            
$point1,
            
$point2,
            
$point3,
            
$point4,
        ));
    }
}