<?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 feedback_form
{
	public function __construct()
	{
		$this->mapper=Factory::create('feedback.mapper');
	}

	public function getFormById($id)
	{
		if ($data=$this->getFormDataById($id)) {

			return $this->_createForm($data);
		}
		return $this->getDefaultForm();
	}

	public function getFormDataById($id)
	{
		return $this->mapper->getFormDataById($id);
	}

	public function addElement($tree_id, $data)
	{
		$this->mapper->addElement($tree_id, $data);
	}

	public function getElementById($id)
	{
		return $this->mapper->getElementById($id);
	}

	public function move_up($id)
	{
		$this->mapper->move_up($id);
	}

	public function move_down($id)
	{
		$this->mapper->move_down($id);
	}

	public function delete($id)
	{
		$this->mapper->delete($id);
	}

	public function updateElement($id, $data)
	{
		$this->mapper->updateElement($id, $data);
	}

	public function getDefaultForm()
	{
		$data=array(
			array(
				'type'=>'text',
				'title'=>'Ваше имя',
				'required'=>'1',
			),
			array(
				'type'=>'email',
				'title'=>'Email',
				'required'=>'1',
			),
			array(
				'type'=>'textarea',
				'title'=>'Сообщение',
				'required'=>'1',
			)
		);
		return $this->_createForm($data);
	}

	public function getEditForm($data=null)
	{
		$options=array(
			'text'=>'Текстовое поле',
			'textarea'=>'Многострочное текстовое поле',
			'email'=>'Email',
			'select'=>'Список',
			'checkbox'=>'Чекбокс',
			'file'=>'Файл',
			'static'=>'Произвольный текст'
		);
		$form = Factory::create('HTML_QuickForm2', '', 'post', array('action'=>''));
		$type=$form->addElement('select', 'type', array('id'=>'type', 'onchange'=>'checkForm()'), array('label'=>'Тип', 'options'=>$options));
		$title=$form->addElement('text', 'title', null, array('label'=>'Название'));
		$required=$form->addElement('checkbox', 'required', array('id'=>'required'), array('label'=>'Обязательное'));
		$options=$form->addElement('textarea', 'options', array('id'=>'options'), array('label'=>'&nbsp;'));
		$form->addElement('hidden', 'token', array('value'=>User::i()->token));
		$form->addElement('submit', '', array('value'=>'Сохранить'));

		$form->addElement('script', '', null, array('content'=>$this->getItemJS()));

		$title->addRule('required', _m('Данное поле необходимо заполнить'), null, 3);

		if ($data) $form->addDataSource(Factory::create('HTML_QuickForm2_DataSource_Array', $data));

		return $form;
	}

	protected function getItemJS()
	{
		$html=<<<HTML

		var checkbox=document.getElementById('required');
		var textarea=document.getElementById('options');
		var div = document.createElement('div');
		textarea.parentNode.appendChild(div);

		function checkForm() {
			type=document.getElementById('type').value;
			switch(type) {
				case('static'):
					textarea.disabled=false;
					checkbox.disabled=true;
					div.innerHTML='Укажите текст для отображения';
					break;
				case('select'):
					textarea.disabled=checkbox.disabled=false;
					div.innerHTML='Укажите пункты списка (каждый с новой строки)';
					break;
				case('file'):
					textarea.disabled=false;
					checkbox.disabled=true;
					textarea.disabled =false;
					div.innerHTML='Укажите через запятую типы файлов доступных для загрузки';
					break;
				default:
					checkbox.disabled=false;
					textarea.disabled =true;
					div.innerHTML='&nbsp;';
			}
		}
		checkForm();


HTML;
		return $html;
	}

	protected function _createForm($data)
	{
		$form = Factory::create('HTML_QuickForm2', '', 'post', array('action'=>''));
		foreach ($data as $key=>$item) {
			switch($item['type']) {
				case('select'):
					$element=$form->addElement('select', 'element_'.$key, null, array('label'=>$item['title'], 'options'=>preg_split('/[\r\n]+/', $item['options'])));
					break;
				case('static'):
					$element=$form->addElement('static', 'element_'.$key, null, array('content'=>$item['options']));
					break;
				case('file'):
					$element=$form->addElement('file', 'element_'.$key, null, array('label'=>$item['title']));
					$element->addRule('MaxFileSize', _m('Разрешены файлы не более 3Mb'), 3*1024*1024);
					if ($item['options']) {
						$element->setAttribute('accept', $item['options']);
						$element->setNote('Допустимые типы файлов: '.$item['options']);
						$element->addRule(
							'callback',
							_m('Неразрешенный тип файла!'),
							array('callback'=>array($this, 'checkFileExtention'), 'arguments'=>array($item['options']))
						);

					}
					break;
				default:
					$element=$form->addElement($item['type'], 'element_'.$key, null, array('label'=>$item['title']));
			}
			if (!empty($item['required'])) $element->addRule('required', _m('Данное поле необходимо заполнить'), null, 3);
		}

		$form->addElement('hidden', 'token', array('value'=>User::i()->token));
		$form->addElement('submit', '', array('value'=>'Отправить'));
		return $form;
	}

	public function getFormLabels($form)
	{
		$allow=array('text', 'textarea', 'email', 'select', 'checkbox', 'file');
		$result=array();
		foreach ($form as $item) {
			if (!in_array($item->getType(), $allow)) continue;
			$result[$item->getName()]=$item->getLabel();
		}
		return $result;
	}

	public function checkFileExtention($file, $rules)
	{
		$rules=explode(',', str_replace('.', '', strtolower($rules)));
		if (isset($file['name'])) {
			$ext=strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
			if (in_array($ext, $rules)) return true;
		}
		return false;
	}
}