<?php

/**
 * A simple CMS menu item.
 *
 * Items can be added to the menu through custom {@link LeftAndMainExtension}
 * classes and {@link CMSMenu}.
 *
 * @see CMSMenu
 *
 * @package framework
 * @subpackage admin
 */
class CMSMenuItem extends Object {

	/**
	 * The (translated) menu title
	 * @var string $title
	 */
	public $title;

	/**
	 * Relative URL
	 * @var string $url
	 */
	public $url;

	/**
	 * Parent controller class name
	 * @var string $controller
	 */
	public $controller;

	/**
	 * Menu priority (sort order)
	 * @var integer $priority
	 */
	public $priority;

	/**
	 * Attributes for the link. For instance, custom data attributes or standard
	 * HTML anchor properties.
	 *
	 * @var string
	 */
	protected $attributes = array();

	/**
	 * Create a new CMS Menu Item
	 *
	 * @param string $title
	 * @param string $url
	 * @param string $controller Controller class name
	 * @param integer $priority The sort priority of the item
	 */
	public function __construct($title, $url, $controller = null, $priority = -1) {
		$this->title = $title;
		$this->url = $url;
		$this->controller = $controller;
		$this->priority = $priority;

		parent::__construct();
	}

	/**
	 * @param array $attributes
	 */
	public function setAttributes($attributes) {
		$this->attributes = $attributes;
	}

	/**
	 * @param array
	 *
	 * @return HTML
	 */
	public function getAttributesHTML($attrs = null) {
		$exclude = (is_string($attrs)) ? func_get_args() : null;

		if(!$attrs || is_string($attrs)) {
			$attrs = $this->attributes;
		}

		// Remove empty
		$attrs = array_filter((array)$attrs, function($v) {
			return ($v || $v === 0 || $v === '0');
		});

		// Create markkup
		$parts = array();

		foreach($attrs as $name => $value) {
			$parts[] = ($value === true) ? "{$name}=\"{$name}\"" : "{$name}=\"" . Convert::raw2att($value) . "\"";
		}

		return implode(' ', $parts);
	}
}