<?php

use Resource\Native\String;
use Resource\Collection\Collective;
use Resource\Collection\LinkedList;
use Resource\Collection\LinkedHashMap;

/**
 * The DropdownList Class, extends from abstract GUIContainer class.
 * It specifies a standard single-item dropdown list.
 * @category Resource
 * @package GUI
 * @author Hall of Famer 
 * @copyright Mysidia Adoptables Script
 * @link http://www.mysidiaadoptables.com
 * @since 1.3.3
 * @todo Not much at this point.
 *
 */

class DropdownList extends GUIContainer{
	
	/**
	 * The autofocus property, checks if the input component is autofocused.
	 * @access protected
	 * @var Boolean
    */
	protected $autofocus = FALSE;
	
	/**
	 * The disabled property, checks if the input component is disabled.
	 * @access protected
	 * @var Boolean
    */
	protected $disabled = FALSE;
	
    /**
     * Constructor of SelectList Class, which assigns basic property to this list
	 * @param String  $name
	 * @param ArrayList  $components
	 * @param String  $identity
	 * @param Event  $event
     * @access public
     * @return Void
     */
	public function __construct($name = "", $components = "", $identity = "", $event = ""){
	    if(!empty($name)){
		    $this->setName($name);
			$this->setID($name);
		}
		if(!empty($identity)) $this->select($identity);
		if(!empty($event)) $this->setEvent($event);
		
		parent::__construct($components);
        $this->renderer = new ListRenderer($this);		
	}
	
	/**
     * The isAutofocus method, getter method for property $autofocus.    
     * @access public
     * @return Boolean
     */
	public function isAutofocus(){
	    return $this->autofocus;    
	}

	/**
     * The setAutofocus method, setter method for property $autofocus.
	 * @param Boolean  $autofocus      
     * @access public
     * @return Void
     */
	public function setAutofocus($autofocus = TRUE){
	    $this->autofocus = $autofocus;
		$this->setAttributes("Autofocus");
	}	
	
	/**
     * The isDisabled method, getter method for property $disabled.    
     * @access public
     * @return Boolean
     */
	public function isDisabled(){
	    return $this->disabled; 
	}

	/**
     * The setDisabled method, setter method for property $disabled.
	 * @param Boolean  $disabled       
     * @access public
     * @return Void
     */
	public function setDisabled($disabled = TRUE){
	    $this->disabled = $disabled;
		$this->setAttributes("Disabled");
	}

	/**
     * The add method, sets an Option Object to a specific index.
	 * @param Option|OptGroup  $option
     * @param int  $index	 
     * @access public
     * @return Void
     */	
	public function add(GUIComponent $option, $index = -1){
	    if(!($option instanceof Option) and !($option instanceof OptGroup)) throw new GUIException("Cannot add a non-option type component to dropdown list.");
	    parent::add($option, $index);			
	}
	
	/**
     * The select method, determines which option in this list should be set selected.
	 * @param String  $identity   
     * @access public
     * @return Void
     */
	public function select($identity){
	    foreach($this->components as $components){
		    if($components->getValue() == $identity) $components->setSelected(TRUE);
		}		
	}
	
	/**
     * The fill method, fill in this dropdownlist with options from database starting at a given index.
	 * To use it, you need PDO or MySQLi to fetch all rows with one or two properties to serve as collection list or map.
	 * @param Collective $collection
	 * @param String  $identity
     * @param Int  $index	 
     * @access public
     * @return Void
     */
	public function fill(Collective $collection, $identity = "", $index = -1){
		if($index != -1) $this->currentIndex = $index;		
		if($collection instanceof LinkedList) $this->fillList($collection, $identity, $index);
        elseif($collection instanceof LinkedHashMap) $this->fillMap($collection, $identity, $index);
        else throw new GUIException("Cannot fill option objects inside this dropdownlist");
	}

	/**
     * The fillList method, fill in this dropdownlist with elements from a LinkedList.
	 * @param LinkedList  $list
	 * @param String  $identity
     * @param Int  $index	 
     * @access protected
     * @return Void
     */
    protected function fillList(LinkedList $list, $identity = "", $index = -1){
        $iterator = $list->iterator();
        while($iterator->hasNext()){
            $field = (string)$iterator->next();
 		    $option = new Option($field, $field);
			if($option->getValue() == $identity) $option->setSelected(TRUE);
		    $this->add($option, $index);
			if($index != -1) $index++;           
        }        
    }

	/**
     * The fillList method, fill in this dropdownlist with entries from a LinkedHashMap.
	 * @param LinkedHashMap  $map
	 * @param String  $identity
     * @param Int  $index	 
     * @access protected
     * @return Void
     */
    protected function fillMap(LinkedHashMap $map, $identity = "", $index = -1){
        $iterator = $map->iterator();
        while($iterator->hasNext()){
            $field = $iterator->next();
 		    $option = new Option((string)$field->getKey(), (string)$field->getValue()); 
			if($option->getValue() == $identity) $option->setSelected(TRUE);
		    $this->add($option, $index);
			if($index != -1) $index++;           
        }        
    }

	/**
     * Magic method __toString for DropdownList class, it reveals that the object is a dropdown list.
     * @access public
     * @return String
     */
    public function __toString(){
	    return new String("This is an instance of Mysidia DropDownList class.");
	}    
}    
?>