<?php

namespace Neag\MainBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Response; 
use Neag\MainBundle\Entity\User;
use Neag\MainBundle\Entity\UserSession;
use Neag\MainBundle\Entity\SimplePagePage;
use Neag\MainBundle\Entity\SimplePagePageRevision;
use Neag\MainBundle\Entity\Article;
use Neag\MainBundle\Entity\Person;
use Neag\MainBundle\Entity\PersonArticle;
use Neag\MainBundle\Entity\Tag;
use Neag\MainBundle\Entity\TagSynonym;
use Neag\MainBundle\Entity\TagArticle;
use Neag\MainBundle\Entity\Category;
use Neag\MainBundle\Entity\SubscribePage;
use Symfony\Component\Form\FormError;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Exception\IOException; 

class UserController extends ControllerAbstract
{
    /**
     * @Route("/registration")
     * @Template("NeagMainBundle:User:registration.html.twig")
     */
    public function registrationAction()
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile(); 
        $templating = $this->get('templating');
        
        $desktop_link = $this->generateURL('registration', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('registration_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
       
        $user = new User; 
        $user->setDescription('');
        $user->setContacts('');
        $user->setMailAllow(true);
        
        $form = $this->getProfileForm($user, true);
        
        $request = $this->getRequest();        
        
        if ($request->isMethod('POST')) {
            $submitted_values = $_POST[$form->getName()];  
            $form->bind($request);            
            $this->securityValidateForm($form, $submitted_values); 
            // Удаление старых пользователей, не подтвердивших регистрацию и не прошедших авторизацию
            $query = $this->getDoctrine()->getManager()->createQueryBuilder()
            ->select(Array('u'))
            ->from('NeagMainBundle:User', 'u')
            ->where('u.emailConfirmToken IS NOT NULL')
            ->andWhere('u.timeLogin IS NULL')
            ->andWhere('u.timeRegistration < :limit')
            ->andWhere('u.vkId IS NULL')
            ->andWhere('u.fbId IS NULL')
            ->setParameter('limit', new \DateTime(date('Y-m-d H:i:s', time()-3600*24)))
            ->getQuery(); 
            $rows = $query->getResult();
            if (!empty($rows)) {
                foreach ($rows as $row) {
                    $em = $this->getDoctrine()->getManager();                
                    $em->remove($row);
                    $em->flush();
                }
            }    
            // Проверка e-mail
            if (!filter_var($submitted_values['email'], FILTER_VALIDATE_EMAIL)) {
                $error = new FormError("Некорректно указан e-mail");
                $form->get('email')->addError($error);
            } else {
                // Проверка повторного ввода
                if (!empty($submitted_values['email2']) ? ($submitted_values['email2'] == $submitted_values['email']) : false) {
                    // Проверка дубля e-mail
                    $query = $this->getDoctrine()->getManager()->createQueryBuilder()
                    ->select(Array('u'))
                    ->from('NeagMainBundle:User', 'u')
                    ->where('u.email = :email')
                    ->setParameter('email', trim($submitted_values['email']))
                    ->getQuery(); 
                    $rows = $query->getResult();
                    if (!empty($rows)) {
                        // Пользователь с таким e-mail уже зарегистрирован
                        $user = $rows[0];
                        $error = new FormError("Пользователь с таким e-mail уже зарегистрирован.");                    
                        $form->get('email')->addError($error);
                        if ($user->getEmailConfirmToken() == null) {
                            // Подтвердил регистрацию                                                
                        } else {
                            // Не подтвердил регистрацию
                            if (!$globals->isMobile()) {
                                $link = $this->generateURL('registration_email_resend');
                                $feedback_link = $this->generateURL('feedback');
                            } else {
                                $link = $this->generateURL('registration_email_resend_m');
                                $feedback_link = $this->generateURL('feedback_m');
                            }
                            $this->message('Возможно, вы уже проходили процедуру регистрации, но не подтвердили e-mail. Попробуйте <a href="'.htmlspecialchars($link).'">сделать запрос на повторную отправку письма</a>, или <a href="'.htmlspecialchars($feedback_link).'">напишите нам о своей проблеме</a>', 'warning');
                        }
                    }
                } else {
                    $error = new FormError("Введённый e-mail не совпадает с повторным вводом");                    
                    $form->get('email')->addError($error);
                }
            }
            // Проверка пароля
            if (!empty($submitted_values['pass'])) {
                if (mb_strlen(trim($submitted_values['pass']), 'utf-8') < 5) {
                    $error = new FormError("Слишком короткий пароль. Минимальная длина пароля - 5 символов.");                    
                    $form->get('pass')->addError($error);
                } else if (empty($submitted_values['pass2'])) {
                    // Повторный ввод пароля
                    $error = new FormError("Введите повторно пароль!");                    
                    $form->get('pass2')->addError($error);
                } else if (trim($submitted_values['pass']) != trim($submitted_values['pass2'])) {
                    // Проверка соответствия паролей
                    $error = new FormError("Введённый пароль не совпадает с повторным вводом.");                    
                    $form->get('pass')->addError($error);
                }
            } else {
                $error = new FormError("Не указан пароль");
                $form->get('pass')->addError($error);
            }
            
            // Проверка имени пользователя
            $name = !empty($submitted_values['name']) ? trim($submitted_values['name']) : '';
            if ($name) {
                // Проверка дубля имени пользователя
                $query = $this->getDoctrine()->getManager()->createQueryBuilder()
                ->select(Array('u'))
                ->from('NeagMainBundle:User', 'u')
                ->where('u.name = :name')
                ->andWhere('u.vkId IS NULL')
                ->andWhere('u.fbId IS NULL')
                ->setParameter('name', trim($name))
                ->getQuery(); 
                $rows = $query->getResult();
                if (!empty($rows)) {
                    // Пользователь с таким именем уже зарегистрирован
                    $user = $rows[0];
                    $error = new FormError("Пользователь с таким именем уже зарегистрирован.");                    
                    $form->get('name')->addError($error);
                }
            } else {
                $error = new FormError("Не указано имя пользователя");
                $form->get('name')->addError($error);
            }
            
            if (empty($submitted_values['description'])) {
                $user->setDescription('');
            }
            if (empty($submitted_values['contacts'])) {
                $user->setContacts('');
            }
       
            
            //$this->trace($form->isValid() ? 'form valid' : 'form is not valid');            
            
            if ($form->isValid()) {
                // perform some action, such as saving the task to the database                
                $sitename = $globals->getConfigVar('sitename', 'Sitename');
                $email_confirm_token = rand(10000, 99999).rand(10000, 99999);
                $name = trim($submitted_values['name']);
                $email = trim($submitted_values['email']);
                $pass = trim($submitted_values['pass']);
                //$this->message('name: '.$name);
                $link_params = Array(
                    'token' => $email_confirm_token
                );
                if (!empty($_GET['redirect'])) {
                    $link_params['redirect'] = $_GET['redirect'];
                }
                if (!$globals->isMobile()) {
                    $link = $this->generateURL('registration_confirm', $link_params, true);
                } else {
                    $link = $this->generateURL('registration_confirm_m', $link_params, true);
                }
                $time = time();
                $user->setName($name);
                $user->setEmail($email);
                $user->setPass(md5($pass));
                $user->setIp($request->getClientIp());
                $user->setCookieId($globals->getCookieId());
                $user->setEmailConfirmToken($email_confirm_token);
                $user->setTimeRegistration(new \DateTime(date('Y-m-d H:i:s', $time)));
                $user->setTimeEdit(new \DateTime(date('Y-m-d H:i:s', $time)));
                $user->setPremoderationComments(true);
                $user->setBloggerDemandMessage('');
                $user->setActive(true);
                $em = $this->getDoctrine()->getManager();                
                $em->persist($user);
                $em->flush(); 
                /*            
                $message = 'Здравствуйте, {name}! Вы заполнили регистрационную анкету на нашем сайте "{sitename}". Ваши регистрационные данные:'."\r\n"."\r\n";
                $message .= 'Имя пользователя: {name}'."\r\n";
                $message .= 'Пароль: {pass}'."\r\n"."\r\n";
                $message .= 'Для подтверждения регистрации, пожалуйста, перейдите по ссылке:'."\r\n";
                $message .= '{link}'."\r\n"."\r\n";
                $message .= 'Если вы получили письмо по ошибке, просто удалите его. Отвечать на письмо не нужно - оно сгенерировано почтовым роботом.'."\r\n"."\r\n";
                $message .= 'С уважением. Администрация сайта "{sitename}".';
                $message = $globals->getLangVar('registration', 'confirm_mail_body', $message, 'html');
                $message = str_replace(Array('{name}', '{email}', '{pass}', '{link}', '{sitename}'), Array($name, $email, $pass, $link, $sitename), $message);
                $title = 'Спасибо за регистрацию на сайте "{sitename}"!';                 
                $title = $globals->getLangVar('registration', 'confirm_mail_title', $title, 'html');
                $title = str_replace(Array('{sitename}'), Array($sitename), $title);
                $globals->mail($email, $title, $message);
                */
                $this->registrationEmailSend($user, $email_confirm_token, $pass);
                if (!$is_mobile) {
                    return $this->redirect($this->generateUrl('registration_next', Array('email' => $submitted_values['email'])));
                } else {
                    return $this->redirect($this->generateUrl('registration_next_m', Array('email' => $submitted_values['email'])));
                }
            } else {
                foreach ($form->getErrors() as $key => $error) {
                    $template = $error->getMessageTemplate();
                    $parameters = $error->getMessageParameters();
                    foreach($parameters as $var => $value){
                        $template = str_replace($var, $value, $template);
                    }
                    $this->message($template, 'error');
                }
            }             
        }
        
        
        $action_args = Array();
        if (!empty($_GET['redirect'])) {
            $action_args['redirect'] = $_GET['redirect'];
        }
        
        if (!$globals->isMobile()) {
            $action = $this->generateURL('registration', $action_args);
        } else {
            $action = $this->generateURL('registration_m', $action_args);
        }    
        
        return Array(
            //'type' => $type,
            'is_mobile' => $is_mobile,
            'action' => $action,
            'form' => $form->createView(),
        );            
    }
    
    /**
     * Отправка e-mail с подтверждением регистрации
     */
    public function registrationEmailSend($user, $email_confirm_token, $pass = null)
    {       
        $globals = $this->get('globals');
        
        /*
        $desktop_link = $this->generateURL('registration_email_send');
        $mobile_link = $this->generateURL('registration_email_send_m');
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
        */
        
        $sitename = $globals->getConfigVar('sitename', 'Sitename');
        //$email_confirm_token = rand(10000, 99999).rand(10000, 99999);
        $name = $user->getName();
        $email = $user->getEmail();
        $link_params = Array(
            'token' => $email_confirm_token
        );
        if (!empty($_GET['redirect'])) {
            $link_params['redirect'] = $_GET['redirect'];
        }
        if (!$globals->isMobile()) {
            $link = $this->generateURL('registration_confirm', $link_params, true);
        } else {
            $link = $this->generateURL('registration_confirm_m', $link_params, true);
        }
        $message = 'Здравствуйте, {name}! Вы заполнили регистрационную анкету на нашем сайте "{sitename}". Ваши регистрационные данные:'."\r\n"."\r\n";
        $message .= 'Имя пользователя: {name}'."\r\n";
        if (!empty($pass)) {
            $message .= 'Пароль: {pass}'."\r\n"."\r\n";
        }
        $message .= 'Для подтверждения регистрации, пожалуйста, перейдите по ссылке:'."\r\n";
        $message .= '{link}'."\r\n"."\r\n";
        $message .= 'Если вы получили письмо по ошибке, просто удалите его. Отвечать на письмо не нужно - оно сгенерировано почтовым роботом.'."\r\n"."\r\n";
        $message .= 'С уважением. Администрация сайта "{sitename}".';
        if (!empty($pass)) { 
            $message = $globals->getLangVar('registration', 'confirm_mail_body', $message, 'html');
        } else {
            $message = $globals->getLangVar('registration', 'confirm_mail_body_nopass', $message, 'html');
        }
        $message = str_replace(Array('{name}', '{email}', '{pass}', '{link}', '{sitename}'), Array($name, $email, $pass, $link, $sitename), $message);
        $title = 'Спасибо за регистрацию на сайте "{sitename}"!';                 
        $title = $globals->getLangVar('registration', 'confirm_mail_title', $title, 'html');
        $title = str_replace(Array('{sitename}'), Array($sitename), $title);
        //$this->trace($email);
        //$this->trace($title);
        //$this->trace($message);
        $globals->mail($email, $title, $message);           
    }
    
    /**
     * @Route("/registration_next")
     * @Template("NeagMainBundle:User:registration_next.html.twig")
     */
    public function registrationNextAction()
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        
        $desktop_link = $this->generateURL('registration_next', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('registration_next_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
         
        if (!$globals->isMobile()) {
            $link = $this->generateURL('registration_email_resend');     
        } else {
            $link = $this->generateURL('registration_email_resend_m');     
        }    
        return Array(
            'is_mobile' => $is_mobile,
            'email' => $this->getRequest()->query->get('email', null),
            'email_resend_link' => $link,
        );             
    }
    
    /**
     * @Route("/registration_confirm/{token}")
     * @Template("NeagMainBundle:User:registration_confirm.html.twig")
     */
    public function registrationConfirmAction($token)
    {
        $globals = $this->get('globals');
        
        $desktop_link = $this->generateURL('registration_confirm', array_merge(Array('token' => $token), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('registration_confirm_m', array_merge(Array('token' => $token), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
        
        $is_mobile = $globals->isMobile(); 
        // Поиск пользователя с указанным ключём подтверждения регистрации
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('u'))
        ->from('NeagMainBundle:User', 'u')
        ->where('u.emailConfirmToken = :emailConfirmToken')
        ->setParameter('emailConfirmToken', $token)
        ->getQuery(); 
        $rows = $query->getResult();
        //$this->trace('chp 1');
        if (!empty($rows)) {
            //$this->trace('chp 2');
            // Пользователь с таким e-mail уже зарегистрирован
            $user = $rows[0];
            $user->setEmailConfirmToken(null);
            $em = $this->getDoctrine()->getManager();                
            $em->persist($user);
            $em->flush();  
            return Array(
                'is_mobile' => $is_mobile,
                'title' => 'Регистрация завершена',
                'message' => 'Спасибо за регистрацию на нашем сайте! Теперь вы можете авторизоваться.'                
            ); 
        } else {
            return Array(
                'is_mobile' => $is_mobile,
                'title' => 'Неверный ключ',
                'message' => 'Неверный ключ, либо данная ссылка устарела.'                
            );
        }                    
    }
    
    /**
     * @Route("/registration_email_resend")
     * @Template("NeagMainBundle:User:registration_email_resend.html.twig")
     */
    public function registrationEmailResendAction()
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile(); 
        $templating = $this->get('templating');            
        
        $desktop_link = $this->generateURL('registration_email_resend', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('registration_email_resend_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
        
        $fb = $this->createFormBuilder();
        $fb->add(
            'email', 'text', Array(
                'label' => 'E-mail',
            )
        );
        $form = $fb->getForm();
        
        $request = $this->getRequest();
        
        if ($request->isMethod('POST')) {
            $submitted_values = $_POST[$form->getName()];  
            $form->bind($request);            
            // Поиск пользователя с указанным e-mail
            if (empty($submitted_values['email'])) {
                $error = new FormError("Не указан e-mail");
                $form->get('email')->addError($error);
            }           
            if ($form->isValid()) {
                $sitename = $globals->getConfigVar('sitename', 'Sitename');
                $query = $this->getDoctrine()->getManager()->createQueryBuilder()
                ->select(Array('u'))
                ->from('NeagMainBundle:User', 'u')
                ->where('u.email = :email')
                ->setParameter('email', trim($submitted_values['email']))
                ->getQuery(); 
                $rows = $query->getResult();
                if (!empty($rows)) {
                    $user = $rows[0];
                    if ($user->getEmailConfirmToken() == null) {
                        // E-mail уже подверждён
                        $this->message('Пользователь с указанным e-mail уже подтвердил свою регистрацию.', 'ok');
                    } else {
                        $email_confirm_token = rand(10000, 99999).rand(10000, 99999);
                        //$this->trace($email_confirm_token);
                        $user->setEmailConfirmToken($email_confirm_token);
                        $em = $this->getDoctrine()->getManager();                
                        $em->persist($user);
                        $em->flush();
                        $this->registrationEmailSend($user, $email_confirm_token);                        
                        $this->message('На указанный e-mail отправлено письмо с подверждением регистрации.', 'ok');
                    }
                } else {
                    $this->message('Пользователь с таким e-mail не зарегистрирован на сайте.', 'warning');
                }
            }             
        }
        
        if (!$globals->isMobile()) {
            $action = $this->generateURL('registration_email_resend');
        } else {
            $action = $this->generateURL('registration_email_resend_m');
        }  
        
        return Array(
            'is_mobile' => $is_mobile,
            'action' => $action,
            'form' => $form->createView(),
        );     
    }    
    
    /**
     * @Route("/user/profile")
     * @Template("NeagMainBundle:User:profile.html.twig")
     */
    public function profileAction($type = null)
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');
        
        $desktop_link = $this->generateURL('user_profile', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_profile_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
        
        if (!$globals->isUserLoggedIn()) {
            if (!$globals->isMobile()) {
                $redirect = $this->generateURL('main');
            } else {
                $redirect = $this->generateURL('main_m');
            }    
            return $this->redirect($redirect);
        } else {
            $user_info = $globals->getUserInfo();
        }
        
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('u'))
        ->from('NeagMainBundle:User', 'u')
        ->where('u.id = :id')
        ->setParameter('id', $user_info['id'])
        ->getQuery(); 
        $rows = $query->getResult();
        if (!empty($rows)) {
            $user = $rows[0];
        } else {
            if (!$globals->isMobile()) {
                $redirect = $this->generateURL('main');
            } else {
                $redirect = $this->generateURL('main_m');
            }    
            return $this->redirect($redirect);
        }
        
        $user_info = $globals->buildUserInfo($user);             
        
        $form = $this->getProfileForm($user, $type, false);
        
        $request = $this->getRequest();        
        
        if ($request->isMethod('POST')) {
            $submitted_values = $_POST[$form->getName()];  
            $form->bind($request);
            $this->securityValidateForm($form, $submitted_values);             
            // Проверка пароля
            if (!($user_info['is_vk'] || $user_info['is_fb'])) {
                if (!empty($submitted_values['pass'])) {
                    if ($user->getPass() != md5(trim($submitted_values['pass']))) {
                        $error = new FormError("Неверный пароль");                    
                        $form->get('pass')->addError($error);
                    }
                } else {
                    $error = new FormError("Не указан пароль");
                    $form->get('pass')->addError($error);
                }
            }
            
            //$this->message(print_r($submitted_values, true));
            
            if (empty($submitted_values['description'])) {
                $user->setDescription('');
            }
            if (empty($submitted_values['contacts'])) {
                $user->setContacts('');
            }
            if (empty($submitted_values['mailAllow'])) {
                //$this->message('chp 1');
                $user->setMailAllow(false);
            } else {
                //$this->message('chp 2');
                $user->setMailAllow(true);
            }
            
            if ($form->isValid()) {
                // perform some action, such as saving the task to the database                
                $time = time();
                $user->setTimeEdit(new \DateTime(date('Y-m-d H:i:s', $time)));
                $em = $this->getDoctrine()->getManager();                
                $em->persist($user);
                $em->flush();
                $this->message('Изменения внесены');
                return $this->redirect($this->generateUrl('user_profile'));
            } else {
                foreach ($form->getErrors() as $key => $error) {
                    $template = $error->getMessageTemplate();
                    $parameters = $error->getMessageParameters();
                    foreach($parameters as $var => $value){
                        $template = str_replace($var, $value, $template);
                    }
                    $this->message($template, 'error');
                }
            }             
        } 
        
        if (!$globals->isMobile()) {
            $breadcrumbs = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user'),
                ),
                Array(
                    'title' => 'Личная информация',
                    'link' => $this->generateURL('user_profile'),
                ),
            );
        } else {
            $breadcrumbs = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user_m'),
                ),
                Array(
                    'title' => 'Личная информация',
                    'link' => $this->generateURL('user_profile_m'),
                ),
            );
        }
        $breadcrumbs = parent::buildBreadcrumbs($breadcrumbs);        
        
        if (!$globals->isMobile()) {
            $profile_link = $this->generateURL('user_profile');
        } else {
            $profile_link = $this->generateURL('user_profile_m');
        }    
        
        return Array(
            'is_mobile' => $is_mobile,
            'type' => $type,
            'action' => $profile_link,
            'form' => $form->createView(),
            'breadcrumbs' => $breadcrumbs, 
        );            
    }
    
    /**
     * @Route("/user/settings")
     * @Template("NeagMainBundle:User:settings.html.twig")
     */
     /*
    public function settingsAction($type = null)
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');
        
        $desktop_link = $this->generateURL('user_settings', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_settings_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
        
        if (!$globals->isUserLoggedIn()) {
            if (!$globals->isMobile()) {
                $redirect = $this->generateURL('main');
            } else {
                $redirect = $this->generateURL('main_m');
            }    
            return $this->redirect($redirect);
        } else {
            $user_info = $globals->getUserInfo();
        }
        
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('u'))
        ->from('NeagMainBundle:User', 'u')
        ->where('u.id = :id')
        ->setParameter('id', $user_info['id'])
        ->getQuery(); 
        $rows = $query->getResult();
        if (!empty($rows)) {
            $user = $rows[0];
        } else {
            if (!$globals->isMobile()) {
                $redirect = $this->generateURL('main');
            } else {
                $redirect = $this->generateURL('main_m');
            }    
            return $this->redirect($redirect);
        }
        
        $user_info = $globals->buildUserInfo($user);             
        
        $form = $this->getProfileForm($user, $type, false);
        
        $request = $this->getRequest();        
        
        if ($request->isMethod('POST')) {
            $submitted_values = $_POST[$form->getName()];  
            $form->bind($request);
            $this->securityValidateForm($form, $submitted_values);             
            // Проверка пароля
            if (!($user_info['is_vk'] || $user_info['is_fb'])) {
                if (!empty($submitted_values['pass'])) {
                    if ($user->getPass() != md5(trim($submitted_values['pass']))) {
                        $error = new FormError("Неверный пароль");                    
                        $form->get('pass')->addError($error);
                    }
                } else {
                    $error = new FormError("Не указан пароль");
                    $form->get('pass')->addError($error);
                }
            }
            
            if ($form->isValid()) {
                // perform some action, such as saving the task to the database                
                $em = $this->getDoctrine()->getManager();                
                $em->persist($user);
                $em->flush();
                $this->message('Изменения внесены');
                if (!$globals->isMobile()) {
                    $redirect = $this->generateURL('user_profile');
                } else {
                    $redirect = $this->generateURL('user_profile_m');
                }
                return $this->redirect($redirect);
            } else {
                foreach ($form->getErrors() as $key => $error) {
                    $template = $error->getMessageTemplate();
                    $parameters = $error->getMessageParameters();
                    foreach($parameters as $var => $value){
                        $template = str_replace($var, $value, $template);
                    }
                    $this->message($template, 'error');
                }
            }             
        } 
        
        if (!$globals->isMobile()) {
            $breadcrumbs = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user'),
                ),
                Array(
                    'title' => 'Настройки',
                    'link' => $this->generateURL('user_settings'),
                ),
            );
        } else {
            $breadcrumbs = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user_m'),
                ),
                Array(
                    'title' => 'Настройки',
                    'link' => $this->generateURL('user_settings_m'),
                ),
            );
        }
        $breadcrumbs = parent::buildBreadcrumbs($breadcrumbs);        
        
        if (!$globals->isMobile()) {
            $profile_link = $this->generateURL('user_settings');
        } else {
            $profile_link = $this->generateURL('user_settings_m');
        }    
        
        return Array(
            'is_mobile' => $is_mobile,
            'type' => $type,
            'action' => $profile_link,
            'form' => $form->createView(),
            'breadcrumbs' => $breadcrumbs, 
        ); 
    } 
    */   
    
    /**
     * @Route("/user/avatar")
     * @Template("NeagMainBundle:User:avatar.html.twig")
     */
    public function avatarAction($type = null)
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');
        $request = $this->get('request');
        
        $desktop_link = $this->generateURL('user_avatar', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_avatar_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
        
        if (!$globals->isUserLoggedIn()) {
            if (!$globals->isMobile()) {
                $redirect = $this->generateURL('main');
            } else {
                $redirect = $this->generateURL('main_m');
            }    
            return $this->redirect($redirect);
        } else {
            $user_info = $globals->getUserInfo();
        }
        
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('u'))
        ->from('NeagMainBundle:User', 'u')
        ->where('u.id = :id')
        ->setParameter('id', $user_info['id'])
        ->getQuery(); 
        $rows = $query->getResult();
        if (!empty($rows)) {
            $user = $rows[0];
        } else {
            if (!$globals->isMobile()) {
                $redirect = $this->generateURL('main');
            } else {
                $redirect = $this->generateURL('main_m');
            }    
            return $this->redirect($redirect);
        }
        
        $user_info = $globals->buildUserInfo($user);             
        
        $fs = new Filesystem();           
        
        $DB = $this->get('database_connection');       
        
        $data = Array();
        
        $edit = false;
        $has_thumb_image = false;
        $image_format = $user->getImageFormat();
        $image_src = '';          
        $image_width = 0;
        $image_height = 0;        
        
        if (!empty($image_format)) {
            $edit = true;
            if (!$globals->hasUserImagePreset($user, 'thumb')) {
                $globals->createUserImagePreset($user, 'thumb');
            }        
            if ($globals->hasUserImagePreset($user, 'thumb')) {
                $has_thumb_image = true;
                $image_width = $user->getThumbImageWidth();
                $image_height = $user->getThumbImageHeight();
                $image_format = $user->getThumbImageFormat();
                $image_src = 'filedata/'.$globals->userImagePresets['thumb']['dir'].'/'.$user->getId().'.'.$image_format.'?rand='.rand(1000, 9999);                  
            } else {                
            }
        }        
        
        if ($edit) {
        }

        $builder = $this->createFormBuilder($user);        
        $builder->add('image', 'file', Array(
            'label' => 'Аватар', 
            'required' => false, 
            'mapped' => false,
            'help' => 'Максимально допустимые размеры - '.$globals->userImageDimensions['width'].'x'.$globals->userImageDimensions['height'].'. Допустимый формат - только jpg.',
        ));
        $form = $builder->getForm();
            
        if ($request->isMethod('POST')) {
            $submitted_values = $_POST[$form->getName()];
            $form->bind($submitted_values);
            if ($form->isValid()) {
                $create_image = false; 
                // Обработка изображения
                $dir = 'filedata/images_user/';
                //$article->setImageTitle('');                
                // Удаление изображения
                if ($edit && !empty($_POST['remove_image'])) {
                    $fs->remove($dir.$user->getId().'.'.$user->getImageFormat());                    
                    $user->setImageWidth(null);
                    $user->setImageHeight(null);
                    $user->setImageFormat(null);
                    $globals->removeUserImagePreset($user, 'thumb');
                }
                $has_image_error = false;
                if (!empty($_FILES['form']['tmp_name']['image'])) {
                    //$this->message(print_r($_FILES['form'], true));
                    $available = false;
                    $create_image = true;                     
                    foreach ($globals->imageFormats as $ext => $format) {
                        if ($format['type'] == $_FILES['form']['type']['image']) {
                            if ($format['available']) {
                                $available = true;
                                $image_data = @exif_read_data($_FILES['form']['tmp_name']['image']);
                                //$this->trace($image_data);
                                if (!empty($image_data)) {                                    
                                    $width = $image_data['COMPUTED']['Width'];
                                    $height = $image_data['COMPUTED']['Height'];                                    
                                    //$this->message($width.' '.$height);
                                    if ($width <= $globals->userImageDimensions['width'] && $height <= $globals->userImageDimensions['height']) {
                                        $user->setImageWidth($width);
                                        $user->setImageHeight($height);
                                        $user->setImageFormat($ext);
                                    } else {
                                        //$this->message('dimensions error');
                                        $has_image_error = true;
                                        $form->get('image')->addError(new FormError('Размеры изображения превышают допустимые ограничения'));
                                    }
                                } else {
                                    $has_image_error = true;
                                    $form->get('image')->addError(new FormError('Недопустимый формат файла'));
                                }
                                break;
                            }
                        }
                    }
                    if (!$available) {
                        // Недопустимый формат                 
                        $form->get('image')->addError(new FormError('Недопустимый формат файла'));
                        $has_image_error = true;
                    }
                } else {
                    if (!$edit) {
                        $form->get('image')->addError(new FormError('Не указан файл'));
                        $has_image_error = true;
                    }
                }
                if (!empty($user) && !$has_image_error) {
                    // Сохранение изображения
                    if ($create_image) {
                        foreach ($globals->imageFormats as $ext => $format) {
                            $dir = 'filedata/images_user/';
                            $fs->remove($dir.$user->getId().'.'.$ext);
                            if ($format['type'] == $_FILES['form']['type']['image']) {
                                if ($format['available']) {
                                    $available = true;
                                    $filename = $user->getId().'.'.$ext;
                                    $image_data = @exif_read_data($_FILES['form']['tmp_name']['image']);
                                    if (!empty($image_data)) {                                    
                                        $width = $image_data['COMPUTED']['Width'];
                                        $height = $image_data['COMPUTED']['Height'];                                                                                
                                        $fs->copy($_FILES['form']['tmp_name']['image'], $dir.$user->getId().'.'.$ext);
                                        $user->setImageWidth($width);
                                        $user->setImageHeight($height);
                                        $user->setImageFormat($ext);
                                        //$user->setImageTitle('');                                    
                                        $globals->createUserImagePreset($user, 'thumb'); 
                                        $em = $this->getDoctrine()->getManager();                
                                        $em->persist($user);
                                        $em->flush();
                                    }
                                    break;
                                }
                            }
                        }                        
                    }
                    if ($edit) {
                        $this->message('Изменения внесены', 'ok');
                    } else {
                        $this->message('Аватар успешно загружен', 'ok');
                    }
                    if (!$globals->isMobile()) {
                        $redirect = $this->generateURL('user_avatar');
                    } else {
                        $redirect = $this->generateURL('user_avatar_m');
                    }
                    return $this->redirect($redirect);
                }
            }
        }

        if (!$globals->isMobile()) {
            $action = $this->generateURL('user_avatar', Array());
        } else {
            $action = $this->generateURL('user_avatar_m', Array());
        }
        
        if (!$globals->isMobile()) {
            $data = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user'),
                ),
                Array(
                    'title' => 'Аватар',
                    'link' => $action,
                ),
            );
        } else {
            $data = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user_m'),
                ),
                Array(
                    'title' => 'Аватар',
                    'link' => $action,
                ),
            );
        }
        $breadcrumbs = parent::buildBreadcrumbs($data);
        //$this->trace($data);
        //$this->trace($breadcrumbs);

        return array(
            'is_mobile' => $is_mobile,
            'image_src' => !empty($image_src) ? $image_src : null,
            'image_width' => !empty($image_width) ? $image_width : null,
            'image_height' => !empty($image_height) ? $image_height : null,
            'form' => $form->createView(),
            'edit' => $edit,
            'action' => $action,
            'breadcrumbs' => $breadcrumbs,            
        );           
    }
    
    /**
     * @Route("/user/subscribes")
     * @Template("NeagMainBundle:User:subscribes.html.twig")
     */
    public function subscribesAction()
    {
        $del_page = $this->getRequest()->query->get('del_page'); 
        $del_forum_topic = $this->getRequest()->query->get('del_forum_topic'); 
        $globals = $this->get('globals');
        
        $desktop_link = $this->generateURL('user_subscribes', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_subscribes_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
        
        $DB = $this->get('database_connection'); 
        
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        
        $request = $this->getRequest();
        
        if (!$globals->isUserLoggedIn()) {
            if (!$globals->isMobile()) {
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        } else {
            $user_info = $globals->getUserInfo();
        }
        if (!empty($user_info['entity'])) {
            $user = $user_info['entity'];
        } else {
            if (!$globals->isMobile()) {
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        }
        
        $session = $globals->getSession();          
        
        if (!empty($del_page)) {
            $query = $this->getDoctrine()->getManager()->createQueryBuilder()
            ->select(Array('s'))
            ->from('NeagMainBundle:SubscribePage', 's')
            ->where('s.id = :sid')
            ->setParameter('sid', $del_page)
            ->andWhere('s.user = :user')
            ->setParameter('user', $user)
            ->getQuery(); 
            $rows = $query->getResult();
            if (!empty($rows)) {
                $s = $rows[0];
            } else {
                $s = null;
            }
            if (!empty($s)) {
                $em = $this->getDoctrine()->getManager();                
                $em->remove($s);
                $em->flush();
                $this->message('Вы отписались от комментариев к статье.');        
            }
        }
        
        if (!empty($del_forum_topic)) {
            $query = $this->getDoctrine()->getManager()->createQueryBuilder()
            ->select(Array('s'))
            ->from('NeagMainBundle:SubscribeForumTopic', 's')
            ->where('s.id = :sid')
            ->setParameter('sid', $del_forum_topic)
            ->andWhere('s.user = :user')
            ->setParameter('user', $user)
            ->getQuery(); 
            $rows = $query->getResult();
            if (!empty($rows)) {
                $s = $rows[0];
            } else {
                $s = null;
            }
            if (!empty($s)) {
                $em = $this->getDoctrine()->getManager();                
                $em->remove($s);
                $em->flush();
                $this->message('Вы отписались от комментариев к теме форума.');        
            }
        }
        
        $subscribe_pages = Array();
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('s'))
        ->from('NeagMainBundle:SubscribePage', 's')
        ->leftJoin('s.page', 'p')
        ->where('s.user = :user')
        ->setParameter('user', $user)
        ->orderBy('p.timeCreate', 'DESC')
        ->getQuery(); 
        $rows = $query->getResult();
        foreach ($rows as $row) {
            $page = $row->getPage();
            if (!$is_mobile) {
                $remove_link = $this->generateURL('user_subscribes', Array('del_page' => $row->getId()));
            } else {
                $remove_link = $this->generateURL('user_subscribes_m', Array('del_page' => $row->getId()));
            }
            $title = '';
            $revisions = $page->getRevisions();
            foreach ($revisions as $r) {
                if ($r->getCurrent()) {
                    $title = $r->getTitle();
                }
            }
            $subscribe_pages[] = Array(
                'breadcrumbs' => $globals->buildPageBreadcrumbs($page),
                'del_link' => $remove_link,
                'title' => $title,
            );
        }
        
        $subscribe_forum_topics = Array();
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('s'))
        ->from('NeagMainBundle:SubscribeForumTopic', 's')
        ->leftJoin('s.forumTopic', 'ft')
        ->where('s.user = :user')
        ->setParameter('user', $user)
        ->orderBy('ft.timeCreate', 'DESC')
        ->getQuery(); 
        $rows = $query->getResult();
        foreach ($rows as $row) {
            $forumTopic = $row->getForumTopic();
            if (!$is_mobile) {
                $remove_link = $this->generateURL('user_subscribes', Array('del_forum_topic' => $row->getId()));
            } else {
                $remove_link = $this->generateURL('user_subscribes_m', Array('del_forum_topic' => $row->getId()));
            }
            $subscribe_forum_topics[] = Array(
                'breadcrumbs' => $globals->buildForumTopicBreadcrumbs($forumTopic),
                'del_link' => $remove_link,
                'title' => $forumTopic->getTitle(),
            );
        }
        
        if (!$globals->isMobile()) {
            $breadcrumbs = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user'),
                ),
                Array(
                    'title' => 'Мои подписки',
                    'link' => $this->generateURL('user_subscribes'),
                ),
            );
        } else {
            $breadcrumbs = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user_m'),
                ),
                Array(
                    'title' => 'Мои подписки',
                    'link' => $this->generateURL('user_subscribes_m'),
                ),
            );
        }
        $breadcrumbs = parent::buildBreadcrumbs($breadcrumbs);

        return Array(          
            'is_mobile' => $is_mobile,
            'subscribe_pages' => $subscribe_pages, 
            'subscribe_forum_topics' => $subscribe_forum_topics, 
            'breadcrumbs' => $breadcrumbs, 
        );
    }
    
    /**
     * @Route("/user")
     * @Template("NeagMainBundle:User:index.html.twig")
     */
    public function indexAction()
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');
        
        $desktop_link = $this->generateURL('user', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
        
        if (!$globals->isUserLoggedIn()) {
            if (!$globals->isMobile()) {
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        } else {
            $user_info = $globals->getUserInfo();
        }
        
        $user = $user_info['entity'];
        $blogger_alias = $user->getBloggerAlias();
        
        $blogger = $user->getBlogger();
        $blogger_alias = $user->getBloggerAlias();
        $blogger_demand = $user->getBloggerDemand(); 
        if (!$globals->isMobile()) {       
            $blog_list_link = $this->generateURL('user_blog_list');
            $blog_edit_link = $this->generateURL('user_blog_edit');
        } else {
            $blog_list_link = $this->generateURL('user_blog_list_m');
            $blog_edit_link = $this->generateURL('user_blog_edit_m');
        }
        $blog_link = null;
        if (!empty($blogger_alias)) {
            if (!$globals->isMobile()) { 
                $blog_link = $this->generateURL('blog', Array('blog_alias' => $blogger_alias));
            } else {
                $blog_link = $this->generateURL('blog_m', Array('blog_alias' => $blogger_alias));
            }
        }
        
        $blog_count = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('COUNT(p.id)'))
        ->from('NeagMainBundle:SimplePagePage', 'p')
        ->where('p.user = :user')       
        ->setParameter('user', $user)
        ->getQuery()
        ->getSingleScalarResult();
        
        if (!$globals->isMobile()) { 
            $avatar_link = $this->generateURL('user_avatar');
            $bbcode_help_link = $this->generateURL('bbcode_help');
        } else {
            $avatar_link = $this->generateURL('user_avatar_m');
            $bbcode_help_link = $this->generateURL('bbcode_help_m');
        } 
        
        if (!$globals->isMobile()) { 
            $subscribes_link = $this->generateURL('user_subscribes');
        } else {
            $subscribes_link = $this->generateURL('user_subscribes_m');
        }           
        
        return Array(
            'is_mobile' => $is_mobile,
            'user_info' => $user_info,
            'avatar_link' => $avatar_link,
            'bbcode_help_link' => $bbcode_help_link,
            'subscribes_link' => $subscribes_link,
            'blogger' => $blogger,
            'blogger_alias' => $blogger_alias,
            'blogger_demand' => $blogger_demand,
            'blog_link' => $blog_link,
            'blog_list_link' => $blog_list_link,
            'blog_edit_link' => $blog_edit_link,
            'blog_count' => $blog_count,
            /*
            'sport_section_list_link' => $sport_section_list_link,
            'sport_section_edit_link' => $sport_section_edit_link,
            'sport_section_count' => $sport_section_count,
            'sport_event_list_link' => $sport_event_list_link,
            'sport_event_edit_link' => $sport_event_edit_link,
            'sport_event_count' => $sport_event_count,            
            'sport_announce_list_link' => $sport_announce_list_link,
            'sport_announce_edit_link' => $sport_announce_edit_link,
            'sport_announce_count' => $sport_announce_count,
            */
        );            
    }
    
    /**
     * @Route("/user/blog_edit/{id}")
     * @Template("NeagMainBundle:User:blog_edit.html.twig")
     */
    public function blogEditAction($id = null)
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');
        $request = $this->get('request');
        
        $desktop_link = $this->generateURL('user_blog_edit', array_merge(Array('id' => $id), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_blog_edit_m', array_merge(Array('id' => $id), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
        
        if (!$globals->isUserLoggedIn()) {
            if (!$globals->isMobile()) { 
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        } else {
            $user_info = $globals->getUserInfo();
        }         
        if (!empty($user_info['entity'])) {
            $user = $user_info['entity'];
        } else {
            if (!$globals->isMobile()) {
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        }
        
        $fs = new Filesystem();           
        
        $DB = $this->get('database_connection');       
        
        $data = Array();
        $data['title'] = '';
        $data['annotation'] = '';
        $data['image_title'] = '';
        $data['content'] = '';
        $data['category'] = null;
        $data['allow_comment'] = 1;
        $data['subscribe'] = 1;
        $data['active'] = 1;
        $data['time'] = new \DateTime();
        $data['persons'] = Array();
        $data['tags'] = Array();
        
        $page = null;
        $revision = null;
        $article = null;
        $edit = false;
        if (!empty($id)) {
            $query = $this->getDoctrine()->getManager()->createQueryBuilder()
            ->select(Array('p'))
            ->from('NeagMainBundle:SimplePagePage', 'p')
            ->where('p.id = :pid')
            ->setParameter('pid', $id)
            ->getQuery(); 
            $rows = $query->getResult();
            if (!empty($rows)) {
                $page = $rows[0];
                $revision = null;
                $article = null;
                $revisions = $page->getRevisions();
                foreach ($revisions as $r) {
                    if ($r->getCurrent()) {
                        $revision = $r;
                    }
                }
                $articles = $page->getArticles();
                if (!empty($articles)) {
                    $article = $articles[0];
                }                 
            } else {
                $page = null;
                // Материал не найден
                if (!$globals->isMobile()) {
                    $redirect = $this->generateURL('user_blog_list');
                } else {
                    $redirect = $this->generateURL('user_blog_list_m');
                }
                return $this->redirect($redirect);
            }
            $edit = true; 
        }         
        if (!empty($article)) {
            if (!$globals->hasArticleImagePreset($article, 'thumb')) {
                $globals->createArticleImagePreset($article, 'thumb');
            }        
            if ($globals->hasArticleImagePreset($article, 'thumb')) {
                $has_thumb_image = true;
                $image_width = $article->getThumbImageWidth();
                $image_height = $article->getThumbImageHeight();
                $image_format = $article->getThumbImageFormat();
                $image_src = 'filedata/'.$globals->articleImagePresets['thumb']['dir'].'/'.$article->getId().'.'.$image_format.'?rand='.rand(1000, 9999);  
            } else {
                $has_thumb_image = false;
                $image_src = '';          
            }
        }
        /*
        if (!empty($id)) {
            //$page = new SimplePagePage(); 
            $query = $this->getDoctrine()->getManager()->createQueryBuilder()
            ->select(Array('p', 'a', 'r'))
            ->from('NeagMainBundle:SimplePagePage', 'p')
            ->leftJoin('p.articles', 'a')
            ->leftJoin('p.revisions', 'r')
            ->where('p.id = :pid')
            ->setParameter('pid', $id)
            ->andWhere('p.user = :user')
            ->setParameter('user', $user)
            ->getQuery();             
            $rows = $query->getResult();
            if (!empty($rows)) {
                $page = $rows[0];
                $edit = true;
            } else {
                $page = null;
            }              
        }
        */
        if (empty($page)) {
            $page = new SimplePagePage();
            $revision = new SimplePagePageRevision();
            $article = new Article();
            $revision->setPage($page);
            $article->setPage($page);
            $page->setUser($user);
            $revision->setContent('');
            $revision->setFormat('bbcode');
            $revision->setCurrent(true);
            $page->setActive(true);
            $article->setShowOnMain(false);
            $article->setYandexBody('');
        }
        
        if ($edit) {
            $is_editable = $globals->isUserPageEditable($page);
            if (!$is_editable) {
                // Если недоступна для редактирования
                $this->message('Вы не можете вносить правки в текст данной публикации, так как она уже утверждена модератором.', 'warning');
                if ($page->getActive()) {
                    $redirect = $globals->buildPageLink($page);
                } else {
                    if (!$globals->isMobile()) {
                        $redirect = $this->generateURL('user_blog_list');
                    } else {
                        $redirect = $this->generateURL('user_blog_list_m');
                    }
                }
                return $this->redirect($redirect);
            }
            // Поиск подписки
            $data['subscribe'] = 0;
            if (!empty($page)) {
                $query2 = $this->getDoctrine()->getManager()->createQueryBuilder()
                ->select(Array('s'))
                ->from('NeagMainBundle:SubscribePage', 's')
                ->where('s.user = :user')
                ->setParameter('user', $user)
                ->andWhere('s.page = :page')
                ->setParameter('page', $page)
                ->getQuery(); 
                $rows2 = $query2->getResult();
                if (!empty($rows2)) {
                    $data['subscribe'] = 1;
                }
            }
            if (!empty($revision)) {
                $data['title'] = $revision->getTitle();                
                $data['content'] = $revision->getContent();
            }
            if (!empty($article)) {
                //$this->trace('chp 1');
                $data['annotation'] = $article->getAnnotation();
                $data['allow_comment'] = $article->getAllowComment();
                $category = $article->getCategory();
                //$data['category'] = $category;
                $data['category'] = !empty($category) ? $category->getId() : null;
                $data['image_title'] = $article->getImageTitle();
                // Поиск персоналий
                $query3 = $this->getDoctrine()->getManager()->createQueryBuilder()
                ->select(Array('pa'))
                ->from('NeagMainBundle:PersonArticle', 'pa')
                ->where('pa.article = :article')
                ->setParameter('article', $article)
                ->getQuery(); 
                $personArticles = $query3->getResult(); 
                foreach ($personArticles as $pa) {
                    //$this->trace($pa->getPerson()->getTitle());
                    $data['persons'][] = $pa->getPerson();
                }
                // Поиск тегов
                $query4 = $this->getDoctrine()->getManager()->createQueryBuilder()
                ->select(Array('l'))
                ->from('NeagMainBundle:TagArticle', 'l')
                ->where('l.article = :article')
                ->setParameter('article', $article)
                ->getQuery(); 
                $tagArticles = $query4->getResult(); 
                foreach ($tagArticles as $ta) {
                    $data['tags'][] = $ta->getTag()->getId();
                } 
            }
            $data['time'] = $page->getTime();
            $data['active'] = $page->getActive();
        }
        
        //$this->trace($data['category']->getId());

        $builder = $this->createFormBuilder($page);        
        $builder->add('title', 'text', Array('label' => 'Название', 'trim' => true, 'required' => true, 'mapped' => false, 'data' => $data['title']));
        $builder->add('annotation', 'text', Array('label' => 'Аннотация', 'trim' => true, 'required' => false, 'mapped' => false, 'data' => $data['annotation']));        
        $builder->add('image', 'file', Array(
            'label' => 'Изображение', 
            'required' => false, 
            'mapped' => false,
            'help' => 'Допустимый формат - только "jpg".'
        ));
        $builder->add('imageTitle', 'text', Array(
            'label' => 'Комментарий к изображению', 
            'trim' => true, 
            'required' => false,
            'mapped' => false,
            'data' => $data['image_title'],
        ));        
        $builder->add('content', 'textarea', Array('label' => 'Полный текст', 'trim' => false, 'required' => true, 'mapped' => false, 'data' => $data['content'], 'attr' => array('class' => 'bbcode', 'cols' => "80", 'rows' => "40")));
        //$this->trace(gettype($data['category']));
        $builder->add('category', 'choice', Array(
            'label' => 'Раздел', 
            //'class' => 'NeagMainBundle:Category', 
            //'property' => 'title', 
            'choices' => $this->getCategoryChoices(), 
            'empty_value' => '-- Не выбран --', 
            'required' => false,
            'data' => $data['category'],
            'mapped' => false,
        ));
        $builder->add('persons', 'entity', Array(
            'label' => 'Персоналии', 
            'help' => 'Вы можете пометить несколько персоналий, удерживая клавишу "Ctrl".',
            'class' => 'NeagMainBundle:Person', 
            'property' => 'title', 
            'choices' => $this->getPersonChoices(), 
            'required' => false,
            'multiple' => true,
            'data' => $data['persons'],
            'mapped' => false,
        ));
        $builder->add('tags', 'choice', Array(
            'label' => 'Теги', 
            'help' => 'Вы можете пометить несколько тегов, удерживая клавишу "Ctrl".',
            'choices' => $this->getTagChoices(), 
            'required' => false,
            'multiple' => true,
            'data' => $data['tags'],
            'mapped' => false,
        ));
        $builder->add('allowComment', 'choice', Array('choices' => array(1 => 'Да', 0 => 'Нет'), 'label' => 'Разрешить комментарии', 'data' => $data['allow_comment'], 'mapped' => false));
        $builder->add('subscribe', 'choice', Array('choices' => array(1 => 'Да', 0 => 'Нет'), 'label' => 'Подписаться на комментарии', 'data' => $data['subscribe'], 'mapped' => false));
        $builder->add('active', 'choice', Array('choices' => array(1 => 'Да', 0 => 'Нет'), 'label' => 'Активная', 'data' => $data['active'], 'mapped' => false));
        $form = $builder->getForm();
            
        if ($request->isMethod('POST')) {            
            $submitted_values = $_POST[$form->getName()];
            // Раздел
            if (!empty($submitted_values['category'])) {
                $category = $this->getDoctrine()
                ->getRepository('NeagMainBundle:Category')
                ->find($submitted_values['category']);        
            }
            // Персоналии
            $persons = Array();
            if (!empty($submitted_values['persons'])) {
                foreach ($submitted_values['persons'] as $p) {
                    $person = $this->getDoctrine()
                    ->getRepository('NeagMainBundle:Person')
                    ->find($p);
                    $persons[] = $person;
                }                
            }
            // Теги
            $tags = Array();
            if (!empty($submitted_values['tags'])) {
                foreach ($submitted_values['tags'] as $t) {
                    $tag = $this->getDoctrine()
                    ->getRepository('NeagMainBundle:Tag')
                    ->find($t);
                    $tags[] = $tag;
                }                
            } 
            $form->bind($submitted_values);
            if (empty($submitted_values['title'])) {
                $error = new FormError("Не указано название");
                $form->get('title')->addError($error);
            } 
            if (empty($submitted_values['content'])) {
                $error = new FormError("Не указан полный текст");
                $form->get('content')->addError($error);
            }
            if ($form->isValid()) {
                // perform some action, such as saving the task to the database
                $time = time();
                if (!$edit) {
                    $page->setTimeCreate(new \DateTime(date('Y-m-d H:i:s', $time)));
                    $page->setTime(new \DateTime(date('Y-m-d H:i:s', $time)));
                }
                // Установка категории
                if (!empty($category)) {
                    $article->setCategory($category);
                } else {
                    $article->setCategory(null);
                }
                $page->setActive(($submitted_values['active'] == 1)); 
                $revision->setTimeEdit(new \DateTime(date('Y-m-d H:i:s', $time)));                                
                $revision->setTitle($submitted_values['title']);
                $revision->setContent($submitted_values['content']);
                $orderId = $this->get('globals')->incrementValue($this->getDoctrine()->getRepository('NeagMainBundle:Article'), 'orderId');
                $article->setOrderId($orderId);
                $article->setAllowComment(($submitted_values['allowComment'] == 1));
                $article->setAnnotation($submitted_values['annotation']);
                $article->setImageTitle(!empty($submitted_values['imageTitle']) ? $submitted_values['imageTitle'] : '');
                $article->setWaiting(true);                
                // Обработка изображения
                $create_image = false;                  
                $dir = 'filedata/images_article/';
                //$article->setImageTitle('');                
                // Удаление изображения
                if ($edit && !empty($_POST['remove_image'])) {
                    $fs->remove($dir.$article->getId().'.'.$article->getImageFormat());                    
                    $article->setImageWidth(null);
                    $article->setImageHeight(null);
                    $article->setImageFormat(null);
                    $globals->removeArticleImagePreset($article, 'thumb');
                }
                if (!empty($_FILES['form']['tmp_name']['image'])) {
                    $available = false;
                    $create_image = true;
                    $has_image_error = false; 
                    foreach ($globals->imageFormats as $ext => $format) {
                        if ($format['type'] == $_FILES['form']['type']['image']) {
                            if ($format['available']) {
                                $available = true;
                                $image_data = @exif_read_data($_FILES['form']['tmp_name']['image']);
                                //$this->trace($image_data);
                                if (!empty($image_data)) {                                    
                                    $width = $image_data['COMPUTED']['Width'];
                                    $height = $image_data['COMPUTED']['Height'];                                    
                                    $article->setImageWidth($width);
                                    $article->setImageHeight($height);
                                    $article->setImageFormat($ext);
                                } else {
                                    $has_image_error = true;
                                    $form->get('image')->addError(new FormError('Недопустимый формат файла'));
                                }
                                break;
                            }
                        }
                    }
                    if (!$available) {
                        // Недопустимый формат                 
                        $form->get('image')->addError(new FormError('Недопустимый формат файла'));
                        $has_image_error = true;
                    }
                }
                if (!empty($page) && !empty($revision) && !empty($article)) {
                    $em = $this->getDoctrine()->getManager();                
                    $em->persist($page);
                    $em->flush();
                    $em->persist($article);
                    $em->flush();                     
                    $em->persist($revision);
                    $em->flush();
                    // Подписка на комментарии
                    if (!$edit) {
                        if (!empty($submitted_values['subscribe'])) {
                            $subscribe = new SubscribePage;
                            $subscribe->setUser($user);
                            $subscribe->setPage($page);
                            $em = $this->getDoctrine()->getManager();                
                            $em->persist($subscribe);
                            $em->flush();
                        }
                    } else {
                        // Удаление старой подписки
                        $qb = $this->getDoctrine()->getManager()->createQueryBuilder();
                        $qb->delete('NeagMainBundle:SubscribePage', 's');
                        $qb->where('s.page = :page')
                        ->setParameter('page', $page);
                        $qb->andWhere('s.user = :user')
                        ->setParameter('user', $user);
                        $query3 = $qb->getQuery();
                        $rows3 = $query3->getResult();
                        if (!empty($submitted_values['subscribe'])) {                        
                            $subscribe = new SubscribePage;
                            $subscribe->setUser($user);
                            $subscribe->setPage($page);
                            $em = $this->getDoctrine()->getManager();                
                            $em->persist($subscribe);
                            $em->flush();
                        }  
                    }
                    // Удаление старых связей с персоналиями
                    if ($edit) {
                        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
                        ->select(Array('pa'))
                        ->from('NeagMainBundle:PersonArticle', 'pa')
                        ->where('pa.article = :article')
                        ->setParameter('article', $article)
                        ->getQuery(); 
                        $rows = $query->getResult();
                        if (!empty($rows)) {
                            foreach ($rows as $pa) {
                                $em = $this->getDoctrine()->getManager();                
                                $em->remove($pa);
                                $em->flush();                            
                            }
                        }    
                    }
                    // Связывание с перcоналиями
                    foreach ($persons as $person) {
                        $pa = new PersonArticle;
                        $pa->setPerson($person);
                        $pa->setArticle($article);
                        $em = $this->getDoctrine()->getManager();                
                        $em->persist($pa);
                        $em->flush();
                    }
                    // Удаление старых связей с тегами
                    if ($edit) {
                        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
                        ->select(Array('l'))
                        ->from('NeagMainBundle:TagArticle', 'l')
                        ->where('l.article = :article')
                        ->setParameter('article', $article)
                        ->getQuery(); 
                        $rows = $query->getResult();
                        if (!empty($rows)) {
                            foreach ($rows as $ta) {
                                $tag = $ta->getTag();
                                $em = $this->getDoctrine()->getManager();                
                                $em->remove($ta);
                                $em->flush();
                                if (!empty($tag)) {
                                    $globals->updateTagRang($tag);
                                }
                            }
                        }    
                    }
                    // Связывание с тегами
                    foreach ($tags as $tag) {
                        $ta = new TagArticle;
                        $ta->setTag($tag);
                        $ta->setArticle($article);
                        $em = $this->getDoctrine()->getManager();                
                        $em->persist($ta);
                        $em->flush();
                        if (!empty($tag)) {
                            $globals->updateTagRang($tag);
                        }
                    }
                    // Сохранение изображения
                    if ($create_image) {
                        foreach ($globals->imageFormats as $ext => $format) {
                            $dir = 'filedata/images_article/';
                            $fs->remove($dir.$article->getId().'.'.$ext);
                            if ($format['type'] == $_FILES['form']['type']['image']) {
                                if ($format['available']) {
                                    $available = true;
                                    $filename = $article->getId().'.'.$ext;
                                    $image_data = @exif_read_data($_FILES['form']['tmp_name']['image']);
                                    if (!empty($image_data)) {                                    
                                        $width = $image_data['COMPUTED']['Width'];
                                        $height = $image_data['COMPUTED']['Height'];                                                                                
                                        $fs->copy($_FILES['form']['tmp_name']['image'], $dir.$article->getId().'.'.$ext);
                                        $article->setImageWidth($width);
                                        $article->setImageHeight($height);
                                        $article->setImageFormat($ext);
                                        //$article->setImageTitle('');                                    
                                        $globals->createArticleImagePreset($article, 'thumb'); 
                                        $em = $this->getDoctrine()->getManager();                
                                        $em->persist($article);
                                        $em->flush();
                                    }
                                    break;
                                }
                            }
                        }                        
                    }
                    // Индексация                    
                    $globals->addPageIndex($page, true);
                    // Обновление алиаса
                    $page2 = $this->getDoctrine()
                    ->getRepository('NeagMainBundle:SimplePagePage')
                    ->find($page->getId());                    
                    $globals->updateArticleAlias($page2);
                    // Сброс кеша
                    $this->clearBlogCache();
                    if ($edit) {
                        $this->message('Изменения внесены', 'ok');
                    } else {
                        $this->message('Новая публикация отправлена на премодерацию. Она появится на сайте после утверждения модератором. До утверждения вы можете внести правки.', 'ok');
                    }
                    //$redirect = $this->generateUrl('user_sport_section_list', Array());
                    if ($page2->getActive()) {
                        $redirect = $globals->buildPageLink($page2);
                    } else {
                        if (!$globals->isMobile()) {
                            $redirect = $this->generateURL('user_blog_list');
                        } else {
                            $redirect = $this->generateURL('user_blog_list_m');
                        }
                    }
                    return $this->redirect($redirect);
                }
            }
        }
        
        if (!empty($page)) {
            if (!$globals->isMobile()) {
                $action = $this->generateURL('user_blog_edit', Array('id' => $page->getId()));   
            } else {
                $action = $this->generateURL('user_blog_edit_m', Array('id' => $page->getId())); 
            }    
        } else {
            if (!$globals->isMobile()) {
                $action = $this->generateURL('user_blog_edit', Array());
            } else {
                $action = $this->generateURL('user_blog_edit_m', Array());
            }
        }
        
        if (!$globals->isMobile()) {
            $data = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user'),
                ),
                Array(
                    'title' => 'Мои публикации',
                    'link' => $this->generateURL('user_blog_list'),
                ),
                Array(
                    'title' => $edit ? 'Редактирование публикации' : 'Новая публикация',
                    'link' => $action,
                ),
            );
        } else {
            $data = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user_m'),
                ),
                Array(
                    'title' => 'Мои публикации',
                    'link' => $this->generateURL('user_blog_list_m'),
                ),
                Array(
                    'title' => $edit ? 'Редактирование публикации' : 'Новая публикация',
                    'link' => $action,
                ),
            );
        }
        $breadcrumbs = parent::buildBreadcrumbs($data);
        //$this->trace($data);
        //$this->trace($breadcrumbs);

        return array(
            'is_mobile' => $is_mobile,
            'image_src' => !empty($image_src) ? $image_src : null,
            'image_width' => !empty($image_width) ? $image_width : null,
            'image_height' => !empty($image_height) ? $image_height : null,
            'form' => $form->createView(),
            'edit' => $edit,
            'action' => $action,
            'breadcrumbs' => $breadcrumbs,            
        ); 
        
    }
    
    /**
     * @Route("/user/blog_list")
     * @Template("NeagMainBundle:User:blog_list.html.twig")
     */
    public function blogListAction()
    {
        $del = $this->getRequest()->query->get('del'); 
        $globals = $this->get('globals');
        
        $desktop_link = $this->generateURL('user_blog_list', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_blog_list_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
        
        $DB = $this->get('database_connection'); 
        
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        
        $request = $this->getRequest();
        
        if (!$globals->isUserLoggedIn()) {
            if (!$globals->isMobile()) {
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        } else {
            $user_info = $globals->getUserInfo();
        }
        if (!empty($user_info['entity'])) {
            $user = $user_info['entity'];
        } else {
            if (!$globals->isMobile()) {
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        }
        
        $session = $globals->getSession();          
        
        /*
        if (!empty($del)) {            
            $query = $this->getDoctrine()->getManager()->createQueryBuilder()
            ->select(Array('p', 'r', 'a'))
            ->from('NeagMainBundle:SimplePagePage', 'p')
            ->leftJoin('p.articles', 'a')
            ->leftJoin('p.revisions', 'r')
            ->where('a.id = :aid')
            ->setParameter('aid', $del)
            ->andWhere('a.user = :user')
            ->setParameter('user', $user)
            ->getQuery(); 
            $rows = $query->getResult();
            if (!empty($rows)) {
                $SimplePagePage = $rows[0];
            } else {
                $SimplePagePage = null;
            }
            if (!empty($SimplePagePage)) {
                if (!empty($SimplePagePage)) {
                    $em = $this->getDoctrine()->getManager();                
                    $em->remove($SimplePagePage);
                    $em->flush();
                    $this->message('Публикация успешно удалена', 'ok');
                }            
            }
            //$this->clearCache();
        }
        */
        
        if (!empty($del)) {
            $query = $this->getDoctrine()->getManager()->createQueryBuilder()
            ->select(Array('p'))
            ->from('NeagMainBundle:SimplePagePage', 'p')
            ->where('p.id = :pid')
            ->setParameter('pid', $del)
            ->andWhere('p.user = :user')
            ->setParameter('user', $user)
            ->getQuery(); 
            $rows = $query->getResult();
            if (!empty($rows)) {
                $page = $rows[0];
            } else {
                $page = null;
            }
            if (!empty($page)) {
                $is_editable = $globals->isUserPageEditable($page);
                if ($is_editable) {
                    // Удаление эскизов изображений
                    $articles = $page->getArticles();
                    if (!empty($articles)) {
                        $globals->removeArticleImage($articles[0]);
                    } 
                    // Удаление комментариев
                    if (!empty($page)) {
                        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
                        ->delete('NeagMainBundle:Comment', 'c')
                        ->where('c.page = :page')
                        ->setParameter('page', $page)
                        ->getQuery()
                        ->execute(); 
                    }
                    // Удаление индекса
                    if (!empty($page)) {   
                        $globals->removePageIndex($page); 
                    }
                    // Разрыв связей с тегами, пересчёт рангов тегов
                    $articles = $page->getArticles();
                    if (!empty($articles)) {
                        $article = $articles[0];
                        $tagArticles = $article->getTagArticles();
                        foreach ($tagArticles as $ta) {                        
                            $tag = $ta->getTag();
                            $em = $this->getDoctrine()->getManager();                
                            $em->remove($ta);
                            $em->flush();
                            if (!empty($tag)) {
                                $globals->updateTagRang($tag);
                            }
                        }
                    }
                    $revisions = $page->getRevisions();
                    foreach ($articles as $a) {
                        $em = $this->getDoctrine()->getManager();                
                        $em->remove($a);
                        $em->flush();                    
                    }
                    foreach ($revisions as $r) {
                        $em = $this->getDoctrine()->getManager();                
                        $em->remove($r);
                        $em->flush();                    
                    }
                    if (!empty($page)) {
                        $em = $this->getDoctrine()->getManager();                
                        $em->remove($page);
                        $em->flush();
                        $this->message('Статья успешно удалена', 'ok');
                    } 
                } else {
                    $this->message('Вы не можете удалить публикацию, так как она уже опубликована.', 'warning');
                }          
            }
            $this->clearBlogCache();
        }
        
        $sort_by = 'id'; 
        $sort_direction = 'desc';

        // Pager
        $pager = $this->get('punk_ave.pager_factory')->createPager("DoctrineORM");
        $request = $this->getRequest();
        $pager->bindRequest($request);
        $currentPage = ($request->query->has('page'))? $request->query->get('page') : 1;
        $pager->setCurrentPage($currentPage);
        $pager->setMaxPerPage(20);
        $pager->setRoute($this->getRequest()->get('_route'), Array());
        // qb
        $qb = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('p'))
        ->from('NeagMainBundle:SimplePagePage', 'p')
        ->andWhere('p.user = :user')
        ->setParameter('user', $user)
        ->orderBy('p.'.$sort_by, $sort_direction);
        // bind
        $pager->setQueryBuilder($qb);
        $rows = $pager->getResults();
        $data = Array();
        foreach ($rows as $row) {
            $page = $row;
            $revision = null;
            $article = null;
            $qb2 = $this->getDoctrine()->getManager()->createQueryBuilder()
            ->select(Array('r'))
            ->from('NeagMainBundle:SimplePagePageRevision', 'r')
            ->andWhere('r.page = :page')
            ->setParameter('page', $page)
            ->andWhere('r.current = :current')
            ->setParameter('current', true);
            $rows2 = $qb2->getQuery()->getResult();
            if (!empty($rows2)) {
                $revision = $rows2[0];
            }
            $qb2 = $this->getDoctrine()->getManager()->createQueryBuilder()
            ->select(Array('a'))
            ->from('NeagMainBundle:Article', 'a')
            ->andWhere('a.page = :page')
            ->setParameter('page', $page);
            $rows3 = $qb2->getQuery()->getResult();
            if (!empty($rows3)) {
                $article = $rows3[0];
            }
            if (!empty($revision) && !empty($article)) {
                $data[] = Array(
                    'id' => $page->getId(),
                    'title' => $revision->getTitle(),
                    'code' => '[url='.$row->getId().']'.$revision->getTitle().'[/url]',
                    'time' => $page->getTime()->format('d.m.Y H:i:s'),
                    'time_create' => $page->getTimeCreate()->format('d.m.Y H:i:s'),
                    'time_update' => $revision->getTimeEdit()->format('d.m.Y H:i:s'),
                    'link' => $globals->buildPageLink($page),                
                    'waiting' => $article->getWaiting(),
                    'rejected' => $article->getRejected(),
                    'status' => $article->getWaiting() ? 'ожидает' : 'опубликована',
                    'active' => $page->getActive() ? 'да' : 'нет',
                    'delete_link' => $this->generateUrl('user_blog_list', array('del' => $row->getId())),
                    'edit_link' => $this->generateUrl('user_blog_edit', array('id' => $row->getId())), 
                );
            }
        }
        
        if (!$globals->isMobile()) {
            $breadcrumbs = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user'),
                ),
                Array(
                    'title' => 'Мои публикации',
                    'link' => $this->generateURL('user_blog_list'),
                ),
            );
        } else {
            $breadcrumbs = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user_m'),
                ),
                Array(
                    'title' => 'Мои публикации',
                    'link' => $this->generateURL('user_blog_list_m'),
                ),
            );
        }
        $breadcrumbs = parent::buildBreadcrumbs($breadcrumbs);
        
        if (!$is_mobile) {
            $add_link = $this->generateUrl('user_blog_edit', array());
        } else {
            $add_link = $this->generateUrl('user_blog_edit_m', array());
        }
        return Array(
            //'sort_form_action' => $this->generateURL('admin_sport_section_list'),
            //'sort_form_reset_link' => $this->generateURL('admin_sport_section_list', Array('action' => 'sort_reset')),
            //'sort_form' => $sort_form->createView(),            
            'is_mobile' => $is_mobile,
            'data' => $data, 
            'add_link' => $add_link, 
            'pager' => $this->renderPager($pager),
            'breadcrumbs' => $breadcrumbs, 
        );
    }
    
    /**
     * @Route("/blog/{blog_alias}")
     * @Template("NeagMainBundle:User:blog.html.twig")
     */
    public function blogAction($blog_alias)
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating'); 
        $request = $this->get('request'); 
        
        $desktop_link = $this->generateURL('blog', array_merge(Array('blog_alias' => $blog_alias), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('blog_m', array_merge(Array('blog_alias' => $blog_alias), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);      
       
        $userBlogger = null;             
        
        $qb = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('u'))
        ->from('NeagMainBundle:User', 'u');
        $qb->andWhere('u.bloggerAlias = :blog_alias')
        ->setParameter('blog_alias', $blog_alias);
        $qb->andWhere('u.blogger = :blogger')
        ->setParameter('blogger', true);
        $rows = $qb->getQuery()->getResult();
        if (count($rows) > 0) {
            $userBlogger = $rows[0];
        }
        
        if (empty($userBlogger)) {
            return $this->getErrorResponse('Блог не существует, либо заблокирован.');             
        }
        
        $user_info = $globals->buildUserInfo($userBlogger);
        
        $is_owner = false;
        if ($globals->isUserLoggedIn()) {
            $user_info_this = $globals->getUserInfo();
            $user = $user_info_this['entity'];
            if ($user->getId() == $userBlogger->getId()) {
                $is_owner = true;
            }
        }
        
        // Кол-во оставленных комментариев
        $comments_count = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('COUNT(c.id)'))
        ->from('NeagMainBundle:Comment', 'c')
        ->where('c.user = :user')       
        ->setParameter('user', $userBlogger)
        ->andWhere('c.waiting = :waiting')       
        ->setParameter('waiting', false)
        ->getQuery()
        ->getSingleScalarResult();
        
        if (!$is_mobile) {
            $comments_link = $this->generateURL('comments', Array('user_id' => $userBlogger->getId()));
        } else {
            $comments_link = $this->generateURL('comments_m', Array('user_id' => $userBlogger->getId()));
        }  
        
        // Pager
        $pager = $this->get('punk_ave.pager_factory')->createPager("DoctrineORM");
        $request = $this->getRequest();
        $pager->bindRequest($request);
        $currentPage = ($request->query->has('page'))? $request->query->get('page') : 1;
        $pager->setCurrentPage($currentPage);
        $pager->setMaxPerPage(50);
        $pager->setRoute($this->getRequest()->get('_route'), Array('blog_alias' => $blog_alias));
        // Анонсы
        $qb = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('a', 'p', 'pr'))
        ->from('NeagMainBundle:SimplePagePage', 'p')
        ->leftJoin('p.revisions', 'pr')
        ->leftJoin('p.articles', 'a')
        ->leftJoin('p.user', 'u');
        $qb->andWhere('p.active = :active')
        ->setParameter('active', true);
        $qb->andWhere('pr.current = :current')
        ->setParameter('current', true);
        $qb->andWhere('p.user = :user')
        ->setParameter('user', $userBlogger);
        /*
        $qb->andWhere('u.bloggerAlias = :blog_alias')
        ->setParameter('blog_alias', $blog_alias);
        $qb->andWhere('u.blogger = :blogger')
        ->setParameter('blogger', true);
        */
        $qb->orderBy('p.time', 'DESC');
        $pager->setQueryBuilder($qb);
        $rows = $pager->getResults();
        //$rows = $qb->getQuery()->getResult();
        $announces = Array();
        foreach ($rows as $row) {
            $revision = $globals->getPageCurrentRevision($row);
            $article = $globals->getPageArticle($row);
            if (!empty($revision) && !empty($article)) {
                if (!$globals->hasArticleImagePreset($article, 'thumb')) {
                    $globals->createArticleImagePreset($article, 'thumb');
                }
                $announces[] = Array(
                    'title' => $revision->getTitle(),
                    'link' => $globals->buildPageLink($row),
                    'annotation' => $article->getAnnotation(),
                    'date' => $row->getTime()->format('d.m.Y'), 
                    'image' => $globals->getArticlePresetImageInfo($article, 'thumb'),
                );
            }
        } 
        //$this->trace($announces);
        $view = $templating->render(
            'NeagMainBundle:User:blog.html.php',
            Array(
                'announces' => $announces,
                'pager' => $this->renderPager($pager),                
            )
        );
        
        if (!$globals->isMobile()) {
            $user_blog_list_link = $this->generateURL('user_blog_list');
        } else {
            $user_blog_list_link = $this->generateURL('user_blog_list_m');
        }           
        
        $params = Array(
            'is_mobile' => $is_mobile,
            'is_owner' => $is_owner,
            'blog_articles_edit_link' => $user_blog_list_link,
            'profile_edit_link' => $user_info['profile_edit_link'],
            'user_name' => $userBlogger->getName(),
            'info' => $this->infoAction($userBlogger->getId(), false),
            'content' => $view,
            'comments_count' => $comments_count,
            'comments_link' => $comments_link,
        );
        return $params;
    } 
    
    /**
     * @Route("/bbcode/help")
     * @Template("NeagMainBundle:User:bbcode_help.html.twig")
     */
    public function bbcodeHelpAction()
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        
        $desktop_link = $this->generateURL('bbcode_help');
        $mobile_link = $this->generateURL('bbcode_help_m');
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link); 
        
        $table = Array();
        /*
        $example = '[ind]В Финляндии под коммерческой тайной подразумевают сведения о технологии производства, схемы и чертежи отдельных узлов и готовых клиентов, уровень цен и размер скидок с прейскурантов цен, бюджет фирмы и другие данные которые ппри попадании в руки конкурента или третьих лиц могут причинить ущерб деятельности фирмы или содействовать успеху конкурента. В Германии – это коммерческие замыслы, коммерческо-политические цели фирмы, предмет и цели совещаний и заседаний органов управления фирмы, размер и условия банковских кредитов, расчеты цен, балансы и бухгалтерские книги, негласные компаньоны товариществ, компьютерные программы, списки представителей или посредников, картотеки клиентов и пр.[/ind]';
        $table[] = Array(
            'tag' => '[ind]',
            'desc' => 'Добавляет отступ к каждой каждой новой строчке в тексте, заключённом между тегами [ind]...[/ind].',
            'example' => $example,
            'replace' => $globals->parseBBCode($example),
        );
        */
        $example = '[img]http://static.php.net/www.php.net/images/php.gif[/img]';
        $table[] = Array(
            'tag' => '[img]',
            'desc' => 'Вставляет в текст картинку по гиперссылке, или пользовательскую картинку по её id-номеру.',
            'example' => $example,
            'replace' => $globals->parseBBCode($example),
        );
        $example = 'Коммерческая тайна и информация, составляющая коммерческую тайну – сегодня два разных понятия. Коммерческая тайна – это не информация, а конфиденциальность информации. [imgl]http://static.php.net/www.php.net/images/php.gif[/imgl] Четкое понимание этого аспекта нового законодательного регулирования института коммерческой тайны позволит прийти ко многим существенным выводам.';
        $table[] = Array(
            'tag' => '[imgl]',
            'desc' => 'Действует аналогично тегу [img], но с выравниванием по левому краю с обтеканием.',
            'example' => $example,
            'replace' => $globals->parseBBCode($example),
        );
        $example = 'Коммерческая тайна и информация, составляющая коммерческую тайну – сегодня два разных понятия. Коммерческая тайна – это не информация, а конфиденциальность информации. [imgr]http://static.php.net/www.php.net/images/php.gif[/imgr] Четкое понимание этого аспекта нового законодательного регулирования института коммерческой тайны позволит прийти ко многим существенным выводам.';
        $table[] = Array(
            'tag' => '[imgr]',
            'desc' => 'Действует аналогично тегу [img], но с выравниванием по правому краю с обтеканием.',
            'example' => $example,
            'replace' => $globals->parseBBCode($example),
        );
        $example = '[size=7]текст[/size] [size=12]текст[/size] [size=24]текст[/size]';
        $table[] = Array(
            'tag' => '[size]',
            'desc' => 'Устанавливает размер текста в пикселах',
            'example' => $example,
            'replace' => $globals->parseBBCode($example),
        );
        $example = '[video]http://www.youtube.com/watch?v=wBqM2ytqHY4[/video]<br/>[youtube size="small"]wBqM2ytqHY4[/youtube]<br/>[dailymotion]x22e1gk_assassin-s-creed-unity-arno-master-assassin-cg-trailer_videogames[/dailymotion]';
        $exampleBR = '[video]http://www.youtube.com/watch?v=wBqM2ytqHY4[/video][br][youtube size="small"]wBqM2ytqHY4[/youtube][br][dailymotion]x22e1gk_assassin-s-creed-unity-arno-master-assassin-cg-trailer_videogames[/dailymotion]';
        $table[] = Array(
            'tag' => '[video]<br/>[youtube]<br/>[vimeo]<br/>[vevo]<br/>[veoh]<br/>[liveleak]<br/>[dailymotion]<br/>[myspace]<br/>[collegehumor]<br/>[funnyordie]<br/>[wegame]',
            'desc' => 'Вставка видео.<br/>Универсальный тег [video]URL видео[/video], остальные теги прописываются так: [dailymotion]видео ID или URL[/dailymotion].<br/>Размер окна задаётся атрибутом size (small / medium / large), например: [youtube size="small"]',
            'example' => $example,
            'replace' => $globals->parseBBCode($exampleBR),
        );        
        
        return Array(
            'is_mobile' => $is_mobile,                                                                                
            'table' => $table, 
        ); 
    } 
    
    /**
     * @Route("/user/info/{id}")
     * @Template("NeagMainBundle:User:info.html.twig")
     */
    public function infoAction($id, $set_switch_urls = true)
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');
        $request = $this->get('request');
        $is_admin = $this->isAdmin();
        $is_mobile = $globals->isMobile();
        
        if ($set_switch_urls) {
            $desktop_link = $this->generateURL('user_info', Array('id' => $id));
            $mobile_link = $this->generateURL('user_info_m', Array('id' => $id));
            $globals->setDesktopLink($desktop_link);
            $globals->setMobileLink($mobile_link);            
        }
        
        $user = null;
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('u'))
        ->from('NeagMainBundle:User', 'u')
        ->where('u.id = :id')
        ->setParameter('id', $id)
        ->getQuery();
        $rows = $query->getResult();
        if (!empty($rows)) {
            $user = $rows[0];
        }
        
        if (empty($user)) {
            return new Responce('User not found');
        }
        
        $user_info = $globals->buildUserInfo($user);
        
        $is_own = false;
        if ($globals->isUserLoggedIn()) {
            $user_info_this = $globals->getUserInfo();
            $is_own = ($user_info['id'] == $user_info_this['id']);
        }       
        
        $description = !empty($user_info['description']) ? nl2br(htmlspecialchars($user_info['description'])) : null;
        $contacts = !empty($user_info['contacts']) ? nl2br(htmlspecialchars($user_info['contacts'])) : null;
        
        // Кол-во оставленных комментариев
        $comments_count = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('COUNT(c.id)'))
        ->from('NeagMainBundle:Comment', 'c')
        ->where('c.user = :user')       
        ->setParameter('user', $user)
        ->andWhere('c.waiting = :waiting')       
        ->setParameter('waiting', false)
        ->getQuery()
        ->getSingleScalarResult();
        //$this->trace($comments_count);
        
        //$this->trace($user_info['image_info']);
        
        if (!$globals->isMobile()) {
            $profile_edit_link = $this->generateURL('user_profile');
        } else {
            $profile_edit_link = $this->generateURL('user_profile_m');
        }
        
        $mail_link = null;
        //$this->trace($globals->isUserLoggedIn() ? 'logged in' : 'not logged in');
        //$this->trace($user_info['is_mail_allow'] ? 'mail allow' : 'not mail allow');
        if ($user_info['is_mail_allow'] && $globals->isUserLoggedIn()) {
            //$this->trace('chp 1');
            if (!$globals->isMobile()) {
                $mail_link = $this->generateURL('user_mail', Array('id' => $user->getId()));
            } else {
                $mail_link = $this->generateURL('user_mail_m', Array('id' => $user->getId()));
            }
        }
        
        if ($is_admin) {
            $profile_edit_link = $this->generateURL('admin_user_edit', Array('id' => $user_info['id']));
        }
        
        if (!$is_mobile) {
            $comments_link = $this->generateURL('comments', Array('user_id' => $user->getId()));
        } else {
            $comments_link = $this->generateURL('comments_m', Array('user_id' => $user->getId()));
        }
        
        return Array(
            'is_mobile' => $is_mobile,
            'user_name' => $user->getName(),
            'user_info' => $user_info,
            'is_own' => $is_own,
            'is_admin' => $is_admin,
            'profile_edit_link' => $profile_edit_link,
            'mail_link' => $mail_link,
            'description' => $description,
            'contacts' => $contacts,
            'comments_count' => $comments_count,
            'comments_link' => $comments_link,
        );
    } 
    
    /**
     * @Route("/user/mail/{id}")
     * @Template("NeagMainBundle:User:mail.html.twig")
     */
    public function mailAction($id)
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $request = $this->getRequest();
        
        $desktop_link = $this->generateURL('user_mail', array_merge(Array('id' => $id), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_mail_m', array_merge(Array('id' => $id), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
        
        $user = null;
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('u'))
        ->from('NeagMainBundle:User', 'u')
        ->where('u.id = :id')
        ->setParameter('id', $id)
        ->getQuery();
        $rows = $query->getResult();
        if (!empty($rows)) {
            $user = $rows[0];
        }
        
        $user_info = $globals->buildUserInfo($user); 
        
        if (empty($user)) {
            return new Responce('User not found');
        }        
        
        $is_logged_in = $globals->isUserLoggedIn();
        if ($is_logged_in) {
            $user_info_this = $globals->getUserInfo();
        } 
        
        if (!$user_info['is_mail_allow'] || !$globals->isUserLoggedIn()) {
            if (!$globals->isMobile()) {
                $redirect_link = $this->generateURL('user_info', Array('id' => $user->getId()));
            } else {
                $redirect_link = $this->generateURL('user_info_m', Array('id' => $user->getId()));
            }
            $this->message('Вы не можете написать письмо данному пользователю.', 'warning');
            return $this->redirect($redirect_link);
        } 
        
        //
        
        //$Feedback = new Feedback();
        //$builder = $this->createFormBuilder($Feedback);       
        $builder = $this->createFormBuilder(); 
        $builder->add('name', 'text', Array('label' => 'Ваше имя', 'trim' => true, 'required' => false, 'disabled' => true, 'data' => $user_info_this['name']));
        $default_email = '';      
        $builder->add('email', 'email', Array('label' => 'Ваш e-mail', 'trim' => true, 'required' => true, 'data' => $user_info_this['email']));        
        $builder->add('text', 'textarea', Array('label' => 'Текст сообщения', 'trim' => true, 'required' => true));
        $this->securityAlterForm($builder);
        $form = $builder->getForm();
        
        if ($request->isMethod('POST')) {
            $submitted_values = $_POST[$form->getName()];
            $form->bind($submitted_values);
            $this->securityValidateForm($form, $submitted_values);            
            if ($form->isValid()) {
                $time = date('Y-m-d H:i:s', time());
                $title = 'Письмо от пользователя "'.$user_info_this['name'].'"';
                $link = $user_info_this['profile_absolute_link'];
                //$this->message('chp 1');
                if ($user_info_this['is_blogger']) {
                    //$this->message('chp 2');
                    $link = $user_info_this['blog_absolute_link'];
                }
                $message = 'Здравствуйте! Пользователь "'.$user_info_this['name'].'" ('.$user_info_this['email'].') вам прислал сообщение.'."\n\n";
                $message .= '--------'."\n\n";
                $message .= $submitted_values['text']."\n\n";
                $message .= '--------'."\n\n";
                $message .= 'Если вы хотите ответить, напишите на e-mail пользователя: '.$user_info_this['email']."\n";
                $message .= 'Информация о пользователе на сайте: '.$link."\n"."\n";
                $message .= 'Если вы не хотите получать письма от других пользователей, вы можете отключить опцию в личных настройках: '.$this->generateURL('user_profile', Array(), true);
                $globals->mail($user_info['email'], $title, $message, $user_info_this['email']);
                $log_message = 'Письмо пользователя "'.$user_info_this['name'].'" пользователю "'.$user_info['name'].'".'."\n";
                $log_message .= 'Информация пользователя "'.$user_info_this['name'].'": '.$user_info_this['profile_absolute_link'].'.'."\n";
                $log_message .= 'Информация пользователя "'.$user_info['name'].'": '.$user_info['profile_absolute_link'].'.'."\n"."\n";
                $log_message .= 'Текст письма: '."\n";
                $log_message .= $message."\n";
                $this->log($log_message, 'user_mail');
                /*              
                if ($is_logged_in) {
                    $Feedback->setName($user_info['name']);
                    $Feedback->setUser($user_info['entity']);
                }    
                $Feedback->setIp($request->getClientIp());
                $Feedback->setCookieId($this->getCookieId());                
                $Feedback->setTime(new \DateTime($time));                
                $em = $this->getDoctrine()->getManager();                
                $em->persist($Feedback);
                $em->flush();
                if (!$is_logged_in) {
                    $name = $submitted_values['name'];
                } else {
                    $name = $user_info['name'];
                }
                $email = $submitted_values['email'];
                // Отпарвка по e-mail
                $body = 'Имя отправителя: '.$name."\n";
                if ($is_logged_in) {
                    //$body .= 'Информация пользователя: '.$user_info['profile_link']."\n";
                    $body .= 'Информация пользователя: '.$this->generateURL('user_info', Array('id' => $user_info['id']), true)."\n";
                }
                $body .= 'E-mail: '.$email."\n"
                .'Текст сообщения: '."\n"
                .$submitted_values['text']."\n"."\n"
                .'IP: '.$request->getClientIp()."\n"
                .'COOKIE-идентификатор: '.$this->getCookieId()."\n"
                .'Время отправки: '.$time."\n"."\n"
                .'Письмо отправлено почтовым роботом. Отвечать на него не нужно. Ответы следует отправлять на e-mail "'.$email.'".';
                $globals->mail($globals->getConfigVar('feedback_email'), 'Пришло сообщение по обратной связи', $body);
                */
                $this->message('Ваше сообщение успешно отправлено.', 'ok');
                if (!$is_mobile) {
                    $redirect = $user_info['profile_link'];
                } else {
                    $redirect = $user_info['profile_link']; 
                }
                return $this->redirect($redirect);                
            }                
        }
        
        if (!$is_mobile) {
            $action = $this->generateURL('user_mail', Array('id' => $id));  
        } else {
            $action = $this->generateURL('user_mail_m', Array('id' => $id));  
        }
        
        return Array(
            'is_mobile' => $is_mobile, 
            'action' => $action, 
            'is_logged_in' => $is_logged_in, 
            'form' => $form->createView(),
            'user_name' => $user->getName(),
        ); 
    }    
    
    /**
     * @Route("/user/pass_change")
     * @Template("NeagMainBundle:User:pass_change.html.twig")
     */
    public function passChangeAction()
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');

        $desktop_link = $this->generateURL('user_pass_change', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_pass_change_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);  
        
        if (!$globals->isUserLoggedIn()) {
            if (!$globals->isMobile()) {
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        } else {
            $user_info = $globals->getUserInfo();
        }
        
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('u'))
        ->from('NeagMainBundle:User', 'u')
        ->where('u.id = :id')
        ->setParameter('id', $user_info['id'])
        ->getQuery(); 
        $rows = $query->getResult();
        if (!empty($rows)) {
            $user = $rows[0];
        } else {
            if (!$globals->isMobile()) {
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        }
        
        //$type = $user->getType();               
        
        $fb = $this->createFormBuilder($user);
        $fb->add(
            'pass', 'password', Array(
                'label' => 'Новый пароль',
                'help' => 'Должен состоять минимум из 5 символов.',
                'mapped' => false,
            )
        )
        ->add(
            'pass2', 'password', Array(
                'label' => 'Новый пароль ещё раз',
                'mapped' => false,
            )
        )
        ->add(
            'pass_current', 'password', Array(
                'label' => 'Текущий пароль',
                'mapped' => false,
            )
        );
        $form = $fb->getForm();
        
        $request = $this->getRequest();        
        
        if ($request->isMethod('POST')) {
            $submitted_values = $_POST[$form->getName()];  
            $form->bind($request);            
            // Проверка пароля
            if (!empty($submitted_values['pass_current'])) {
                if ($user->getPass() != md5(trim($submitted_values['pass_current']))) {
                    $error = new FormError("Неверный пароль");                    
                    $form->get('pass_current')->addError($error);
                }
            } else {
                $error = new FormError("Не указан текущий пароль");
                $form->get('pass_current')->addError($error);
            }
            if (!empty($submitted_values['pass'])) {
                if (mb_strlen(trim($submitted_values['pass']), 'utf-8') < 5) {
                    $error = new FormError("Слишком короткий пароль. Минимальная длина пароля - 5 символов.");                    
                    $form->get('pass')->addError($error);
                } else if (empty($submitted_values['pass2'])) {
                    // Повторный ввод пароля
                    $error = new FormError("Введите повторно пароль!");                    
                    $form->get('pass2')->addError($error);
                } else if (trim($submitted_values['pass']) != trim($submitted_values['pass2'])) {
                    // Проверка соответствия паролей
                    $error = new FormError("Введённый пароль не совпадает с повторным вводом.");                    
                    $form->get('pass')->addError($error);
                }
            } else {
                $error = new FormError("Не указан пароль");
                $form->get('pass')->addError($error);
            }      
            
            if ($form->isValid()) {
                $user->setPass(md5($submitted_values['pass']));
                $em = $this->getDoctrine()->getManager();                
                $em->persist($user);
                $em->flush();
                $this->message('Пароль успешно изменён');
                return $this->redirect($this->generateUrl('user_pass_change'));
            } else {
                foreach ($form->getErrors() as $key => $error) {
                    $template = $error->getMessageTemplate();
                    $parameters = $error->getMessageParameters();
                    foreach($parameters as $var => $value){
                        $template = str_replace($var, $value, $template);
                    }
                    $this->message($template, 'error');
                }
            }             
        }
        
        if (!$globals->isMobile()) {
            $action = $this->generateURL('user_pass_change');
        } else {
            $action = $this->generateURL('user_pass_change_m');
        }
        
        if (!$globals->isMobile()) {
            $breadcrumbs = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user'),
                ),
                Array(
                    'title' => 'Смена пароля',
                    'link' => $this->generateURL('user_pass_change'),
                ),
            );
        } else {
            $breadcrumbs = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user_m'),
                ),
                Array(
                    'title' => 'Смена пароля',
                    'link' => $this->generateURL('user_pass_change_m'),
                ),
            );
        }
        $breadcrumbs = parent::buildBreadcrumbs($breadcrumbs);  
        
        return Array(
            'is_mobile' => $is_mobile,
            'action' => $action,
            'form' => $form->createView(),
            'breadcrumbs' => $breadcrumbs, ments
        );            
    }
    
    /**
     * @Route("/user/email_change")
     * @Template("NeagMainBundle:User:email_change.html.twig")
     */
    public function emailChangeAction()
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');
        
        $desktop_link = $this->generateURL('user_email_change', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_email_change_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);   
        
        if (!$globals->isUserLoggedIn()) {
            if (!$globals->isMobile()) {
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        } else {
            $user_info = $globals->getUserInfo();
        }
        
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('u'))
        ->from('NeagMainBundle:User', 'u')
        ->where('u.id = :id')
        ->setParameter('id', $user_info['id'])
        ->getQuery(); 
        $rows = $query->getResult();
        if (!empty($rows)) {
            $user = $rows[0];
        } else {
            if (!$globals->isMobile()) {
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        }
        
        //$type = $user->getType();               
        
        $fb = $this->createFormBuilder($user);
        $title = 'Новый e-mail';
        $change = true;
        if (empty($user_info['email'])) {
            $title = 'E-mail';
            $change = false;
        }
        $fb->add(
            'email', 'text', Array(
                'label' => $title,
                'mapped' => false,
                'help' => 'На указанный e-mail будет отправлено письмо со ссылкой подверждения.'
            )
        );
        if (!$user_info['is_vk'] && !$user_info['is_fb']) {
            $fb->add(
                'pass_current', 'password', Array(
                    'label' => 'Текущий пароль',
                    'mapped' => false,
                )
            );
        }
        $form = $fb->getForm();
        
        $request = $this->getRequest();        
        
        if ($request->isMethod('POST')) {
            $submitted_values = $_POST[$form->getName()];  
            $form->bind($request);            
            if (!$user_info['is_vk'] && !$user_info['is_fb']) {
                // Проверка пароля
                if (!empty($submitted_values['pass_current'])) {
                    if ($user->getPass() != md5(trim($submitted_values['pass_current']))) {
                        $error = new FormError("Неверный пароль");                    
                        $form->get('pass_current')->addError($error);
                    }
                } else {
                    $error = new FormError("Не указан текущий пароль");
                    $form->get('pass_current')->addError($error);
                }
            }
            // Проверка e-mail
            if (!filter_var($submitted_values['email'], FILTER_VALIDATE_EMAIL)) {
                $error = new FormError("Некорректно указан e-mail");
                $form->get('email')->addError($error);
            } else {
                // Проверка дубля e-mail
                $query = $this->getDoctrine()->getManager()->createQueryBuilder()
                ->select(Array('u'))
                ->from('NeagMainBundle:User', 'u')
                ->where('u.email = :email')
                ->setParameter('email', trim($submitted_values['email']))
                ->andWhere('u.id != :uid')
                ->setParameter('uid', $user_info['id'])
                ->getQuery(); 
                $rows = $query->getResult();
                if (!empty($rows)) {
                    // Пользователь с таким e-mail уже зарегистрирован
                    $user = $rows[0];
                    $error = new FormError("Пользователь с таким e-mail уже зарегистрирован.");                    
                    $form->get('email')->addError($error);
                }
            }      
            
            if ($form->isValid()) {
                $sitename = $globals->getConfigVar('sitename', 'Sitename');
                $token = rand(10000, 99999).rand(10000, 99999);
                if (!$globals->isMobile()) {
                    $link = $this->generateURL('user_email_change_confirm', Array('token' => $token), true);
                } else {
                    $link = $this->generateURL('user_email_change_confirm_m', Array('token' => $token), true);
                }
                $user->setEmailChangeToken($token);
                $user->setEmailChange(trim($submitted_values['email']));
                $em = $this->getDoctrine()->getManager();                
                $em->persist($user);
                $em->flush();
                $this->message('На указанный e-mail ('.$submitted_values['email'].') выслано письмо со ссылкой подтверждения.');
                $message = 'Здравствуйте! Поступил запрос на смену e-mail. Для продолжения пройдите по ссылке:'."\r\n";
                $message .= '{link}'."\r\n"."\r\n";
                $message .= 'Если вы получили письмо по ошибке, просто удалите его. Отвечать на письмо не нужно - оно сгенерировано почтовым роботом.'."\r\n"."\r\n";
                $message .= 'С уважением. Администрация сайта "{sitename}".';
                $message = $globals->getLangVar('email_change', 'confirm_mail_body', $message, 'html');
                $message = str_replace(Array('{link}', '{sitename}'), Array($link, $sitename), $message);
                $title = 'Запрос на смену e-mail на сайте "{sitename}"!';                 
                $title = $globals->getLangVar('email_change', 'confirm_mail_title', $title, 'html');
                $title = str_replace(Array('{sitename}'), Array($sitename), $title);
                $globals->mail($submitted_values['email'], $title, $message);
                return $this->redirect($this->generateUrl('user_email_change'));
            } else {
                foreach ($form->getErrors() as $key => $error) {
                    $template = $error->getMessageTemplate();
                    $parameters = $error->getMessageParameters();
                    foreach($parameters as $var => $value){
                        $template = str_replace($var, $value, $template);
                    }
                    $this->message($template, 'error');
                }
            }             
        }
        
        $title = 'Смена e-mail';
        if (!$change) {
            $title = 'Привязка e-mail';
        }        
        
        if (!$globals->isMobile()) {
            $breadcrumbs = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user'),
                ),
                Array(
                    'title' => $title,
                    'link' => $this->generateURL('user_email_change'),
                ),
            );
        } else {
            $breadcrumbs = Array(
                Array(
                    'title' => 'Личный кабинет',
                    'link' => $this->generateURL('user_m'),
                ),
                Array(
                    'title' => $title,
                    'link' => $this->generateURL('user_email_change_m'),
                ),
            );
        }
        $breadcrumbs = parent::buildBreadcrumbs($breadcrumbs);
        
        if (!$globals->isMobile()) {
            $action = $this->generateURL('user_email_change');
        } else {
            $action = $this->generateURL('user_email_change_m');
        }    
        
        return Array(
            'is_mobile' => $is_mobile, 
            'action' => $action,
            'title' => $title,
            'form' => $form->createView(),
            'breadcrumbs' => $breadcrumbs, 
            'user_info' => $user_info,
            'change' => $change,
        );            
    }
    
    /**
     * @Route("/user/email_change_confirm/{token}")
     * @Template("NeagMainBundle:User:email_change_confirm.html.twig")
     */
    public function emailChangeConfirmAction($token)
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');            
        
        $desktop_link = $this->generateURL('user_email_change_confirm', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_email_change_confirm_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link); 
        
        $request = $this->getRequest();        
        
        $sitename = $globals->getConfigVar('sitename', 'Sitename');
        
        $title = 'Привязка e-mail';
        $change = false;
        
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('u'))
        ->from('NeagMainBundle:User', 'u')
        ->where('u.emailChangeToken = :emailChangeToken')
        ->setParameter('emailChangeToken', $token)
        ->getQuery(); 
        $rows = $query->getResult();
        $is_error = false;
        if (!empty($rows) && !empty($token)) {
            $user = $rows[0];
            $email = $user->getEmail();
            if (!empty($email)) {
                $title = 'Смена e-mail';
                $change = true;
            }
            $email_change = $user->getEmailChange();             
            // Проверка дубля e-mail
            $query = $this->getDoctrine()->getManager()->createQueryBuilder()
            ->select(Array('u'))
            ->from('NeagMainBundle:User', 'u')
            ->where('u.email = :email')
            ->setParameter('email', $email_change)
            ->andWhere('u.id != :uid')
            ->setParameter('uid', $user->getId())
            ->getQuery(); 
            $rows2 = $query->getResult();
            if (!empty($rows2)) {
                // Пользователь с таким e-mail уже зарегистрирован
                $user2 = $rows2[0];
                $this->message('Невозможно сменить e-mail, т. к. пользователь с таким адресом уже зарегистрирован.', 'error');
            } else {
                $user->setEmail($email_change);
                $user->setEmailChange(null);
                $user->setEmailChangeToken(null);
                $em = $this->getDoctrine()->getManager();                
                $em->persist($user);
                $em->flush();
                if ($change) {
                    $this->message('Ваш e-mail успешно изменён.', 'ok');
                } else {
                    $this->message('Ваш e-mail успешно привязан к аккаунту "'.$user->getName().'".', 'ok');
                }
            }
        } else {
            $is_error = true;
            $this->message('Неверный ключ, либо данная ссылка устарела.', 'error');
        }    
        
        return Array(
            'is_mobile' => $is_mobile,
            'title' => $title,
            'change' => $change,
        );            
    }
    
    /**
     * @Route("/user/blogger_demand")
     * @Template("NeagMainBundle:User:blogger_demand.html.twig")
     */
    public function bloggerDemandAction()
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');
        
        $desktop_link = $this->generateURL('user_blogger_demand', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_blogger_demand_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);  
        
        $globals->setDisableYandexAds(true);
        
        if (!$globals->isUserLoggedIn()) {
            return Array(
                'is_logged_in' => false,
            ); 
            //return $this->redirect($this->generateURL('main'));
        } else {
            $user_info = $globals->getUserInfo();
        }        
        
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('u'))
        ->from('NeagMainBundle:User', 'u')
        ->where('u.id = :id')
        ->setParameter('id', $user_info['id'])
        ->getQuery(); 
        $rows = $query->getResult();
        if (!empty($rows)) {
            $user = $rows[0];
        } else {
            if (!$globals->isMobile()) {
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        }
        
        $is_blogger = $user->getBlogger(); 
        
        //$this->trace('$is_blogger: '.$is_blogger);
        
        $blogger_demand = $user->getBloggerDemand();
        $blogger_demand_message = $user->getBloggerDemandMessage();
        
        $email = $user->getEmail();
        $email_confirm_token = $user->getEmailConfirmToken();
        
        $email_confirmed = false;
        if (!empty($email) ? empty($email_confirm_token) : false) {
            $email_confirmed = true;
        }
        
        //$type = $user->getType();               
        
        $fb = $this->createFormBuilder();
        $fb->add(
            'blogger_alias', 'text', Array(
                'label' => 'Системное имя',
                'help' => 'Укажите системное имя вашего блога, которое будет использоваться в URL. В системном имени можно использовать только маленькие латинские символы, цифры, знаки тире и подчёркивания. Максимальная длина - 50 символов.',
               'mapped' => false,
            )
        )
        ->add(
            'blogger_demand_message', 'textarea', Array(
                'label' => 'Сообщение',
                'help' => 'Напишите нам, зачем вы хотите вести блог на нашем портале, какого рода информацию хотите публиковать.',
                'mapped' => true,
                'required' => false,
            )
        );
        $form = $fb->getForm();
        
        $request = $this->getRequest();        
        
        if ($request->isMethod('POST')) {
            $submitted_values = $_POST[$form->getName()];  
            $form->bind($request);            
            if (empty($submitted_values['blogger_demand_message'])) {
                $error = new FormError("Не введено сообщение");                    
                $form->get('blogger_demand_message')->addError($error);
            }
            if (empty($submitted_values['blogger_alias'])) {
                $error = new FormError("Не указано системное имя");                    
                $form->get('blogger_alias')->addError($error);
            } else {
                // Проверка на длину
                if (strlen($submitted_values['blogger_alias']) > 50) {
                    $error = new FormError("Слишком длинное системное имя");                    
                    $form->get('blogger_alias')->addError($error);
                } else {
                    // Проверка на допустимые символы
                    if (!$globals->isValidKey($submitted_values['blogger_alias'])) {
                        $error = new FormError("Недопустимые символы в системном имени");                    
                        $form->get('blogger_alias')->addError($error);
                    } else {
                        // Проверка на уникальность
                        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
                        ->select(Array('u'))
                        ->from('NeagMainBundle:User', 'u')
                        ->where('u.id != :uid')
                        ->setParameter('uid', $user->getId())
                        ->andWhere('u.bloggerAlias = :bloggerAlias')
                        ->setParameter('bloggerAlias', $submitted_values['blogger_alias'])
                        ->getQuery(); 
                        $rows = $query->getResult();
                        if (!empty($rows)) {
                            $error = new FormError("Блог с таким системным именем уже зарегистрован. Пожалуйста, придумайте другое имя.");                    
                            $form->get('blogger_alias')->addError($error);
                        }    
                    }
                }
            }    
            
            if ($form->isValid()) {
                $user->setBloggerDemand(true);
                $user->setBloggerDemandMessage($submitted_values['blogger_demand_message']);
                $user->setBloggerAlias($submitted_values['blogger_alias']);
                $em = $this->getDoctrine()->getManager();                
                $em->persist($user);
                $em->flush();
                return $this->redirect($this->generateUrl('user_blogger_demand_next'));
            }             
        }
        
        //$this->trace('$is_blogger: '.($is_blogger ? 'yes' : 'no')); 
        
        if (!$globals->isMobile()) {
            $email_change_link = $this->generateURL('user_email_change');
            $profile_link = $this->generateURL('user_profile');
            $action = $this->generateURL('user_blogger_demand');
        } else {
            $email_change_link = $this->generateURL('user_email_change_m');
            $profile_link = $this->generateURL('user_profile_m');
            $action = $this->generateURL('user_blogger_demand_m');
        }    
        
        return Array(
            'is_mobile' => $is_mobile,
            'is_logged_in' => true,
            'is_blogger' => $is_blogger,
            'blogger_demand' => $blogger_demand,
            'email_confirmed' => $email_confirmed,
            'email' => $email,
            'email_not_empty' => !empty($email),
            'email_change_link' => $email_change_link,
            'profile_link' => $profile_link,
            'action' => $action,            
            'form' => $form->createView(),
        ); 
    }
    
    /**
     * @Route("/user/blogger_demand_next")
     * @Template("NeagMainBundle:User:blogger_demand_next.html.twig")
     */
    public function bloggerDemandNextAction()
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');
        
        $desktop_link = $this->generateURL('user_blogger_demand_next', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_blogger_demand_next_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);  
        
        if (!$globals->isUserLoggedIn()) {
            if (!$globals->isMobile()) {
                return $this->redirect($this->generateURL('main'));
            } else {
                return $this->redirect($this->generateURL('main_m'));
            }
        }
        return Array('is_mobile' => $is_mobile);
    }  
    
    /**
     * @Route("/pass_lost")
     * @Template("NeagMainBundle:User:pass_lost.html.twig")
     */
    public function passLostAction()
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');
        
        $desktop_link = $this->generateURL('pass_lost', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('pass_lost_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);             
        
        $fb = $this->createFormBuilder();
        $fb->add(
            'email', 'text', Array(
                'label' => 'E-mail',
            )
        );
        $form = $fb->getForm();
        
        $request = $this->getRequest();        
        
        if ($request->isMethod('POST')) {
            $submitted_values = $_POST[$form->getName()];  
            $form->bind($request);            
            // Поиск пользователя с указанным e-mail
            if (empty($submitted_values['email'])) {
                $error = new FormError("Не указан e-mail");
                $form->get('email')->addError($error);
            }           
            if ($form->isValid()) {
                $sitename = $globals->getConfigVar('sitename', 'Sitename');
                $query = $this->getDoctrine()->getManager()->createQueryBuilder()
                ->select(Array('u'))
                ->from('NeagMainBundle:User', 'u')
                ->where('u.email = :email')
                ->setParameter('email', trim($submitted_values['email']))
                ->getQuery(); 
                $rows = $query->getResult();
                if (!empty($rows)) {
                    $user = $rows[0];
                    $token = rand(10000, 99999).rand(10000, 99999);
                    if (!$globals->isMobile()) {
                        $link = $this->generateURL('pass_lost_confirm', Array('token' => $token), true);
                    } else {
                        $link = $this->generateURL('pass_lost_confirm_m', Array('token' => $token), true);
                    }
                    $user->setPassChangeToken($token);
                    $em = $this->getDoctrine()->getManager();                
                    $em->persist($user);
                    $em->flush();
                    $message = 'Здравствуйте! Поступил запрос на смену пароля. Для продолжения пройдите по ссылке:'."\r\n";
                    $message .= '{link}'."\r\n"."\r\n";
                    $message .= 'Если вы получили письмо по ошибке, просто удалите его. Отвечать на письмо не нужно - оно сгенерировано почтовым роботом.'."\r\n"."\r\n";
                    $message .= 'С уважением. Администрация сайта "{sitename}".';
                    $message = $globals->getLangVar('pass_lost', 'confirm_mail_body', $message, 'html');
                    $message = str_replace(Array('{link}', '{sitename}'), Array($link, $sitename), $message);
                    $title = 'Запрос на смену пароля на сайте "{sitename}"!';                 
                    $title = $globals->getLangVar('pass_lost', 'confirm_mail_title', $title, 'html');
                    $title = str_replace(Array('{sitename}'), Array($sitename), $title);
                    $globals->mail($user->getEmail(), $title, $message);
                    $this->message('На указанный e-mail отправлено письмо с описанием дальнейших действий.', 'ok');
                } else {
                    $this->message('Пользователь с таким e-mail не зарегистрирован на сайте.', 'warning');
                }
            }             
        }
         
        if (!$globals->isMobile()) {
            $action = $this->generateURL('pass_lost');
        } else {
            $action = $this->generateURL('pass_lost_m');
        }
        
        return Array(
            'is_mobile' => $is_mobile,
            'action' => $action,
            'form' => $form->createView(),
        );            
    }
    
    /**
     * @Route("/pass_lost_confirm/{token}")
     * @Template("NeagMainBundle:User:pass_lost_confirm.html.twig")
     */
    public function passLostConfirmAction($token)
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $templating = $this->get('templating');            
        
        $desktop_link = $this->generateURL('pass_lost_confirm', array_merge(Array('token' => $token), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('pass_lost_confirm_m', array_merge(Array('token' => $token), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link); 
        
        $request = $this->getRequest();        
        
        $sitename = $globals->getConfigVar('sitename', 'Sitename');
        
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('u'))
        ->from('NeagMainBundle:User', 'u')
        ->where('u.passChangeToken = :passChangeToken')
        ->setParameter('passChangeToken', $token)
        ->getQuery(); 
        $rows = $query->getResult();
        $is_error = false;
        if (!empty($rows)) {
            $user = $rows[0];
            $pass = rand(10000, 99999);
            $user->setPass(md5($pass));
            $user->setPassChangeToken(null);
            $em = $this->getDoctrine()->getManager();                
            $em->persist($user);
            $em->flush();
            $message = 'Здравствуйте! Ваш новый пароль: ';
            $message .= '{pass}'."\r\n"."\r\n";
            $message .= 'Изменить пароль вы можете в личных настройках на сайте.'."\r\n"."\r\n";
            $message .= 'С уважением. Администрация сайта "{sitename}".';
            $message = $globals->getLangVar('pass_lost', 'confirm_mail_pass_body', $message, 'html');
            $message = str_replace(Array('{pass}', '{sitename}'), Array($pass, $sitename), $message);
            $title = 'Ваш новый пароль на сайте "{sitename}"!';                 
            $title = $globals->getLangVar('pass_lost', 'confirm_mail_pass_title', $title, 'html');
            $title = str_replace(Array('{sitename}'), Array($sitename), $title);
            $globals->mail($user->getEmail(), $title, $message);
            $this->message('На ваш e-mail выслан новый пароль.', 'ok');
        } else {
            $is_error = true;
            $this->message('Неверный ключ, либо данная ссылка устарела.', 'error');
        }    
        
        return Array(
            'is_mobile' => $is_mobile
        );            
    }    
    
    /**
     * @Route("/user/login")
     * @Template("NeagMainBundle:User:login.html.twig")
     */
    public function loginAction()
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        if (!$globals->isMobile()) {
            $main_link = $this->generateURL('main');
        } else {
            $main_link = $this->generateURL('main_m');
        } 
        $redirect = !empty($_GET['redirect']) ? $_GET['redirect'] : $main_link;
        if (isset($_POST['name']) && isset($_POST['pass'])) {            
            $is_error = false;            
            if (empty($_POST['name'])) {
                $this->message('Не указано имя', 'warning');
                $is_error = true;
            }
            if (empty($_POST['pass'])) {
                $this->message('Не указан пароль', 'warning');
                $is_error = true;
            }
            if (!$is_error) {
                $query = $this->getDoctrine()->getManager()->createQueryBuilder()
                ->select(Array('u'))
                ->from('NeagMainBundle:User', 'u')
                ->where('u.name = :name')
                ->setParameter('name', $_POST['name'])
                ->andWhere('u.pass = :pass')
                ->setParameter('pass', md5($_POST['pass']))
                ->getQuery(); 
                $rows = $query->getResult();
                if (!empty($rows)) {
                    $user = $rows[0];
                    // Проверить, что подтверждена регистрация
                    $emailConfirmToken = $user->getEmailConfirmToken();
                    if (!empty($emailConfirmToken)) {
                        // Регистрация не подтверждена
                        $this->message('Вы не подтвердили регистрацию', 'warning');
                        $is_error = true;
                    }
                    if (!$is_error) {
                        //$this->message('Success', 'ok');
                        $session_id = rand(10000, 99999).rand(10000, 99999).rand(10000, 99999);
                        // Обновления времени истечения сессии
                        $time_expire = time() + 3600*24*30;
                        $time = time();                      
                        //$user->setSessionId($session_id);
                        $user->setTimeLogin(new \DateTime(date('Y-m-d H:i:s', $time)));
                        $user->setTimeVisit(new \DateTime(date('Y-m-d H:i:s', $time)));
                        $em = $this->getDoctrine()->getManager();                
                        $em->persist($user);
                        $em->flush();
                        $userSession = new UserSession;
                        $userSession->setUser($user);
                        $userSession->setSessionId($session_id);
                        $userSession->setTimeExpire(new \DateTime(date('Y-m-d H:i:s', $time_expire)));
                        $em = $this->getDoctrine()->getManager();                
                        $em->persist($userSession);
                        $em->flush();
                        // Сохранение сессонного идентификатора
                        $globals->setCookie('session_id', $session_id, $time_expire);
                    }
                } else {
                    $this->message('Неверное имя или пароль', 'warning');
                    $is_error = true;
                }
            }
        }
        return $this->redirect($redirect);                     
    }
    
    /**
     * @Route("/user/ulogin")
     * @Template("NeagMainBundle:User:ulogin.html.twig")
     */
    public function uloginAction($token)
    {
        $request = $this->getRequest();
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile(); 
        
        $buffer = file_get_contents('http://ulogin.ru/token.php?host='.$_SERVER['HTTP_HOST'].'&token='.$token."&callback=?");
        $pattern = '/'.preg_quote('{', '/').'(.*)'.preg_quote('}', '/').'/Uis';
        $matches = Array();
        preg_match_all($pattern, $buffer, $matches);
        $content = !empty($matches[1][0]) ? '{'.$matches[1][0].'}' : '';
        $data = json_decode($content, true);
        $is_logged_in = false;
        if (!empty($data)) {
            if ($data['network'] == 'vkontakte') {
                // vk
                $vk_id = $data['uid'];
                $name = $data['first_name'].' '.$data['last_name'];
                // Поиск пользователя
                $qb = $this->getDoctrine()->getManager()->createQueryBuilder()
                ->select('u')
                ->from('NeagMainBundle:User', 'u');
                $qb->andWhere('u.vkId = :vkId')
                ->setParameter('vkId', $vk_id);
                $rows = $qb->getQuery()->getResult();
                $user_blocked = false;
                if (!empty($rows[0])) {
                    //$this->trace('chp 4');
                    $user = $rows[0];
                    if ($user->getActive()) {
                        // Обновление параметров
                        $datetime = new \DateTime(date('Y-m-d H:i:s', time()));
                        $user->setName($name);
                        $user->setIp($request->getClientIp());
                        $user->setCookieId($globals->getCookieId()); 
                        $user->setTimeVisit($datetime);
                        $user->setTimeLogin($datetime);
                        $em = $this->getDoctrine()->getManager(); 
                        $em->persist($user);
                        $em->flush();                                
                    } else {
                        // Пользователь заблокирован
                        $this->message('Пользователь ВКонтакте "'.$name.'" заблокирован.', 'error');
                        $user_blocked = true;
                    }
                } else {
                    //$this->trace('chp 5');
                    $datetime = new \DateTime(date('Y-m-d H:i:s', time()));
                    // Регистрация нового пользователя
                    $user = new User;
                    $user->setName($name);
                    $user->setDescription('');
                    $user->setContacts('');
                    //$user->setEmail($email);
                    $user->setVkId($vk_id);
                    $user->setIp($request->getClientIp());
                    $user->setCookieId($globals->getCookieId());
                    $user->setTimeVisit($datetime);
                    $user->setTimeLogin($datetime);
                    $user->setTimeRegistration($datetime);
                    $user->setTimeEdit($datetime);
                    $user->setPremoderationComments(false);
                    $user->setBloggerDemandMessage('');
                    $user->setActive(true);
                    $em = $this->getDoctrine()->getManager(); 
                    $em->persist($user);
                    $em->flush();                            
                }
                if (!empty($user) && !$user_blocked) {
                    //$this->trace('chp 6');
                    // Генерация сессии
                    $session_id = $globals->generateUserSessionId();
                    $user_session = new UserSession;
                    $user_session->setUser($user);
                    $user_session->setTimeExpire(new \DateTime(date('Y-m-d H:i:s', time()+3600*24*30)));
                    $user_session->setSessionId($session_id);
                    $em = $this->getDoctrine()->getManager(); 
                    $em->persist($user_session);
                    $em->flush();
                    $globals->setCookie('session_id', $session_id, time()+3600*24*30);
                    //$this->isUserLoggedIn = true;
                    //$this->userInfo = $globals->buildUserInfo($user, $session_id);
                    // Удаление устаревших сессий для данного пользователя
                    $globals->removeUserExpiredSessions($user);
                    $is_logged_in = true;
                }                
            }
            if ($data['network'] == 'facebook') {
                // fb
                $fb_id = $data['uid'];
                $name = $data['first_name'].' '.$data['last_name'];
                // Поиск пользователя
                $qb = $this->getDoctrine()->getManager()->createQueryBuilder()
                ->select('u')
                ->from('NeagMainBundle:User', 'u');
                $qb->andWhere('u.fbId = :fbId')
                ->setParameter('fbId', $fb_id);
                $rows = $qb->getQuery()->getResult();
                $user_blocked = false;
                if (!empty($rows[0])) {
                    //$this->trace('chp 4');
                    $user = $rows[0];
                    if ($user->getActive()) {
                        // Обновление параметров
                        $datetime = new \DateTime(date('Y-m-d H:i:s', time()));
                        $user->setName($name);
                        $user->setIp($request->getClientIp());
                        $user->setCookieId($globals->getCookieId()); 
                        $user->setTimeVisit($datetime);
                        $user->setTimeLogin($datetime);
                        $em = $this->getDoctrine()->getManager(); 
                        $em->persist($user);
                        $em->flush();                                
                    } else {
                        // Пользователь заблокирован
                        $this->message('Пользователь Facebook "'.$name.'" заблокирован.', 'error');
                        $user_blocked = true;
                    }
                } else {
                    //$this->trace('chp 5');
                    $datetime = new \DateTime(date('Y-m-d H:i:s', time()));
                    // Регистрация нового пользователя
                    $user = new User;
                    $user->setName($name);
                    $user->setDescription('');
                    $user->setContacts('');
                    //$user->setEmail($email);
                    $user->setFbId($fb_id);
                    $user->setIp($request->getClientIp());
                    $user->setCookieId($globals->getCookieId());
                    $user->setTimeVisit($datetime);
                    $user->setTimeLogin($datetime);
                    $user->setTimeRegistration($datetime);
                    $user->setTimeEdit($datetime);
                    $user->setPremoderationComments(false);
                    $user->setBloggerDemandMessage('');
                    $user->setActive(true);
                    $em = $this->getDoctrine()->getManager(); 
                    $em->persist($user);
                    $em->flush();                            
                }
                if (!empty($user) && !$user_blocked) {
                    //$this->trace('chp 6');
                    // Генерация сессии
                    $session_id = $globals->generateUserSessionId();
                    $user_session = new UserSession;
                    $user_session->setUser($user);
                    $user_session->setTimeExpire(new \DateTime(date('Y-m-d H:i:s', time()+3600*24*30)));
                    $user_session->setSessionId($session_id);
                    $em = $this->getDoctrine()->getManager(); 
                    $em->persist($user_session);
                    $em->flush();
                    $globals->setCookie('session_id', $session_id, time()+3600*24*30);
                    //$this->isUserLoggedIn = true;
                    //$this->userInfo = $globals->buildUserInfo($user, $session_id);
                    // Удаление устаревших сессий для данного пользователя
                    $globals->removeUserExpiredSessions($user);
                    $is_logged_in = true;
                }                
            }
        } else {
            //$this->message('content: '.$content, 'error');
            //$this->message(print_r($data, true), 'error');
            $this->message('Ошибка авторизации.', 'error');
        }
        // Редирект
        $redirect = null;
        if (!empty($_GET['redirect'])) {
            $redirect = $_GET['redirect'];
        } else {
            if ($is_logged_in) {
                if (!$is_mobile) {
                    $redirect = $this->generateURL('user_profile');
                } else {
                    $redirect = $this->generateURL('user_profile_m');
                }
            } else {
               if (!$is_mobile) {
                    $redirect = $this->generateURL('main');
                } else {
                    $redirect = $this->generateURL('main_m');
                } 
            }
        }
        return $this->redirect($redirect);
    }    
    
    /**
     * @Route("/user/logout")
     * @Template("NeagMainBundle:User:logout.html.twig")
     */
    public function logoutAction()
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $globals->setCookie('session_id', '');
        $session_id = !empty($_COOKIE['session_id']) ? $_COOKIE['session_id'] : '';        
        if (!empty($session_id)) {
            // Удаление сессии из БД
            $query = $this->getDoctrine()->getManager()->createQueryBuilder()
            ->select(Array('us'))
            ->from('NeagMainBundle:UserSession', 'us')
            ->where('us.sessionId = :sessionId')
            ->setParameter('sessionId', $session_id)
            ->getQuery(); 
            $rows = $query->getResult();
            if (!empty($rows)) {
                $em = $this->getDoctrine()->getManager();                
                $em->remove($rows[0]);
                $em->flush();    
            }    
        }
        if (!$globals->isMobile()) {
            $main_link = $this->generateURL('main');
        } else {
            $main_link = $this->generateURL('main_m');
        } 
        $regirect = !empty($_GET['redirect']) ? $_GET['redirect'] : $main_link;
        return $this->redirect($regirect);
    }
    
    /**
     * @Route("/users")
     * @Template("NeagMainBundle:User:list.html.twig")
     */
    public function listAction()
    {
        $request = $this->getRequest();         
        
        $globals = $this->get('globals');        
        $is_mobile = $globals->isMobile();
        
        $desktop_link = $this->generateURL('user_list', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('user_list_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link); 
        
        // Pager
        $pager = $this->get('punk_ave.pager_factory')->createPager("DoctrineORM");        
        $pager->bindRequest($request);
        $currentPage = ($request->query->has('page'))? $request->query->get('page') : 1;
        $pager->setCurrentPage($currentPage);
        $pager->setMaxPerPage(100);
        $pager->setRoute($this->getRequest()->get('_route'), $request->query->all());
        // Query
        $qb = $this->getDoctrine()->getManager()->createQueryBuilder();
        $qb->select(Array('u'));
        $qb->from('NeagMainBundle:User', 'u');    
        $qb->andWhere('u.active = :active')
        ->setParameter('active', true)
        ->orderBy('u.name', 'ASC');
        //$query = $qb->getQuery();
        //$rows = $query->getResult();
        // bind
        $pager->setQueryBuilder($qb);
        // execute
        $query = $qb->getQuery();
        //$rows = $query->getResult();
        $rows = $pager->getResults();
        $data = Array(); 
        foreach ($rows as $i => $row) {            
            $user_info = $globals->buildUserInfo($row);            
            $user_info['display'] = $globals->formatUserName($row->getName(), $row);
            $data[] = $user_info;                         
        }
        //$this->trace($data);        
        
        $pager_html = $this->renderPager($pager); 
        
        return Array(
            'is_mobile' => $is_mobile,
            'data' => $data, 
            'pager' => $pager_html
        );         
    }    
    
    /**
     */
    public function getProfileForm($user, $registration = true)
    {
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $user_info = $globals->buildUserInfo($user);
        
        $fb = $this->createFormBuilder($user);
        if ($registration) {
            $email_help = '';
            //$email_help = 'Если вы раньше регистрировались, но не получили письма подтверждения регистрации, вы можете сделать запрос на повторную отправку e-mail.';
            $fb->add(
                'name', 'text', Array(
                    'label' => 'Имя пользователя',
                    'help' => 'Ваш ник на сайте',
                )
            );
            $fb->add(
                'email', 'text', Array(
                    'label' => 'Ваш e-mail',
                    'help' => $email_help,
                )
            );
            if ($registration) {
                $fb->add(
                    'email2', 'text', Array(
                        'label' => 'E-mail ещё раз',
                        'mapped' => false
                    )
                );
            }
            $fb->add(
                'pass', 'password', Array(
                    'label' => 'Пароль',
                    'help' => 'Должен состоять минимум из 5 символов.',
                    'mapped' => false,
                )
            )
            ->add(
                'pass2', 'password', Array(
                    'label' => 'Пароль ещё раз',
                    'mapped' => false,
                )
            );             
        } else {
            /*
            $fb->add(
                'email', 'text', Array(
                    'label' => 'Ваш e-mail',
                )
            );
            */
        }
        $fb->add(
            'description', 'textarea', Array(
                'label' => 'О себе',
                'required' => false,
            )
        );
        $fb->add(
            'contacts', 'textarea', Array(
                'label' => 'Дополнительные контакты',
                'help' => 'ICQ, Skype, URL сайта и т. д.',
                'required' => false,
            )
        );
        $fb->add(
            'mailAllow', 'choice', Array(
                'label' => 'Письма от пользователей',
                'help' => 'Разрешить другим пользоватялем отправлять мне письма через сайт',
                'choices' => array(1 => 'Да', 0 => 'Нет'),
                //'data' => $data,
            )
        ); 
        if (!$registration) {
            if (!($user_info['is_vk'] || $user_info['is_fb'])) {
                $fb->add(
                    'pass', 'password', Array(
                        'label' => 'Пароль',
                        'help' => 'Чтобы изменения вступили в силу, пожалуйста, введите ваш текущий пароль.',
                        'mapped' => false,
                    )
                );
            }
        }
        $this->securityAlterForm($fb);
        $form = $fb->getForm();
        return $form;
    }
    
    /**
     * @Route("/fb_login", name="fb_login")
     * @Template("NeagMainBundle:User:fb_login.html.twig")
     */
    public function fbLoginAction()    
    {
        $globals = $this->get('globals');
        $request = $this->get('request');
        $redirect = $request->get('redirect');
        $facebook = $globals->getFacebook();        
        $helper = $facebook->getRedirectLoginHelper();
        $permissions = Array('email'); // Optional permissions
        $loginUrl = $helper->getLoginUrl($redirect, $permissions);
        /*
        $params = array(
            //'scope' => 'read_stream, friends_likes',
            'scope' => 'read_stream',
            //'redirect_uri' => $globals->generateCurrentUrl(),
            'redirect_uri' => $redirect,
        );
        //$this->message(get_class($facebook)); 
        $loginUrl = $facebook->getLoginUrl($params);         
        */
        //$this->message($loginUrl);
        //$this->message($params['redirect_uri']);
        //$this->message($loginUrl);
        return $this->redirect($loginUrl);
        //return new Response('fb redirect');
    }
    
    /**
     * @Route("/fb_logout", name="fb_logout")
     * @Template("NeagMainBundle:User:fb_logout.html.twig")
     */
    public function fbLogoutAction()    
    {
        $globals = $this->get('globals');
        $request = $this->get('request');
        $redirect = $request->get('redirect');
        $session = $globals->getSession();
        $session->set('fb', null); 
        return $this->redirect($redirect);
    }
    
    /**
     * @Route("/vk_logout", name="vk_logout")
     */
    public function vkLogoutAction()    
    {
        $globals = $this->get('globals');
        $request = $this->get('request');
        $redirect = $request->get('redirect');
        $session = $globals->getSession();
        $session->set('vk', null); 
        return $this->redirect($redirect);
    }
    
    /**
     * Наполняет массив списка разделов для селекта
     */
    public function getCategoryChoices()
    {
        $repository = $this->getDoctrine()
        ->getRepository('NeagMainBundle:Category');
        $query = $repository->createQueryBuilder('c')
        ->orderBy('c.orderId', 'ASC')
        ->getQuery();
        $rows = $query->getResult();
        $data = Array();  
        foreach ($rows as $row) { 
            $data[$row->getId()] = $row->getTitle();
        }
        return $data;       
    }
    
    /**
     * Наполняет массив списка персоналий для селекта
     */
    public function getPersonChoices()
    {
        $repository = $this->getDoctrine()
        ->getRepository('NeagMainBundle:Person');
        $query = $repository->createQueryBuilder('p')
        ->orderBy('p.weight', 'ASC')
        ->getQuery();
        $rows = $query->getResult();
        $data = Array();  
        foreach ($rows as $row) { 
            $data[$row->getId()] = $row;
        }
        return $data;       
    }
    
    /**
     * Наполняет массив списка тегов для селекта
     */
    public function getTagChoices()
    {       
        $query = $this->getDoctrine()->getManager()->createQueryBuilder()
        ->select(Array('t', 'ts'))
        ->from('NeagMainBundle:TagSynonym', 'ts')
        ->leftJoin('ts.tag', 't')
        ->where('ts.main = :main')
        ->setParameter('main', true)
        ->orderBy('ts.title', 'ASC')
        ->getQuery(); 
        $rows = $query->getResult();
        $data = Array();  
        foreach ($rows as $row) {
            $tag = $row->getTag();
            $data[$tag->getId()] = $row->getTitle();
        }
        return $data;       
    }
    
    /**
     * Очищает кеш блогов
     */
    public function clearBlogCache()
    {
        $cm = $this->cacheManager();
        $cm->clear('block_bloggers');
        $cm->clear('main_bloggers');
        $cm->clear('block_bloggers_m');
        $cm->clear('main_bloggers_m');
    } 

}
