<?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
{
	public $validation=1;
	
	static $tn=array(
					'small'=>array('path'=>'/small', 'width'=>160, 'height'=>160, 'crop'=>true, 'type'=>false),
					'middle'=>array('path'=>'/middle', 'width'=>500, 'height'=>500, 'crop'=>false, 'type'=>false),
					'original'=>array('path'=>'/original', 'width'=>1024, 'height'=>1024, 'crop'=>false, 'type'=>false)
					);
	static $basepath='/storage/Image/lc_album';
	static $logo_path='/logo';
	
	public function __construct()
	{
		$this->validation=HTML_QuickForm2_Rule::SERVER | HTML_QuickForm2_Rule::CLIENT;
	}
	
	public function lc_list()
	{
		$albums=new lc_album_albums(@$_GET['var1']);
		$this->_assign('albums', $albums->getList());
		$this->_assign('pager', $albums->pager);
		$this->_setTpl('albums');
	}
	
	//манипуляции с альбомом
	
	public function lc_album()
	{
		$album=new lc_album_album($_GET['var1']);
		if (!$album->id) return LabCMS::i()->error("Альбом не найден");
		$imgs=new lc_album_images(@$_GET['var2']);
		$imgs->album_id=$album->id;
		if ($_GET['data_type']=='xml')
		{
			$imgs->items_at_page=$imgs->total=500;
			$this->_setTpl('album.xml');
		}
		else
		{
			$this->_setTpl('album');
		}
		$this->_assign('images', $imgs->getList());
		$this->_assign('pager', $imgs->pager);
		$this->_assign('album', $album);
		
		if (LabConfig::$mcfg['use_album_comments'])
		{
			$comments=CommentTools::getComments($album->id, _url($album->id, 'album'));
			Tpl::i()->assign('comments', $comments);
		}
		addBreadcrumb($album->name, _url($album->id, 'album'));
	}
	
	public function lc_album_add()
	{
		if (!access('admin')) LabCMS::i()->error403();

		$form=$this->_buildAlbumForm();
		
		if ($form->validate())
		{
			if ($album_id=lc_album_album::addAlbum($form->getValue()))
			{
				refresh('', LabCMS::i()->url(array($album_id, 1), 'album'));
			}
		}

		$this->_assign('form', $this->_render($form));
		$this->_setTpl('form');
		addBreadcrumb('Добавление альбома');
	}
	
	public function lc_album_edit()
	{
		if (!access('admin')) LabCMS::i()->error403();
		$album=new lc_album_album($_GET['var1']);
		if (!$album->id) return LabCMS::i()->error("Альбом не найден");
		
		$form=$this->_buildAlbumForm();
		if ($form->validate())
		{
			$album->editAlbum($form->getValue());
			refresh('', _url($album->id, 'album'));
		}
		$form->addDataSource(new HTML_QuickForm2_DataSource_Array(array('name'=>$album->name, 'describe'=>$album->describe)));
		$this->_assign('form', $this->_render($form));
		$this->_setTpl('form');
		
		addBreadcrumb($album->name, _url($album->id, 'album'));
		addBreadcrumb('Редактирование альбома');
	}
	
	public function lc_album_delete()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if (!User::checkToken($_GET['token'], false)) return false;
		$album=new lc_album_album($_GET['var1']);
		if (empty($album->id)) return LabCMS::i()->error("Альбом не найден");
		$album->deleteAlbum();
		refresh();
	}
	
	public function lc_set_logo()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if (!User::checkToken($_GET['token'], false)) return false;
		if ($album_id=lc_album_album::setLogo($_GET['var1'])) refresh('', _url($album_id, 'album'));
	}
	
	public function lc_image_sort()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if ($_SERVER['REQUEST_METHOD']=='POST')
		{
			if (!User::checkToken($_GET['token'], false)) return false;
			lc_album_images::setSort($_POST['sort']);
		}
		$album=new lc_album_album($_GET['var1']);
		if (!$album->id) return LabCMS::i()->error("Альбом не найден");
		$imgs=new lc_album_images(@$_GET['var2']);
		$imgs->album_id=$album->id;
		$imgs->items_at_page=$imgs->total=500;
		$this->_setTpl('album.xml');
		$this->_assign('album', $album);
		$this->_assign('images', $imgs->getList());
		$this->_setTpl('sorter');
		addBreadcrumb($album->name, _url($album->album_id, 'album'));
		addBreadcrumb('Сортировка изображений');
	}
	
	public function lc_album_up()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if (!User::checkToken($_GET['token'], false)) return false;
		$album=new lc_album_album($_GET['var1']);
		$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;
		$album=new lc_album_album($_GET['var1']);
		$album->moveDown();
		refresh('', _url($_GET['var2']));
	}
	
	//манипуляции с изображением
	
	public function lc_image()
	{
		$img=new lc_album_image($_GET['var1']);
		if (empty($img->id)) return LabCMS::i()->error("Изображение не найдено");
		$album=new lc_album_album($img->album_id);
		$this->_assign('album', $album);
		$this->_assign('image', $img);
		$this->_assign('next', $img->getNext());
		$this->_assign('prev', $img->getPrev());
		$this->_setTpl('image');
		
		if (LabConfig::$mcfg['use_image_comments'])
		{
			//первые 10000 значений отведем под альбомы, остальные - под фотографии
			$comments=CommentTools::getComments(($img->id+10000), _url($img->id, 'image'));
			Tpl::i()->assign('comments', $comments);
		}
		addBreadcrumb($album->name, _url($album->id, 'album'));
		addBreadcrumb($img->name?$img->name:'***', _url($img->id, 'image'));
	}
	
	public function lc_image_add()
	{
		if (!access('admin')) LabCMS::i()->error403();
		$album=new lc_album_album($_GET['var1']);
		//костыль для испрвления неправильного mime-type отдаваемого флешем
		if ($_SERVER['REQUEST_METHOD']=='POST' && $_FILES['Filedata'])
			$_FILES['Filedata']['type']=self::get_mime_type($_FILES['Filedata']);

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

	}
	
	public function lc_image_edit()
	{
		if (!access('admin')) LabCMS::i()->error403();
		$img=new lc_album_image($_GET['var1']);
		$album=new lc_album_album($img->album_id);
		$form=$this->_buildImageForm($img);
		if ($form->validate())
		{
			$result=$img->editImage($form->getValue());
			if($result=='next')
			{
				$next_id=Db::i()->selectCell("SELECT image_id FROM ?_lc_album_images WHERE image_id>? AND album_id=?", $img->id, $img->album_id);
				if ($next_id) $url=LabCMS::i()->url($next_id, 'image_edit');
				else $url=LabCMS::i()->url($img->album_id, 'album');
			}
			elseif($result=='save') $url=LabCMS::i()->url($img->id, 'image');
			if ($url) refresh('', $url);
		}
		
		$this->_setTpl('form');
		$this->_assign('image', $img);
		$this->_assign('album', $album);
		$this->_assign('form', $this->_render($form));
		
		addBreadcrumb($album->name, _url($album->album_id, 'album'));
		addBreadcrumb($img->name?$img->name:'***', _url($img->id, 'image'));
		addBreadcrumb('Редактирование изображения');
	}
	
	public function lc_image_delete()
	{
		if (!access('admin')) LabCMS::i()->error403();
		if (!User::checkToken($_GET['token'], false)) return false;
		$img=new lc_album_image($_GET['var1']);
		if (empty($img->id)) return LabCMS::i()->error("Изображение не найдено");
		if (!$image_id=$img->getNext()) $image_id=$img->getPrev();
		$img->deleteImage();
		if ($image_id) refresh('', _url($image_id['id'], 'image'));
		refresh('', _url($img->album_id, 'album'));
	}
	
	//построение форм
	
	protected function _buildAlbumForm()
	{
		$form = new 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('Сохранить')));
		
		$token->addRule('callback', _m('Ошибка сохранения'), array('callback'=>array('User', 'checkToken'), 'arguments'=>array(false)));
		$name->addRule('required', _m('Название альбома не может быть пустым'), null, $this->validation);
		return $form;
	}
	
	protected function _buildUploadForm()
	{
		$form = new 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);
		$token->addRule('callback', _m('Ошибка сохранения'), array('callback'=>array('User', 'checkToken'), 'arguments'=>array(false)));
		$file->addRule('mimetype', _m('Данный тип файла не поддерживается'),
			 array('image/gif', 'image/png', 'image/jpeg', 'image/pjpeg'));
		$file->addRule('maxfilesize', _m('Файл слишком большой. Разрешены файлы не больше 5Мб'), 5*1024*1024);
		return $form;
	}
	
	protected function _buildImageForm($img)
	{
		$form = new 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'=>lc_album_album::getAllAlbums()));
		
		$submit=$frame->addElement('submit', 'save', array('value'=>_m('Сохранить')));
		$submit=$frame->addElement('submit', 'next', array('value'=>_m('Сохранить и перейти к следующему')));
		
		$token->addRule('callback', _m('Ошибка сохранения'), array('callback'=>array('User', 'checkToken'), 'arguments'=>array(false)));
		$file->addRule('mimetype', _m('Данный тип файла не поддерживается'),
			 array('image/gif', 'image/png', 'image/jpeg', 'image/pjpeg'));
		$file->addRule('maxfilesize', _m('Файл слишком большой. Разрешены файлы не больше 5Мб'), 5*1024*1024);
		
		$form->addDataSource(new HTML_QuickForm2_DataSource_Array(array('name'=>$img->name, 'describe'=>$img->describe, 'album_id'=>$img->album_id)));
		return $form;
	}
	
	//вспомогательные методы
	
	protected function _setTpl($tpl='')
	{
		if ($tpl) $tpl.='.tpl';
		LabCMS::i()->setModuleTemplate($tpl);
	}
	
	protected function _render($form)
	{
		$renderer = HTML_QuickForm2_Renderer::factory('labsmarty');
		$html=$form->render($renderer)->toArray();
		if ($this->validation>1)
		{
			LabCMS::i()->skins[LabCMS::i()->getSkin()]['js']=LabCMS::i()->skins[LabCMS::i()->getSkin()]['js']+$renderer->getJavascriptBuilder()->getLibraries(false, false);
		}
		return $html;
	}
	
	protected function _assign($var, $val)
	{
		Tpl::i()->assign($var, $val);
	}
	
	protected static function get_mime_type($file)
	{
		$fileinfo = @getimagesize($file['tmp_name']);
		if ($fileinfo) {
			return $fileinfo['mime'];
		}
		return $file['type'];
	}
}