<?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\View\Helper;

abstract class 
AbstractHtmlElement extends AbstractHelper
{
    
/**
     * EOL character
     */
    
const EOL PHP_EOL;

    
/**
     * The tag closing bracket
     *
     * @var string
     */
    
protected $closingBracket null;

    
/**
     * Get the tag closing bracket
     *
     * @return string
     */
    
public function getClosingBracket()
    {
        if (!
$this->closingBracket) {
            if (
$this->isXhtml()) {
                
$this->closingBracket ' />';
            } else {
                
$this->closingBracket '>';
            }
        }

        return 
$this->closingBracket;
    }

    
/**
     * Is doctype XHTML?
     *
     * @return bool
     */
    
protected function isXhtml()
    {
        
$doctype $this->view->plugin('doctype');
        return 
$doctype->isXhtml();
    }

    
/**
     * Converts an associative array to a string of tag attributes.
     *
     * @access public
     *
     * @param array $attribs From this array, each key-value pair is
     * converted to an attribute name and value.
     *
     * @return string The XHTML for the attributes.
     */
    
protected function htmlAttribs($attribs)
    {
        
$xhtml   '';
        
$escaper $this->view->plugin('escapehtml');
        foreach ((array) 
$attribs as $key => $val) {
            
$key $escaper($key);

            if ((
'on' == substr($key02)) || ('constraints' == $key)) {
                
// Don't escape event attributes; _do_ substitute double quotes with singles
                
if (!is_scalar($val)) {
                    
// non-scalar data should be cast to JSON first
                    
$val = \Zend\Json\Json::encode($val);
                }
                
// Escape single quotes inside event attribute values.
                // This will create html, where the attribute value has
                // single quotes around it, and escaped single quotes or
                // non-escaped double quotes inside of it
                
$val str_replace('\'''&#39;'$val);
            } else {
                if (
is_array($val)) {
                    
$val implode(' '$val);
                }
                
$val $escaper($val);
            }

            if (
'id' == $key) {
                
$val $this->normalizeId($val);
            }

            if (
strpos($val'"') !== false) {
                
$xhtml .= $key='$val'";
            } else {
                
$xhtml .= $key=\"$val\"";
            }

        }
        return 
$xhtml;
    }

    
/**
     * Normalize an ID
     *
     * @param  string $value
     * @return string
     */
    
protected function normalizeId($value)
    {
        if (
strstr($value'[')) {
            if (
'[]' == substr($value, -2)) {
                
$value substr($value0strlen($value) - 2);
            }
            
$value trim($value']');
            
$value str_replace('][''-'$value);
            
$value str_replace('[''-'$value);
        }
        return 
$value;
    }
}