code: public function generate()
  	{
  		$strOptions = '';
  		$blnHasGroups = false;
  
  		if ($this->multiple)
  		{
  			$this->strName .= '[]';
  		}
  
  		// Make sure there are no multiple options in single mode
  		elseif (\is_array($this->varValue))
  		{
  			$this->varValue = $this->varValue[0];
  		}
  
  		// Add empty option if there are none
  		if (empty($this->arrOptions) || !\is_array($this->arrOptions))
  		{
  			$this->arrOptions = array(array('value'=>'', 'label'=>'-'));
  		}
  
  		foreach ($this->arrOptions as $arrOption)
  		{
  			if ($arrOption['group'])
  			{
  				if ($blnHasGroups)
  				{
  					$strOptions .= '</optgroup>';
  				}
  
  				$strOptions .= sprintf('<optgroup label="%s">',
  										StringUtil::specialchars($arrOption['label']));
  
  				$blnHasGroups = true;
  				continue;
  			}
  
  			$strOptions .= sprintf('<option value="%s"%s>%s</option>',
  									$arrOption['value'],
  									$this->isSelected($arrOption),
  									$arrOption['label']);
  		}
  
  		if ($blnHasGroups)
  		{
  			$strOptions .= '</optgroup>';
  		}
  
  		return sprintf('<select name="%s" id="ctrl_%s" class="%s"%s>%s</select>',
  						$this->strName,
  						$this->strId,
  						$this->class,
  						$this->getAttributes(),
  						$strOptions);
  	}
docs: Generate the widget and return it as string
  
  @return string The widget markup