<?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 lc_album_main extends ModuleTools
{
	public $validation=1;
	public $maxfilesize=5242880;//5*1024*1024;
    //комментарии к альбомам имеют другой ключ
    protected $album_comments_type=2;
	
	public function __construct()
	{
		$this->validation=HTML_QuickForm2_Rule::SERVER | HTML_QuickForm2_Rule::CLIENT;
	}
	
	public function lc_list()
	{
		$albums=$this->_getAlbumsObj();
		self::_assign('albums', $albums->getList(@$_GET['var1']));
		self::_assign('pager', $albums->pager);
		self::_setTpl('albums');
	}
	
	//манипуляции с альбомом
	
	public function lc_album()
	{
		if (!$album=$this->_getAlbumObj($_GET['var1'])) return;
		$imgs=$this->_getImagesObj();
		if (isset($_GET['data_type']) && $_GET['data_type']=='xml') {
			$imgs->items_at_page=$imgs->total=500;
			self::_setTpl('album.xml');
		} elseif (isset($_GET['data_type']) && $_GET['data_type']=='json') {
			$imgs->items_at_page=$imgs->total=500;
			$images=$imgs->getListByAlbum($album);
			foreach ($images as $img) {
				$result['images'][]=$img->files['original'];
				$result['thumbs'][]=$img->files['small'];
				$result['titles'][]=$img->name?$img->name:'';
			}
			$result['name']=$album->name;
			echo real_json_encode($result);
			exit;
		} else {
			self::_setTpl('album');
		}
		self::_assign('images', $imgs->getListByAlbum($album, @$_GET['var2']));
		self::_assign('pager', $imgs->pager);
		self::_assign('album', $album);

		if (config::get('use_album_comments')) {
			$mObject=Factory::create('lc_comments.api');
			$item=$mObject->getCommentsItem($album->id, _url($album->id, 'album'), $album->name, $this->album_comments_type);
			$comments=$item->getComments();
			self::_assign('comment_votes', $item->getUserItemVotes());
			self::_assign('comments', $comments);
			self::_assign('comments_item', $item);
		}
		addBreadcrumb($album->name, _url($album->id, 'album'));
	}
	
	public function lc_album_add()
	{
		if (!access('admin')) LabCMS::i()->error403();

		$form=$this->_buildAlbumForm();
		
		if ($form->validate()) {
			$album=$this->_getAlbumObj();
			if ($new=$album->addAlbum($form->getValue())) {
				refresh('', _url(array($new->id, 1), 'album'));
			}
		}

		self::_assign('form', $this->_renderForm($form));
		self::_setTpl('form');
		addBreadcrumb(_m('Добавление альбома'));
	}
	
	public function lc_album_edit()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if (!$album=$this->_getAlbumObj($_GET['var1'])) return;
		
		$form=$this->_buildAlbumForm();
		if ($form->validate()) {
			$album->update($form->getValue());
			refresh('', _url($album->id, 'album'));
		}
		$form->addDataSource(
			Factory::create(
				'HTML_QuickForm2_DataSource_Array', 
				array('name'=>$album->name, 'describe'=>$album->describe)
			)
		);
		self::_assign('form', $this->_renderForm($form));
		self::_setTpl('form');
		
		addBreadcrumb($album->name, _url($album->id, 'album'));
		addBreadcrumb(_m('Редактирование альбома'));
	}
	
	public function lc_album_delete()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if (!User::checkToken($_GET['token'], false)) return false;
		if (!$album=$this->_getAlbumObj($_GET['var1'])) return;

		$mObject=Factory::create('lc_comments.api');
		$mObject->deleteItem($album->id, $this->album_comments_type);
		$album->delete();
		refresh();
	}
	
	public function lc_set_logo()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if (!User::checkToken($_GET['token'], false)) return false;
		if (!$img=$this->_getImageObj($_GET['var1'])) return;
		$album=$this->_getAlbumObj($img->album_id);
		if ($album->setLogo($img)) refresh('', _url($album->id, 'album'));
	}
	
	public function lc_image_sort()
	{
		if (!access('admin')) LabCMS::i()->error403();
		$imgs=$this->_getImagesObj();
		if ($_SERVER['REQUEST_METHOD']=='POST') {
			if (!User::checkToken($_GET['token'], false)) return false;
			$imgs=$this->_getImagesObj();
			$imgs->setSort($_POST['sort']);
		}
		if (!$album=$this->_getAlbumObj($_GET['var1'])) return;
		
		$imgs->items_at_page=$imgs->total=500;
		self::_setTpl('album.xml');
		self::_assign('album', $album);
		self::_assign('images', $imgs->getListByAlbum($album, @$_GET['var2']));
		self::_setTpl('sorter');
		addBreadcrumb($album->name, _url($album->album_id, 'album'));
		addBreadcrumb(_m('Сортировка изображений'));
	}
	
	public function lc_album_up()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if (!User::checkToken($_GET['token'], false)) return false;
		if (!$album=$this->_getAlbumObj($_GET['var1'])) return;
		$album->moveUp();
		//возвращаемся на ту же страницу списка альбомов
		refresh('', _url($_GET['var2']));
	}
	
	public function lc_album_down()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if (!User::checkToken($_GET['token'], false)) return false;
		if (!$album=$this->_getAlbumObj($_GET['var1'])) return;
		$album->moveDown();
		//возвращаемся на ту же страницу списка альбомов
		refresh('', _url($_GET['var2']));
	}
	
	//манипуляции с изображением
	
	public function lc_image()
	{
		if (!$img=$this->_getImageObj($_GET['var1'])) return;
		self::_assign('album', $img->album);
		self::_assign('image', $img);
		self::_assign('next', $img->getNext());
		self::_assign('prev', $img->getPrev());
		self::_setTpl('image');
		
		if (config::get('image_rating_enable')) {
			$voter=Rating_Generic::init();
			self::_assign('image_votes', $voter->getUserItemVotes($img->id, 2)); //TODO: 2 - тип фото
		}
		
		if (config::get('use_image_comments')) {

			$mObject=Factory::create('lc_comments.api');
			$item=$mObject->getCommentsItem(
				$img->id, _url($img->id, 'image'), $img->album->name.' / '.($img->name?$img->name:'***')
			);
			$comments=$item->getComments();
			self::_assign('comment_votes', $item->getUserItemVotes());
			self::_assign('comments', $comments);
			self::_assign('comments_item', $item);
		}
		addBreadcrumb($img->album->name, _url($img->album->id, 'album'));
		addBreadcrumb($img->name?$img->name:'***', _url($img->id, 'image'));
	}
	
	public function lc_image_add()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if (!$album=$this->_getAlbumObj($_GET['var1'])) return;
		//костыль для испрвления неправильного mime-type отдаваемого флешем
		if ($_SERVER['REQUEST_METHOD']=='POST' && $_FILES['Filedata'])
			$_FILES['Filedata']['type']=$this->get_mime_type($_FILES['Filedata']);

		$form=$this->_buildUploadForm();

		if ($form->validate()) {
			$img=$this->_getImageObj();
			$info=$img->addImage($form->getValue(), $album->id);
			if ($info) {
				
				//если у альбома еще нет логотипа - устанавливаем его
				if (!$album->logo) {
					$img=$this->_getImageObj($info['image_id']);
					$album->setLogo($img);
				}
				if (LabCMS::i()->isAjax()) {
					$info['status']=1;
					echo real_json_encode($info);
					exit;
				}
				else
					refresh('', _url($info['image_id'], 'image'));
			}
		}
		
		if (LabCMS::i()->isAjax() && LabCMS::i()->errors) {
			echo real_json_encode(array('error'=>LabCMS::i()->errors[0]));
			exit;
		}
		
		$session_name=ini_get('session.name');
		if (!$session_name) $session_name='PHPSESSID';
		self::_assign('session_name', $session_name);
		self::_assign('album', $album);
		self::_setTpl('upload');
		self::_assign('form', $this->_renderForm($form));
		addBreadcrumb($album->name, _url($album->id, 'album'));
		addBreadcrumb(_m('Добавление изображения'));

	}
	
	public function lc_image_edit()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if (!$img=$this->_getImageObj($_GET['var1'])) return;
		$form=$this->_buildImageForm($img);
		if ($form->validate()) {
			$result=$img->editImage($form->getValue());
			if ($result=='next') {
				if ($next=$img->getNext()) $url=_url($next->id, 'image_edit');
				else $url=_url($img->album_id, 'album');
			}
			elseif ($result=='save') $url=_url($img->id, 'image');
			if ($url) refresh('', $url);
		}

		self::_setTpl('form');
		self::_assign('image', $img);
		self::_assign('album', $img->album);
		self::_assign('form', $this->_renderForm($form));
		
		addBreadcrumb($img->album->name, _url($img->album->album_id, 'album'));
		addBreadcrumb($img->name?$img->name:'***', _url($img->id, 'image'));
		addBreadcrumb(_m('Редактирование изображения'));
	}
	
	public function lc_image_delete()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if (!User::checkToken($_GET['token'], false)) return false;
		if (!$img=$this->_getImageObj($_GET['var1'])) return;
		if (!$image=$img->getNext()) $image=$img->getPrev();
		
		$mObject=Factory::create('lc_comments.api');
		$mObject->deleteItem($img->id);
		
		$img->deleteImage();
		if ($image->id) refresh('', _url($image->id, 'image'));
		refresh('', _url($img->album_id, 'album'));
	}
	
	public function lc_image_vote_ajax()
	{
		if (!User::checkToken($_POST['token'], false)) $this->_json_error();
		if (!$img=$this->_getImageObj($_POST['item_id'])) return;
		if ($json_response=$img->vote($_POST['vote']))	echo real_json_encode($json_response);
		else $this->_json_error();
		exit;
	}
	
	//построение форм
	
	protected function _buildAlbumForm()
	{
		$form = Factory::create('HTML_QuickForm2', null, 'post', array('action'=>'#'));
		$token=$form->addElement('hidden', 'token', array('value'=>User::i()->token));
		$frame=$form->addElement('fieldset')->setLabel(_m('Редактирование альбома'));
		$name=$frame->addElement('text', 'name', null, array('label' => _m('Название:')));
		$descr=$frame->addElement(
			'textarea',
			'describe',
			array('class'=>'bbcode',  'rows'=>'10', 'cols'=>'50'),
			array('label' => _m('Описание:'))
		);
		$submit=$frame->addElement('submit', null, array('value'=>_m('Сохранить')));
		
		$name->addRule(
			'required',
			_m('Название альбома не может быть пустым'),
			null,
			$this->validation
		);
		return $form;
	}
	
	protected function _buildUploadForm()
	{
		$form = Factory::create('HTML_QuickForm2', null, 'post', array('action'=>'#', 'enctype'=>'multipart/form-data'));
		$token=$form->addElement('hidden', 'token', array('value'=>User::i()->token));
		$frame=$form->addElement('fieldset')->setLabel(_m('Загрузка изображения'));
		$file=$frame->addElement('file', 'Filedata', null, array('label'=>_m('Выберите файл')));

		$name=$frame->addElement('text', 'name', null, array('label' => _m('Название:')));
		$descr=$frame->addElement('textarea', 'describe', null, array('label' => _m('Описание:')));
		$submit=$frame->addElement('submit', null, array('value'=>_m('Загрузить')));
		
		$file->addRule('required', _m('Необходимо указать файл'), null, $this->validation);

		$file->addRule(
			'mimetype', _m('Данный тип файла не поддерживается'),
			array('image/gif', 'image/png', 'image/jpeg', 'image/pjpeg')
		);
		$file->addRule(
			'maxfilesize',
			sprintf(
				_m('Файл слишком большой. Разрешены файлы не больше %s'),
				get_formatted_filesize($this->maxfilesize)
			),
			$this->maxfilesize
		);
		return $form;
	}
	
	protected function _buildImageForm($img)
	{
		$form = Factory::create('HTML_QuickForm2', null, 'post', array('action'=>'', 'enctype'=>'multipart/form-data'));
		$token=$form->addElement('hidden', 'token', array('value'=>User::i()->token));
		$frame=$form->addElement('fieldset')->setLabel(_m('Редактирование изображения'));
		$frame->addElement('static', 'img', null, array('content'=>'<img src="'.$img->files['small'].'" alt="" />'));

		$name=$frame->addElement('text', 'name', null, array('label' => _m('Название:')));
		$descr=$frame->addElement(
			'textarea',
			'describe',
			array('class'=>'bbcode',  'rows'=>'10', 'cols'=>'50'),
			array('label' => _m('Описание:'))
		);
		$file=$frame->addElement('file', 'Filedata', null, array('label'=>_m('Заменить файл')));
		$frame->addElement(
			'select',
			'album_id',
			null,
			array('label'=>_m('Переместить в альбом'),
			'options'=>$this->_getAlbumsObj()->getAll())
		);
		
		$submit=$frame->addElement('submit', 'save', array('value'=>_m('Сохранить')));
		$submit=$frame->addElement('submit', 'next', array('value'=>_m('Сохранить и перейти к следующему')));
		
		$file->addRule(
			'mimetype', _m('Данный тип файла не поддерживается'),
			array('image/gif', 'image/png', 'image/jpeg', 'image/pjpeg')
		);
		$file->addRule(
			'maxfilesize',
			sprintf(
				_m('Файл слишком большой. Разрешены файлы не больше %s'),
				$this->maxfilesize
			),
			$this->maxfilesize
		);
		
		$form->addDataSource(
			Factory::create(
				'HTML_QuickForm2_DataSource_Array', 
				array('name'=>$img->name, 'describe'=>$img->describe, 'album_id'=>$img->album_id)
			)
		);
		return $form;
	}
	
	//вспомогательные методы
	
	protected function _json_error($msg=false)
	{
		if ($msg) echo real_json_encode(array('error'=>$msg));
		else echo real_json_encode(array('error'=>LabCMS::i()->errors[0]));
		exit; 
	}
	
	protected function get_mime_type($file)
	{
		$fileinfo = @getimagesize($file['tmp_name']);
		if ($fileinfo) {
			return $fileinfo['mime'];
		}
		return $file['type'];
	}
	
	protected function _getAlbumObj($album_id=null)
	{
		$album=Factory::create('lc_album.album', $album_id);
		if ($album_id && null==$album->id) return self::_error(_m('Альбом не найден'));
		return $album;
	}
	
	protected function _getAlbumsObj()
	{
		return Factory::create('lc_album.albums');
	}
	
	protected function _getImageObj($image_id=null)
	{
		$img=Factory::create('lc_album.image', $image_id);
		if ($image_id && null==$img->id) return self::_error(_m('Изображение не найдено'));
		return $img;
	}
	
	protected function _getImagesObj()
	{
		return Factory::create('lc_album.images');
	}
}