<?php
/*
* @package LabCMS
* @copyright (c) 2006 Alexander Levin aka Loki (loki_angel@mail.ru)
* @support http://labcms.ru
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/

class admin_users_forms
{
	public $validation=HTML_QuickForm2_Rule::ONBLUR_CLIENT_SERVER;
	public $max_login_length=20;
	public $types=array(	1 => 'gif',
							2 => 'jpg',
							3 => 'png');
	
	public function addUser()
	{
		$form=$this->_getUserForm();
		$form->addElement('submit', null, array('value'=>_m('Создать')));
		
		$form->addDataSource(
			Factory::create(
				'HTML_QuickForm2_DataSource_Array', 
				array('status'=>1, 'group_id'=>2)
			)
		);
		
		return $this->form=$form;
	}

	public function editUser($user)
	{
		$form=$this->_getUserForm($user->id);
		if ($user->avatar) {
			$alabel='<img src="/storage/Image/avatars/'.$user->id
			.'.'.$this->types[$user->avatar].'?'.rand().'" />';
			$form->addElement(
				'checkbox', 'del_avatar', null,
				array('label' => array($alabel, _m('удалить')))
			);
		}
		
		$form->addElement('submit', null, array('value'=>_m('Изменить')));
		$form->addDataSource(
			Factory::create('HTML_QuickForm2_DataSource_Array', $user->getAsArray())
		);
		return $this->form=$form;
	}
	
	protected function _getUserForm($user_id=false)
	{
		$form = Factory::create('HTML_QuickForm2', 'edit_user', 'post', array('action'=>'#'));
		$token=$form->addElement('hidden', 'token', array('value' => User::i()->token));
		
		$login=$form->addElement(
			'text', 'login', array('maxlength'=>$this->max_login_length, 'autocomplete'=>'off'),
			array('label' => 'Логин:')
		);
		$login->addRule('required', _m('Нужно указать логин'), null, $this->validation)
		->and_(
			$login->createRule(
				'maxlength',
				sprintf(
					_m('Логин не может быть длиннее %d символов'),
					$this->max_login_length
				), $this->max_login_length, $this->validation
			)
		)
		->and_(
			$login->createRule(
				'callback', _m('Логин уже занят'),
				array('callback'=>array($this, 'IsLoginNotExists'),
				'arguments'=>array($user_id))
			)
		);
		
		$email=$form->addElement('email', 'email', array('maxlength'=>50), array('label' => 'Email:'));
		$this->_addEmailRules($email, $user_id);

		$pass=$form->addElement('password', 'new_pass', null, array('label' => 'Пароль:'));
				
		$realname=$form->addElement('text', 'realname', null, array('label' => _m('Настоящее имя:')));
		$website=$form->addElement('text', 'website', null, array('label' => _m('Домашняя страница:')));
		$icq=$form->addElement('text', 'icq', null, array('label' => _m('ICQ:')));

		$groups=$this->_getGroupsTree();
		$group_id=$form->addElement('select', 'group_id', null, array('label'=>_m('Группа'), 'value'=>2));
		foreach ($groups as $id=>$data) {
			$group_id->addOption($data['name_html'], $id, ($id==-1)?array('disabled'=>'disabled'):null);
		}
		$status=$form->addElement(
			'select', 'status', null,
			array('options' => array(
				-1=>_m('удален'), 0=>_m('Не активирован'), 1=>_m('Активирован')
			), 'label'=>_m('Статус:'))
		);
		 
		return $form;
	}
	
	/**
	 * проверяет есть ли такой логин
	 * 
	 * @param string $login логин
	 * 
	 * @return boolean  результат поиска
	 */
	public function IsLoginNotExists($login, $user_id)
	{
		if ($count=User::i()->IsLoginExists($login)) {
			
			if ($count>1) {
				//если найдено больше одного логина
				return false;
			} elseif ($count && !$user_id) {
				//если найден хоть один логин при добавлении пользователя
				return false;
			} elseif ($count==1 && $user_id) {
				//если найден один логин при редактировании
				$user=User::getUser();
				$user->loadUserDataByID($user_id);
				if ($login!=$user->login) return false;
			}
		}
		return true;
	}

	
	/**
	 * добавление клиент-серверных правил проверки email
	 * 
	 * @param object $email    объект поля email
	 * @param boolean $required является ли поле обязательным (если разрешено OpenId, то может быть необязательным)
	 * 
	 * @return объект поля email
	 */
	protected function _addEmailRules(&$email, $user_id)
	{
		$email->addRule(
			'callback', _m('Этот email уже используется.'),
			array('callback'=>array($this, 'isEmailNotExists'),
			'arguments'=>array($user_id))
		);
		$email->addRule('maxlength', sprintf(_m('Email не может быть длиннее %d символов'), 50), 50, $this->validation)
		->and_(
			$email->createRule(
				'regex', _m('Сдается нам, таких email-ов не бывает'),
				'/\b[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b/i',
				$this->validation
			)
		);
	}
	
	/**
	 * проверяет зарегистрирован ли такой email
	 * 
	 * @param sting $email email адрес
	 * 
	 * @return boolean    результат поиска
	 */
	public function IsEmailNotExists($email, $user_id=0)
	{
		//админу позволительно указывать пустые адреса
		if (!trim($email)) return true;
		if (
			Db::i()->selectCell(
				"SELECT COUNT(user_id) FROM ?_users
				WHERE email=? AND user_id!=?",
				trim($email), $user_id
			)
		) return false;
		else return true;
	}
	
	protected function _getGroupsTree($parent_id=0, $level=0, &$groups=array())
	{
		$result=Db::i()->select(
			"SELECT group_id, group_name FROM ?_groups WHERE parent_id=? ORDER BY group_name",
			$parent_id
		);
		if (is_array($result)) {
			foreach ($result as $group) {
				$margin="";
				for($i=0; $i<$level*3; $i++) $margin.="&nbsp;";
				$groups[$group['group_id']]=array(
					'name_html'=>$margin.htmlspecialchars($group['group_name']),
					'disabled'=>($group['group_id']==-1));
				$this->_getGroupsTree($group['group_id'], $level+1, $groups);
			}
			return $groups;
		}
	}
	
	/**
	 * рисует форму
	 * 
	 * @return string    html представление формы
	 */
	public function render($form=null)
	{
		if (!$form) $form=$this->form;
		
		$renderer = HTML_QuickForm2_Renderer::factory(config::get('core.form_renderer'));
		$renderer=$form->render($renderer);
		LabCMS::i()->skins[LabCMS::i()->getSkin()]['js']=
			LabCMS::i()->skins[LabCMS::i()->getSkin()]['js']
			+$renderer->getJSLibs(false, false);
		return $renderer;
	}
}