<?php
/**
 * File containing the ezcDocumentPcssStyleBorderValue class.
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * @package Document
 * @version //autogen//
 * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 * @access private
 */

/**
 * Style directive border value representation.
 *
 * @package Document
 * @access private
 * @version //autogen//
 */
class ezcDocumentPcssStyleBorderValue extends ezcDocumentPcssStyleValue
{
    /**
     * Default value.
     * 
     * @var array
     */
    protected $defaultValue = array(
        'width' => 0,
        'style'  => 'solid',
        'color' => array(
            'red'   => 1,
            'green' => 1,
            'blue'  => 1,
            'alpha' => 0,
        )
    );

    /**
     * Construct value.
     *
     * Optionally pass a parsed representation of the value.
     * 
     * @param mixed $value 
     */
    public function __construct( $value = null )
    {
        parent::__construct( $value === null ? $this->defaultValue : $value );
    }

    /**
     * Parse value string representation.
     *
     * Parse the string representation of the value into a usable
     * representation.
     * 
     * @param string $value 
     * @return ezcDocumentPcssStyleValue
     */
    public function parse( $value )
    {
        $widthParser = new ezcDocumentPcssStyleMeasureValue();
        $styleParser  = new ezcDocumentPcssStyleLineValue();
        $colorParser = new ezcDocumentPcssStyleColorValue();

        $regexp = '(^\s*' .
            '(?:(?P<width>' . $widthParser->getRegularExpression() . ')\s*)?' .
            '(?:(?P<style>'  . $styleParser->getRegularExpression()  . ')\s*)?' .
            '(?:(?P<color>' . $colorParser->getRegularExpression() . ')\s*)?' .
        '\s*$)';

        if ( !preg_match( $regexp, $value, $match ) )
        {
            throw new ezcDocumentParserException( E_PARSE, "Invalid border specification: " . $value );
        }

        $this->value = $this->defaultValue;
        if ( isset( $match['width'] ) && !empty( $match['width'] ) )
        {
            $this->value['width'] = $widthParser->parse( $match['width'] )->value;
        }

        if ( isset( $match['style'] ) && !empty( $match['style'] ) )
        {
            $this->value['style'] = $styleParser->parse( $match['style'] )->value;
        }

        if ( isset( $match['color'] ) && !empty( $match['color'] ) )
        {
            $this->value['color'] = $colorParser->parse( $match['color'] )->value;
        }

        return $this;
    }

    /**
     * Get regular expression matching the value.
     *
     * Return a regular sub expression, which matches all possible values of
     * this value type. The regular expression should NOT contain any named
     * sub-patterns, since it might be repeatedly embedded in some box parser.
     * 
     * @return string
     */
    public function getRegularExpression()
    {
        $widthParser = new ezcDocumentPcssStyleMeasureValue();
        $styleParser  = new ezcDocumentPcssStyleLineValue();
        $colorParser = new ezcDocumentPcssStyleColorValue();

        return '(?:' .
            '(?:' . $widthParser->getRegularExpression() . '\s*)?' .
            '(?:'  . $styleParser->getRegularExpression()  . '\s*)?' .
            '(?:' . $colorParser->getRegularExpression() . ')?' .
        ')';
    }

    /**
     * Convert value to string.
     *
     * @return string
     */
    public function __toString()
    {
        return 
            new ezcDocumentPcssStyleMeasureValue( $this->value['width'] ) . ' ' .
            new ezcDocumentPcssStyleLineValue( $this->value['style'] ) . ' ' .
            new ezcDocumentPcssStyleColorValue( $this->value['color'] );
    }
}

?>
