<?php

/**
 * @copyright (C) 2013 iJoomla, Inc. - All rights reserved.
 * @license GNU General Public License, version 2 (http://www.gnu.org/licenses/gpl-2.0.html)
 * @author iJoomla.com <webmaster@ijoomla.com>
 * @url https://www.jomsocial.com/license-agreement
 * The PHP code portions are distributed under the GPL license. If not otherwise stated, all images, manuals, cascading style sheets, and included JavaScript *are NOT GPL, and are released under the IJOOMLA Proprietary Use License v1.0
 * More info at https://www.jomsocial.com/license-agreement
 */

use Joomla\CMS\Factory;
use Joomla\CMS\Filter\OutputFilter;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Uri\Uri;

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();

jimport('joomla.application.component.view');

if (!class_exists("CommunityViewGroups")) {

    class CommunityViewGroups extends CommunityView {

        public function _addGroupInPathway($groupId) {
            $group = Table::getInstance('Group', 'CTable');
            $group->load($groupId);

            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS'), CRoute::_('index.php?option=com_community&view=groups'));
            $this->addPathway($group->name, CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id));
        }

        public function sendmail() {
            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_SEND_EMAIL_TO_GROUP_MEMBERS'));

            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;

            $id = $jinput->getInt('groupid', 0);

            $group = Table::getInstance('Group', 'CTable');
            $group->load($id);
            $group->updateStats(); //ensure that stats are up-to-date
            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }

            if ($id == 0) {
                CSystemHelper::showErrorPage();
                return;
            }

            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS'), CRoute::_('index.php?option=com_community&view=groups'));
            $this->addPathway($group->name, CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id));
            $this->addPathway(Text::_('COM_COMMUNITY_SEND_EMAIL_TO_GROUP_MEMBERS'));

            if (!$this->accessAllowed('registered')) {
                return;
            }

            // Display the submenu
            $this->showSubmenu();

            $my = CFactory::getUser();
            $config = CFactory::getConfig();

            $editor = new CEditor($config->get('htmleditor'));

            if (!$group->isAdmin($my->id) && !COwnerHelper::isCommunityAdmin()) {
                $this->noAccess();
                return;
            }

            $message = $jinput->post->get('message', '', 'RAW');
            $title = $jinput->get('title', '', 'STRING');

            $tmpl = new CTemplate();
            echo $tmpl->set('editor', $editor)
                    ->set('group', $group)
                    ->set('message', $message)
                    ->set('title', $title)
                    ->fetch('groups.sendmail');
        }

        public function _addSubmenu() {
            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;

            $task = $jinput->get('task', '');
            $config = CFactory::getConfig();
            $groupid = $jinput->get('groupid', '');
            $categoryid = $jinput->get('categoryid', '');
            $my = CFactory::getUser();


            $backLink = array('sendmail', 'invitefriends', 'viewmembers', 'viewdiscussion', 'viewdiscussions', 'editdiscussion', 'viewbulletins', 'adddiscussion', 'addnews', 'viewbulletin', 'uploadavatar', 'edit', 'banlist');
            $excludeBannedMembers = array('banlist', 'viewbulletin', 'viewdiscussion', 'addnews', 'edit', 'editdiscussion');

            $groupsModel = CFactory::getModel('groups');
            $isAdmin = $groupsModel->isAdmin($my->id, $groupid);
            $isSuperAdmin = COwnerHelper::isCommunityAdmin();

            // Load the group table.
            $group = Table::getInstance('Group', 'CTable');
            $group->load($groupid);
            $isBanned = $group->isBanned($my->id);

            if (in_array($task, $backLink)) {
                //$this->addSubmenuItem('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $groupid, Text::_('COM_COMMUNITY_GROUPS_BACK_TO_GROUP'));
                if ($task == 'viewdiscussion' && !$isBanned)
                    $this->addSubmenuItem('index.php?option=com_community&view=groups&task=viewdiscussions&groupid=' . $groupid, Text::_('COM_COMMUNITY_GROUPS_VIEW_ALL_DISCUSSIONS'));

               // $this->addSubmenuItem('index.php?option=com_community&view=groups&task=viewmembers&groupid=' . $groupid, Text::_('COM_COMMUNITY_GROUPS_ALL_MEMBERS'));

                if ($task == 'viewdiscussions' && !$isBanned)
                    $this->addSubmenuItem('index.php?option=com_community&view=groups&groupid=' . $groupid . '&task=adddiscussion', Text::_('COM_COMMUNITY_GROUPS_DISCUSSION_CREATE'), '', SUBMENU_RIGHT);
                if ($task == 'viewbulletins' && ($isAdmin || $isSuperAdmin))
                    $this->addSubmenuItem('index.php?option=com_community&view=groups&groupid=' . $groupid . '&task=addnews', Text::_('COM_COMMUNITY_GROUPS_BULLETIN_CREATE'), '', SUBMENU_RIGHT);
                if ($task == 'viewmembers' && !$isBanned) {

                    $friends = $groupsModel->getInviteFriendsList($my->id, $groupid);
                    $userIds = '';
                    $i = 0;
                    
                    if ($friends) {
                        foreach ($friends as $friend) {
                            if ($i > 0) {
                                $userIds .= ',';
                            }

                            if ($friend instanceof CUser) {
                                $userIds .= $friend->id;
                            } else {
                                $userIds .= $friend;
                            }

                            $i++;
                        }
                    }
                    
                    $this->addSubmenuItem('index.php?option=com_community&view=groups', Text::_('COM_COMMUNITY_GROUPS_ALL_GROUPS'));

                    if (COwnerHelper::isRegisteredUser()) {
                        $this->addSubmenuItem('index.php?option=com_community&view=groups&task=mygroups&userid=' . $my->id, Text::_('COM_COMMUNITY_GROUPS_MY_GROUPS'));
                        $this->addSubmenuItem('index.php?option=com_community&view=groups&task=mygroupupdate&userid=' . $my->id, Text::_('COM_COMMUNITY_GROUPS_MY_GROUPS_UPDATE'));
                        $this->addSubmenuItem('index.php?option=com_community&view=groups&task=myinvites&userid=' . $my->id, Text::_('COM_COMMUNITY_GROUPS_PENDING_INVITES'));
                    }

                   // $this->addSubmenuItem('index.php?option=com_community&view=groups&task=invitefriends&groupid=' . $groupid, Text::_('COM_COMMUNITY_TAB_INVITE'), 'joms.invitation.showForm(\'' . $userIds . '\', \'groups,inviteUsers\',' . $group->id . ',1,1);', SUBMENU_RIGHT);
                }

                if ( ($isAdmin || $isSuperAdmin) && !in_array($task, $excludeBannedMembers)){
                    #$this->addSubmenuItem('index.php?option=com_community&view=groups&task=banlist&list=' . COMMUNITY_GROUP_BANNED . '&groupid=' . $groupid, Text::_('COM_COMMUNITY_GROUPS_BANNED_MEMBERS'));
                }
            } else {
                $this->addSubmenuItem('index.php?option=com_community&view=groups', Text::_('COM_COMMUNITY_GROUPS_ALL_GROUPS'));

                if (COwnerHelper::isRegisteredUser()) {
                    $this->addSubmenuItem('index.php?option=com_community&view=groups&task=mygroups&userid=' . $my->id, Text::_('COM_COMMUNITY_GROUPS_MY_GROUPS'));
                    $this->addSubmenuItem('index.php?option=com_community&view=groups&task=mygroupupdate&userid=' . $my->id, Text::_('COM_COMMUNITY_GROUPS_MY_GROUPS_UPDATE'));
                    $this->addSubmenuItem('index.php?option=com_community&view=groups&task=myinvites&userid=' . $my->id, Text::_('COM_COMMUNITY_GROUPS_PENDING_INVITES'));
                }

                if ($config->get('creategroups') && ( $isSuperAdmin || (COwnerHelper::isRegisteredUser() && $my->canCreateGroups() ) )) {
                    $creationLink = $categoryid ? 'index.php?option=com_community&view=groups&task=create&categoryid=' . $categoryid : 'index.php?option=com_community&view=groups&task=create';
                    //$this->addSubmenuItem($creationLink, Text::_('COM_COMMUNITY_GROUPS_CREATE'), '', SUBMENU_RIGHT);
                }

                if ((!$config->get('enableguestsearchgroups') && COwnerHelper::isRegisteredUser() ) || $config->get('enableguestsearchgroups')) {
                    $tmpl = new CTemplate();
                    $html = $tmpl->set('url', CRoute::_('index.php?option=com_community&view=groups&task=search'))
                            ->fetch('groups.search.submenu');
                    //$this->addSubmenuItem('index.php?option=com_community&view=groups&task=search', Text::_('COM_COMMUNITY_GROUPS_SEARCH'), 'joms.groups.toggleSearchSubmenu(this)', false, $html);
                }
            }
        }
        public function singleActivity($activity)
        {
            // we will determine all the user settings based on the activity viewed
            $my = CFactory::getUser();
            $userId = $activity->actor;

            if($activity->id == 0 || empty($activity->id)){
                //redirect this to error : no activity found
                Factory::getApplication()->enqueueMessage(Text::_('COM_COMMUNITY_ERROR_ACTIVITY_NOT_FOUND'), 'warning');
            }

            echo CMiniHeader::showGroupMiniHeader($activity->groupid);

            $document = Factory::getDocument();
            $document->setTitle(HTMLHelper::_('string.truncate', $activity->title, 75));

            CHeadHelper::setDescription(HTMLHelper::_('string.truncate', $activity->title, 300, true));
            //see if the user has blocked each other
            $getBlockStatus = new blockUser();
            $blocked = $getBlockStatus->isUserBlocked($userId, 'profile');
            if ($blocked && !COwnerHelper::isCommunityAdmin()) {
                Factory::getApplication()->enqueueMessage(Text::_('COM_COMMUNITY_ERROR_ACTIVITY_NOT_FOUND'), 'warning');
            }

            //everything is fine, lets get to the activity
            echo $this->_getNewsfeedHTML();
        }

        private function _getNewsfeedHTML() {
            $my = CFactory::getUser();
            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;

            $userId = $jinput->get('userid', $my->id, 'INT');

            return CActivities::getActivitiesByFilter('active-profile', $userId, 'profile', true, array('show_featured'=>true));
        }

        public function showSubmenu($display=true) {
            $this->_addSubmenu();
            return parent::showSubmenu($display);
        }

        /**
         * Display invite form
         * */
        public function invitefriends() {
            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_INVITE_FRIENDS_TO_GROUP_TITLE'));
            $jinput = Factory::getApplication()->input;
            if (!$this->accessAllowed('registered')) {
                return;
            }

            $this->showSubmenu();

            $my = CFactory::getUser();
            $groupId = $jinput->getInt('groupid');
            $this->_addGroupInPathway($groupId);
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_INVITE_FRIENDS_TO_GROUP_TITLE'));

            $friendsModel = CFactory::getModel('Friends');
            $groupsModel = CFactory::getModel('Groups');

            $tmpFriends = $friendsModel->getFriends($my->id, 'name', false);

            $friends = array();

            for ($i = 0; $i < count($tmpFriends); $i++) {
                $friend = $tmpFriends[$i];
                $groupInvite = Table::getInstance('GroupInvite', 'CTable');
                $keys = array('groupId' => $groupId, 'userId' => $friend->id);
                $groupInvite->load($keys);

                if (!$groupsModel->isMember($friend->id, $groupId) && !$groupInvite->exists()) {
                    $friends[] = $friend;
                }
            }
            unset($tmpFriends);

            $group = Table::getInstance('Group', 'CTable');
            $group->load($groupId);

            $tmpl = new CTemplate();
            echo $tmpl->set('friends', $friends)
                    ->set('group', $group)
                    ->fetch('groups.invitefriends');
        }

        /**
         * Edit a group
         */
        public function edit() {
            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_EDIT_TITLE'));

            $config = CFactory::getConfig();
            $jConfig = Factory::getConfig();

            $mainframe = Factory::getApplication();

            $this->showSubmenu();
            $jinput = Factory::getApplication()->input;
            // $js = 'assets/validate-1.5.min.js';
            // CFactory::attach($js, 'js');

            $groupId = $jinput->request->getInt('groupid');
            $groupModel = CFactory::getModel('Groups');
            $categories = $groupModel->getCategories();
            $group = Table::getInstance('Group', 'CTable');
            $group->load($groupId);

            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }

            $this->_addGroupInPathway($group->id);
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_EDIT_TITLE'));

            $app = CAppPlugins::getInstance();
            $appFields = $app->triggerEvent('onFormDisplay', array('jsform-groups-forms'));
            $beforeFormDisplay = CFormElement::renderElements($appFields, 'before');
            $afterFormDisplay = CFormElement::renderElements($appFields, 'after');

            // Load category tree
            $cTree = CCategoryHelper::getCategories($categories);
            $lists['categoryid'] = CCategoryHelper::getSelectList('groups', $cTree, $group->categoryid, true);

            $editorType = ($config->get('allowhtml') ) ? $config->get('htmleditor', 'none') : 'none';
            $editor = new CEditor($editorType);

            $params = $group->getParams();
            $photopermission = ($params->get('photopermission') == GROUP_PHOTO_PERMISSION_ADMINS || $params->get('photopermission') == GROUP_PHOTO_PERMISSION_ALL ) ? 1 : 0;
            $videopermission = ($params->get('videopermission') == GROUP_VIDEO_PERMISSION_ADMINS || $params->get('videopermission') == GROUP_VIDEO_PERMISSION_ADMINS ) ? 1 : 0;
            $eventpermission = ($params->get('eventpermission') == GROUP_EVENT_PERMISSION_ADMINS || $params->get('eventpermission') == GROUP_EVENT_PERMISSION_ADMINS ) ? 1 : 0;

            $group->discussordering = 0;
            $group->grouprecentphotos = $jinput->post->getInt('grouprecentphotos', $params->get('grouprecentphotos', GROUP_PHOTO_RECENT_LIMIT));
            $group->grouprecentvideos = $jinput->post->getInt('grouprecentvideos', $params->get('grouprecentvideos', GROUP_VIDEO_RECENT_LIMIT));
            $group->grouprecentevents = $jinput->post->getInt('grouprecentevents', $params->get('grouprecentevents', GROUP_EVENT_RECENT_LIMIT));
            $group->photopermission = $jinput->post->getInt('photopermission-admin', $photopermission);
            $group->videopermission = $jinput->post->getInt('videopermission-admin', $videopermission);
            $group->eventpermission = $jinput->post->getInt('eventpermission-admin', $eventpermission);

            if ($mainframe->get('sef')) {
                $juriRoot = Uri::root(false);
                $juriPathOnly = Uri::root(true);
                $juriPathOnly = rtrim($juriPathOnly, '/');
                $groupURL = rtrim(str_replace($juriPathOnly, '', $juriRoot), '/');

                $groupURL .= CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id, false);

                if (!$group->alias) {
                    $alias = OutputFilter::stringURLSafe($group->name);
                } else {
                    $alias = OutputFilter::stringURLSafe($group->alias);
                }

                $inputHTML = '<input id="alias" name="alias" type="text" class="joms-input" value="' . $alias . '" />';
                $prefixURL = str_replace($alias, $inputHTML, $groupURL);

                if ($prefixURL == $groupURL) {
                    $prefixURL = CString::str_ireplace($alias, $inputHTML, $groupURL);
                }
            }

            $tmpl = new CTemplate();
            echo $tmpl->set('beforeFormDisplay', $beforeFormDisplay)
                    ->set('afterFormDisplay', $afterFormDisplay)
                    ->set('config', $config)
                    ->set('jConfig', $jConfig)
                    ->set('prefixURL', $prefixURL)
                    ->set('lists', $lists)
                    ->set('categories', $categories)
                    ->set('group', $group)
                    ->set('params', $group->getParams())
                    ->set('isNew', false)
                    ->set('editor', $editor)
                    ->fetch('groups.forms');
        }

        /**
         * Method to display group creation form
         * */
        public function create($data) {

            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_CREATE_NEW_GROUP'));

            $config = CFactory::getConfig();
            $jConfig = Factory::getConfig();

            // $js = 'assets/validate-1.5.min.js';
            // CFactory::attach($js, 'js');

            $my = CFactory::getUser();
            $model = CFactory::getModel('groups');
            $totalGroup = $model->getGroupsCreationCount($my->id);

            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;

            if (!$my->authorise('community.create', 'groups')) {
                Factory::getApplication()->enqueueMessage(Text::_('COM_COMMUNITY_GROUPS_DISABLE_CREATE_MESSAGE'),'');
                return;
            }

            //initialize default value
            $group = Table::getInstance('Group', 'CTable');
            $group->approvals = $jinput->get('approvals', '', 'INT');
            $group->unlisted = $jinput->get('unlisted', '', 'INT');
            $group->name = $jinput->post->get('name', '', 'STRING');
            $group->summary = $jinput->post->get('summary', '', 'STRING');
            $group->description = $jinput->post->get('description', '', 'RAW');
            $group->email = $jinput->post->get('email', '', 'STRING');
            $group->website = $jinput->post->get('website', '', 'STRING');
            $group->categoryid = $jinput->get('categoryid', '', 'INT');

            $params = $group->getParams();

            $photopermission = ($params->get('photopermission') == GROUP_PHOTO_PERMISSION_ADMINS || $params->get('photopermission') == GROUP_PHOTO_PERMISSION_ALL || $params->get('photopermission') == '') ? 1 : 0;
            $videopermission = ($params->get('videopermission') == GROUP_VIDEO_PERMISSION_ADMINS || $params->get('videopermission') == GROUP_VIDEO_PERMISSION_ADMINS || $params->get('videopermission') == '') ? 1 : 0;
            $eventpermission = ($params->get('eventpermission') == GROUP_EVENT_PERMISSION_ADMINS || $params->get('eventpermission') == GROUP_EVENT_PERMISSION_ADMINS || $params->get('eventpermission') == '') ? 1 : 0;

            $group->discussordering = 0;
            $group->grouprecentphotos = $jinput->post->getInt('grouprecentphotos', $params->get('grouprecentphotos', GROUP_PHOTO_RECENT_LIMIT));
            $group->grouprecentvideos = $jinput->post->getInt('grouprecentvideos', $params->get('grouprecentvideos', GROUP_VIDEO_RECENT_LIMIT));
            $group->grouprecentevents = $jinput->post->getInt('grouprecentevents', $params->get('grouprecentevents', GROUP_EVENT_RECENT_LIMIT));
            $group->photopermission = $jinput->post->getInt('photopermission-admin', $photopermission);
            $group->videopermission = $jinput->post->getInt('videopermission-admin', $videopermission);
            $group->eventpermission = $jinput->post->getInt('eventpermission-admin', $eventpermission);

            $app = CAppPlugins::getInstance();
            $appFields = $app->triggerEvent('onFormDisplay', array('jsform-groups-form'));
            $beforeFormDisplay = CFormElement::renderElements($appFields, 'before');
            $afterFormDisplay = CFormElement::renderElements($appFields, 'after');

            // Load category tree

            $cTree = CCategoryHelper::getCategories($data->categories);

            $lists['categoryid'] = CCategoryHelper::getSelectList('groups', $cTree, $group->categoryid, true);

            $editorType = ($config->get('allowhtml') ) ? $config->get('htmleditor', 'none') : 'none';

            $editor = new CEditor($editorType);

            $tmpl = new CTemplate();
            $tmpl->set('beforeFormDisplay', $beforeFormDisplay)
                ->set('afterFormDisplay', $afterFormDisplay)
                ->set('config', $config)
                ->set('jConfig', $jConfig)
                ->set('lists', $lists)
                ->set('categories', $data->categories)
                ->set('group', $group)
                ->set('groupCreated', $totalGroup)
                ->set('groupCreationLimit', $config->get('groupcreatelimit'))
                ->set('params', $group->getParams())
                ->set('isNew', true)
                ->set('editor', $editor);

            if ($config->get('groupcreatelimit') != 0 && ($totalGroup / $config->get('groupcreatelimit') >= COMMUNITY_SHOW_LIMIT)) {
                echo $tmpl->fetch('groups.forms.limit');
            } else {
                echo $tmpl->fetch('groups.forms');
            }
        }

        /**
         * A group has just been created, should we just show the album ?
         */
        public function created() {
            $jinput = Factory::getApplication()->input;
            $groupid = $jinput->get('groupid', 0);
            $mainframe	= Factory::getApplication();
            $mainframe->redirect(CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $groupid, false));
            /*
            $group = Table::getInstance('Group', 'CTable');

            $group->load($groupid);

            CHeadHelper::setType('website', $group->name);

            $uri = JURI::base();
            $this->showSubmenu();

            $tmpl = new CTemplate();
            echo $tmpl
                    ->setMetaTags('group', $group)
                    ->set('link', CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $groupid))
                    ->set('linkBulletin', CRoute::_('index.php?option=com_community&view=groups&task=addnews&groupid=' . $groupid))
                    ->set('linkUpload', CRoute::_('index.php?option=com_community&view=groups&task=uploadavatar&groupid=' . $groupid))
                    ->set('linkEdit', CRoute::_('index.php?option=com_community&view=groups&task=edit&groupid=' . $groupid))
                    ->set('linkDiscussion', CRoute::_('index.php?option=com_community&view=groups&task=adddiscussion&groupid=' . $groupid))
                    ->fetch('groups.created');
            */
        }

        /**
         * Method to display output after saving group
         *
         * @param	Table	Group Table object
         * */
        public function save($group) {
            $mainframe = Factory::getApplication();

            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_AVATAR_UPLOAD'));

            // Load submenus
            $this->showSubmenu();

            if (!$group->id) {
                $this->addWarning('COM_COMMUNITY_GROUPS_SAVE_ERROR');
                return;
            }
            $mainframe->enqueueMessage(Text::sprintf('COM_COMMUNITY_GROUPS_NEW_MESSAGE', $group->name));

            $tmpl = new CTemplate();
            echo $tmpl->set('group', $group)
                    ->fetch('groups.save');
        }

        /**
         * Method to display listing of groups from the site
         * */
        public function display($data = NULL) {
            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;
            $document = Factory::getDocument();

            $avatarModel = CFactory::getModel('avatar');
            $wallsModel = CFactory::getModel('wall');

            // Get category id from the query string if there are any.
            $categoryId = $jinput->getInt('categoryid', 0);
            $category = Table::getInstance('GroupCategory', 'CTable');
            $category->load($categoryId);

            if ($categoryId != 0) {
                $this->addPathway(Text::_('COM_COMMUNITY_GROUPS'), CRoute::_('index.php?option=com_community&view=groups'));
                /**
                 * Opengraph
                 */
                CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_CATEGORIES') . ' : ' . str_replace('&amp;', '&', Text::_($this->escape($category->name))));
            } else {
                $this->addPathway(Text::_('COM_COMMUNITY_GROUPS'));
                /**
                 * Opengraph
                 */
                CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_BROWSE_TITLE'));
            }

            // If we are browing by category, add additional breadcrumb and add
            // category name in the page title
            /* begin: UNLIMITED LEVEL BREADCRUMBS PROCESSING */
            if ($category->parent == COMMUNITY_NO_PARENT) {
                $this->addPathway(Text::_($this->escape($category->name)), CRoute::_('index.php?option=com_community&view=groups&categoryid=' . $category->id));
            } else {
                // Parent Category
                $parentsInArray = array();
                $n = 0;
                $parentId = $category->id;

                $parent = Table::getInstance('GroupCategory', 'CTable');

                do {
                    $parent->load($parentId);
                    $parentId = $parent->parent;

                    $parentsInArray[$n]['id'] = $parent->id;
                    $parentsInArray[$n]['parent'] = $parent->parent;
                    $parentsInArray[$n]['name'] = Text::_($this->escape($parent->name));

                    $n++;
                } while ($parent->parent > COMMUNITY_NO_PARENT);

                for ($i = count($parentsInArray) - 1; $i >= 0; $i--) {
                    $this->addPathway($parentsInArray[$i]['name'], CRoute::_('index.php?option=com_community&view=groups&categoryid=' . $parentsInArray[$i]['id']));
                }
            }
            /* end: UNLIMITED LEVEL BREADCRUMBS PROCESSING */


            $config = CFactory::getConfig();
            $my = CFactory::getUser();
            $uri = Uri::base();
            $discussionModel = CFactory::getModel('discussions');

            $feedLink = CRoute::_('index.php?option=com_community&view=groups&format=feed');
            $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_TO_LATEST_GROUPS_FEED') . '"  href="' . $feedLink . '"/>';
            $document->addCustomTag($feed);

            $feedLink = CRoute::_('index.php?option=com_community&view=groups&task=viewlatestdiscussions&format=feed');
            $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_TO_LATEST_GROUP_DISCUSSIONS_FEED') . '" href="' . $feedLink . '"/>';
            $document->addCustomTag($feed);

            $data = new stdClass();
            $defaultSortOrder = $config->get('group_default_sort_order', 'latest');
            $sorted = $jinput->get->get('sort', $defaultSortOrder, 'STRING');
            $limitstart = $jinput->get('limitstart', 0, 'INT');
            //cache groups categories
            $data->categories = $this->_cachedCall('getGroupsCategories', array($category->id), '', array(COMMUNITY_CACHE_TAG_GROUPS_CAT));

            // cache groups list.
            $user = CFactory::getUser();
            $username = $user->get('username');
            $featured = (!is_null($username) ) ? true : false;

            $groupsData = $this->_cachedCall('getShowAllGroups', array($category->id, $sorted, $featured), COwnerHelper::isCommunityAdmin($my->id), array(COMMUNITY_CACHE_TAG_GROUPS));
            $groupsHTML = $groupsData['HTML'];

            $act = new CActivityStream();

            //Cache Group Featured List
            $featuredGroups = $this->_cachedCall('_getGroupsFeaturedList', array(), '', array(COMMUNITY_CACHE_TAG_FEATURED));
            $featuredHTML = $featuredGroups['HTML'];

            //no Featured Group headline slideshow on Category filtered page
            if (!empty($categoryId))
                $featuredHTML = '';

            $tmpl = new CTemplate($this);

            $sortItems = array(
                'latest' => Text::_('COM_COMMUNITY_GROUPS_SORT_LATEST'),
                'oldest' => Text::_('COM_COMMUNITY_GROUPS_SORT_OLDEST'),
                'alphabetical' => Text::_('COM_COMMUNITY_SORT_ALPHABETICAL'),
                'mostactive' => Text::_('COM_COMMUNITY_GROUPS_SORT_MOST_ACTIVE')
            );

            if($config->get('show_featured')){
                $sortItems['featured'] = Text::_('COM_COMMUNITY_GROUP_SORT_FEATURED');
            }

            echo $tmpl->set('featuredHTML', $featuredHTML)
                    ->set('index', true)
                    ->set('categories', $data->categories)
                    ->set('availableCategories', $this->getFullGroupsCategories())
                    ->set('groupsHTML', $groupsHTML)
                    ->set('config', $config)
                    ->set('category', $category)
                    ->set('categoryId', $categoryId)
                    ->set('isCommunityAdmin', COwnerHelper::isCommunityAdmin())
                    ->set('sortings', CFilterBar::getHTML(CRoute::getURI(), $sortItems, $defaultSortOrder))
                    ->set('sorted', $sorted)
                    ->set('my', $my)
                    ->set('discussionsHTML', $this->modPublicDiscussion($categoryId))
                    ->set('submenu', $this->showSubmenu(false))
                    ->fetch('groups/base');
        }

        /**
         * List All FEATURED GROUPS
         * @ since 2.6
         * */
        public function _getGroupsFeaturedList() {
            $featGroups = $this->getGroupsFeaturedList();
            $featuredHTML['HTML'] = $this->_getFeatHTML($featGroups);

            return $featuredHTML;
        }

        /**
         * 	Generate Featured Groups HTML
         *
         * 	@param		array	Array of events objects
         * 	@return		string	HTML
         * 	@since		2.6
         */
        private function _getFeatHTML($groups) {
            $my = CFactory::getUser();
            $config = CFactory::getConfig();
            $group = Table::getInstance('Group', 'CTable');

            $tmpl = new CTemplate();
            return $tmpl->set('groups', $groups)
                            ->set('showFeatured', $config->get('show_featured'))
                            ->set('isCommunityAdmin', COwnerHelper::isCommunityAdmin())
                            ->set('my', $my)
                            ->fetch('groups.featured');
        }

        /**
         * @since 2.6
         * mygroupupdates page
         *
         */
        public function myGroupUpdate() {
            $groupModel = CFactory::getModel('groups');

            $jinput = Factory::getApplication()->input;
            $userId = $jinput->get->get('userid', NULL, 'INT');

            $my = CFactory::getUser($userId);

            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_MY_GROUPS_UPDATE'));

            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS'), CRoute::_('index.php?option=com_community&view=groups'));
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_MY_GROUPS_UPDATE'), '');

            //get the groups of current user
            $userGroupArr = $groupModel->getGroupIds($my->id);

            $groupInfoArr = array(); //to store all the groups info that belongs to current user

            foreach ($userGroupArr as $userGrp) {
                $table = Table::getInstance('Group', 'CTable');
                $table->load($userGrp);


                $groupInfoArr[] = array('thumb' => $table->getThumbAvatar());
                //$groupInfoArr[]	= $table->getThumbAvatar();
            //
		}

            $tmpl = new CTemplate();
            echo $tmpl->set('userid', $my->id)
                    ->set('my', $my)
                    ->set('submenu', $this->showSubmenu(false))
                    ->fetch('groups.updates');
        }

        /**
         * @since 2.6
         * module for user participated discussion
         */
        public function modUserParticipatedDiscussion($userId, $limit = 10) {
            return $this->_getUserParticipatedDiscussionUpdates($userId, $limit);
        }

        public function modGetUserParticipatedDiscussion($userId, $limit = 10) {
            $groupsModel = CFactory::getModel('groups');
            $latestParticipatedDiscussion = $groupsModel->getGroupDiscussionLastActive($userId);

            return (array) $latestParticipatedDiscussion;
        }

        /**
         * @since 2.6
         * module for user participated discussion
         */
        private function _getUserParticipatedDiscussionUpdates($userId, $limit) {
            $groupsModel = CFactory::getModel('groups');
            $latestParticipatedDiscussion = $groupsModel->getGroupDiscussionLastActive($userId);

            $tmpl = new CTemplate();
            return $tmpl->set('discussions', $latestParticipatedDiscussion)
                            ->fetch('groups.discussion.updates');
        }

        /**
         * @since 2.6
         * module for user participated discussion
         */
        public function modUserAnnouncement($userId, $limit = 5) {
            return $this->_getUserGroupAnnouncementUpdates($userId, $limit);
        }

        public function modGetUserAnnouncement($userId, $limit = 5) {
            $groupsModel = CFactory::getModel('groups');
            $latestAnnouncement = $groupsModel->getGroupAnnouncementUpdate($userId, $limit);
            return $latestAnnouncement;
        }

        /**
         * @since 2.6
         * module for user participated discussion
         */
        private function _getUserGroupAnnouncementUpdates($userId, $limit) {
            $groupsModel = CFactory::getModel('groups');
            $latestAnnouncement = $groupsModel->getGroupAnnouncementUpdate($userId, $limit);

            $tmpl = new CTemplate();
            return $tmpl->set('announcements', $latestAnnouncement)
                            ->fetch('groups.announcement.updates');
        }

        /**
         * @since 2.6
         * module for user's participated group upcoming events
         */
        public function modUserGroupUpcomingEvents($userId, $limit = 5) {
            return $this->_getUserGroupUpcomingEvents($userId, $limit);
        }

        /**
         * @since 2.6
         * to get user's participated group upcoming events
         */
        private function _getUserGroupUpcomingEvents($userId, $limit) {
            $groupsModel = CFactory::getModel('groups');
            $latestEvents = $groupsModel->getGroupUpcomingEvents($userId, $limit);

            $tmpl = new CTemplate();
            return $tmpl->set('events', $latestEvents)
                            ->fetch('groups.events.updates');
        }

        /**
         * @since 2.6
         * module for user's participated group album updates
         */
        public function modUserAlbumsUpdate($userId, $limit = 5) {
            return $this->_getUserAlbumsUpdate($userId, $limit);
        }

        private function _getUserAlbumsUpdate($userId, $limit) {
            $groupsModel = CFactory::getModel('groups');
            $latestAlbumUpdate = $groupsModel->getGroupLatestAlbumUpdate($userId, $limit);

            $tmpl = new CTemplate();
            return $tmpl->set('albums', $latestAlbumUpdate)
                            ->fetch('groups.album.updates');
        }

        /**
         * @since 2.6
         * module for user's participated group videos updates
         */
        public function modUserGroupVideosUpdate($userId, $limit = 5) {
            return $this->_getUserGroupVideosUpdate($userId, $limit);
        }

        private function _getUserGroupVideosUpdate($userId, $limit) {
            $groupsModel = CFactory::getModel('groups');
            $groupVideos = $groupsModel->getGroupVideosUpdate($userId, $limit);

            $tmpl = new CTemplate();
            return $tmpl->set('videos', $groupVideos)
                            ->fetch('groups.videos.updates');
        }

        /**
         * @since 2.6
         * module for user's group
         */
        public function modUserGroups($userId, $limit = 12) {
            return $this->_getUserGroups($userId, $limit);
        }

        public function modGetUserGroups($userId, $limit = 5) {
            $groupsModel = CFactory::getModel('groups');
            $groupsId = $groupsModel->getGroupIds($userId, $limit);

            $groupsDetail = array();
            $count = 1;
            foreach ($groupsId as $group) {
                if ($count == $limit) {
                    break;
                }

                $count++;

                $table = Table::getInstance('Group', 'CTable');
                $table->load($group);
                $groupsDetail[] = array('group_url' => CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group), 'avatar' => $table->getThumbAvatar(), 'group_name' => $table->name);
            }

            $tmpl = new CTemplate();
            return $groupsDetail;
        }

        private function _getUserGroups($userId, $limit) {
            $groupsModel = CFactory::getModel('groups');
            $groupsId = $groupsModel->getGroupIds($userId);

            $groupsDetail = array();
            $count = 1;
            foreach ($groupsId as $group) {
                if ($count == $limit) {
                    break;
                }

                $count++;

                $table = Table::getInstance('Group', 'CTable');
                $table->load($group);
                $groupsDetail[] = array('group_url' => CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group), 'avatar' => $table->getThumbAvatar(), 'group_name' => $table->name);
            }

            $tmpl = new CTemplate();
            return $tmpl->set('usergroups', $groupsDetail)
                            ->fetch('groups.user.group');
        }

        public function modUserGroupPending($userid) {
            return $this->_getPendingListHTML($userid);
        }

        /**
         * showGroupsFeaturedList
         * */
        public function getGroupsFeaturedList() {
            $featured = new CFeatured(FEATURED_GROUPS);
            $featuredGroups = $featured->getItemIds();
            $featuredList = array();

            foreach ($featuredGroups as $group) {
                $table = Table::getInstance('Group', 'CTable');
                $table->load($group);
                $featuredList[] = $table;
            }
            return $featuredList;
        }

        /**
         * showGroupsCategory
         * */
        public function getGroupsCategories($category) {

            $model = CFactory::getModel('groups');
            $categories = $model->getCategoriesCount();

            $categories = CCategoryHelper::getParentCount($categories, $category);

            return $categories;
        }

        /**
         * showAllGroups
         * */
        public function getShowAllGroups($category, $sorted) {
            $model = CFactory::getModel('groups');

            // Get group in category and it's children.
            $categories = $model->getAllCategories();
            $categoryIds = CCategoryHelper::getCategoryChilds($categories, $category);
            if ((int) $category > 0) {
                $categoryIds[] = (int) $category;
            }

            // It is safe to pass 0 as the category id as the model itself checks for this value.
            $data = new StdClass;
            $data->groups = $model->getAllGroups($categoryIds, $sorted);

            // Get pagination object
            $data->pagination = $model->getPagination();

            // Get the template for the group lists
            $groupsHTML['HTML'] = $this->_getGroupsHTML($data->groups, $data->pagination);

            return $groupsHTML;
        }

        /**
         * Application full view
         * */
        public function discussAppFullView() {
            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_DISCUSSION_REPLY'));

            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;

            $applicationName = CStringHelper::strtolower($jinput->get->get('app', '', 'STRING'));

            if (empty($applicationName)) {
                Factory::getApplication()->enqueueMessage(Text::_('COM_COMMUNITY_APP_ID_REQUIRED'), 'warning');
            }

            $output = '';
            $topicId = $jinput->get('topicid', '', 'INT');

            $model = CFactory::getModel('discussions');
            $discussion = Table::getInstance('Discussion', 'CTable');
            $discussion->load($topicId);

            $group = Table::getInstance('Group', 'CTable');
            $group->load($discussion->groupid);

            $this->addSubmenuItem('index.php?option=com_community&view=groups&task=viewdiscussion&groupid=' . $discussion->groupid . '&topicid=' . $topicId, Text::_('COM_COMMUNITY_BACK_TO_TOPIC'));
           return parent::showSubmenu($display);

            //@todo: Since group walls doesn't use application yet, we process it manually now.
            if ($applicationName == 'walls') {
                $limit = $jinput->request->get('limit', 5, 'INT');
                $limitstart = $jinput->request->get('limitstart', 0, 'INT');

                $my = CFactory::getUser();
                $config = CFactory::getConfig();
                $isBanned = $group->isBanned($my->id);

                // Get the walls content
                $output .='<div id="wallContent">';
                $output .= CWallLibrary::getWallContents('discussions', $discussion->id, ($my->id == $discussion->creator), $limit, $limitstart, 'wall/content', 'groups,discussion');
                $output .= '</div>';

                if (!$config->get('lockgroupwalls') || ($config->get('lockgroupwalls') && $group->isMember($my->id) && !$isBanned ) || COwnerHelper::isCommunityAdmin()) {
                    $outputLock = '<div class="cAlert">' . Text::_('COM_COMMUNITY_DISCUSSION_LOCKED_NOTICE') . '</div>';
                    $outputUnLock = CWallLibrary::getWallInputForm($discussion->id, 'groups,ajaxSaveDiscussionWall', 'groups,ajaxRemoveWall');
                    $wallForm = $discussion->lock ? $outputLock : $outputUnLock;

                    $output .= $wallForm;
                }

                jimport('joomla.html.pagination');
                $wallModel = CFactory::getModel('wall');
                $pagination = new JPagination($wallModel->getCount($discussion->id, 'discussions'), $limitstart, $limit);

                $output .= '<div class="cPagination">' . $pagination->getPagesLinks() . '</div>';
            } else {
                $model = CFactory::getModel('apps');
                $applications = CAppPlugins::getInstance();
                $applicationId = $model->getUserApplicationId($applicationName);

                $application = $applications->get($applicationName, $applicationId);

                // Get the parameters
                $manifest = CPluginHelper::getPluginPath('community', $applicationName) . '/' . $applicationName . '/' . $applicationName . '.xml';

                $params = new CParameter($model->getUserAppParams($applicationId), $manifest);

                $application->params = $params;
                $application->id = $applicationId;

                $output = $application->onAppDisplay($params);
            }

            echo $output;
        }

        /**
         * Application full view
         * */
        public function appFullView() {
            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_WALL_TITLE'));

            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;

            $applicationName = CStringHelper::strtolower($jinput->get->get('app', '', 'STRING'));

            if (empty($applicationName)) {
                Factory::getApplication()->enqueueMessage(Text::_('COM_COMMUNITY_APP_ID_REQUIRED'), 'warning');
            }

            $output = '';

            $groupModel = CFactory::getModel('groups');
            $groupId = $jinput->getInt('groupid');
            $group = Table::getInstance('Group', 'CTable');
            $group->load($groupId);

            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }

            //@todo: Since group walls doesn't use application yet, we process it manually now.
            if ($applicationName == 'walls') {
                $limit = $jinput->request->getInt('limit', 5);
                $limitstart = $jinput->request->getInt('limitstart', 0);

                $my = CFactory::getUser();
                $config = CFactory::getConfig();

                $isBanned = $group->isBanned($my->id);
                // Test if the current browser is a member of the group
                $isMember = $group->isMember($my->id);
                $waitingApproval = $groupModel->isWaitingAuthorization($my->id, $group->id);

                if (!$isMember && !COwnerHelper::isCommunityAdmin() && $group->approvals == COMMUNITY_PRIVATE_GROUP) {
                    $this->noAccess(Text::_('COM_COMMUNITY_GROUPS_PRIVATE_NOTICE'));
                    return;
                }

                // Get the walls content
                $output .='<div id="wallContent">';
                if (!$isBanned) {
                    $output .= CWallLibrary::getWallContents('groups', $group->id, ($my->id == $group->ownerid), $limit, $limitstart, 'wall/content', 'groups,group');
                } else {
                    $output .= CWallLibrary::getWallContents('groups', $group->id, ($my->id == $group->ownerid), $limit, $limitstart, 'wall/content', 'groups,group', null, 1);
                }
                $output .= '</div>';

                if (!$config->get('lockgroupwalls') || ($config->get('lockgroupwalls') && ($isMember && !$isBanned) && !($waitingApproval) ) || COwnerHelper::isCommunityAdmin()) {
                    $output .= CWallLibrary::getWallInputForm($group->id, 'groups,ajaxSaveWall', 'groups,ajaxRemoveWall');
                }

                jimport('joomla.html.pagination');
                $wallModel = CFactory::getModel('wall');
                $pagination = new JPagination($wallModel->getCount($group->id, 'groups'), $limitstart, $limit);

                $output .= '<div class="cPagination">' . $pagination->getPagesLinks() . '</div>';
            } else {
                $model = CFactory::getModel('apps');
                $applications = CAppPlugins::getInstance();
                $applicationId = $model->getUserApplicationId($applicationName);

                $application = $applications->get($applicationName, $applicationId);

                if (!$application) {
                    Factory::getApplication()->enqueueMessage(Text::_('COM_COMMUNITY_APPS_NOT_FOUND'), 'warning');
                }

                // Get the parameters
                $manifest = CPluginHelper::getPluginPath('community', $applicationName) . '/' . $applicationName . '/' . $applicationName . '.xml';

                $params = new CParameter($model->getUserAppParams($applicationId), $manifest);

                $application->params = $params;
                $application->id = $applicationId;

                $output = $application->onAppDisplay($params);
            }

            echo $output;
        }

        public function _getUnapproved($members) {
            $return = array();
            foreach ($members as $member) {
                if ($member->approved == 0) {
                    $return[] = $member;
                }
            }
            return $return;
        }

        public function _getApproved($members) {
            $return = array();
            foreach ($members as $member) {
                if ($member->approved == 1) {
                    $return[] = $member;
                }
            }
            return $return;
        }

        public function _isBanned($members, $myId) {
            foreach ($members as $member) {
                if ($member->id == $myId && $member->permission == COMMUNITY_GROUP_BANNED) {
                    return true;
                }
            }
        }

        /**
         * Displays specific groups
         * */
        public function viewGroup($group) {
            CWindow::load();

            $config        = CFactory::getConfig();
            $document      = Factory::getDocument();
            $groupLib      = new CGroups();
            $mainframe     = Factory::getApplication();
            $jinput        = $mainframe->input;

            // Load appropriate models
            $groupModel    = CFactory::getModel('groups');
            $wallModel     = CFactory::getModel('wall');
            $userModel     = CFactory::getModel('user');
            $discussModel  = CFactory::getModel('discussions');
            $bulletinModel = CFactory::getModel('bulletins');
            $photosModel   = CFactory::getModel('photos');
            $activityModel = CFactory::getModel('activities');
            $fileModel     = CFactory::getModel('files');

            $editGroup     = $jinput->get->get('edit', FALSE, 'NONE');
            $editGroup     = ( $editGroup == 1 ) ? true : false;
            $params        = $group->getParams();

            /**
             * Opengraph
             * @todo Support group avatar og:image
             */
            CHeadHelper::setType('website', CStringHelper::escape($group->name), CStringHelper::escape(strip_tags($group->description)));
            $document->addCustomTag('<link rel="image_src" href="' . Uri::root(true) .'/'. $group->thumb . '" />');

            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }

            $group->hit();

            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS'), CRoute::_('index.php?option=com_community&view=groups'));
            $this->addPathway(Text::sprintf('COM_COMMUNITY_GROUPS_NAME_TITLE', $group->name), '');

            // Load the current browsers data
            $my = CFactory::getUser();

            // If user are invited
            $isInvited = $groupModel->isInvited($my->id, $group->id);

            // Get members list for display
            //$members	= $groupModel->getAllMember($group->id);
            //Set limit for member listing on view group page
            $limit = CFactory::getConfig()->get('group_sidebar_members_show_total',12);
            $approvedMembers = $groupModel->getMembers($group->id, $limit, true, false, true);
            CError::assert($approvedMembers, 'array', 'istype', __FILE__, __LINE__);

            // Is there any my friend is the member of this group?
            $join = '';
            $friendsCount = 0;
            if ($isInvited) {
                // Get the invitors
                $invitors = $groupModel->getInvitors($my->id, $group->id);

                if (count($invitors) == 1) {
                    $user = CFactory::getUser($invitors[0]->creator);
                    $join = '<a href="' . CUrlHelper::userLink($user->id) . '">' . $user->getDisplayName() . '</a>';
                } else {
                    for ($i = 0; $i < count($invitors); $i++) {
                        $user = CFactory::getUser($invitors[$i]->creator);

                        if (($i + 1 ) == count($invitors)) {
                            $join .= ' ' . Text::_('COM_COMMUNITY_AND') . ' ' . '<a href="' . CUrlHelper::userLink($user->id) . '">' . $user->getDisplayName() . '</a>';
                        } else {
                            $join .= ', ' . '<a href="' . CUrlHelper::userLink($user->id) . '">' . $user->getDisplayName() . '</a>';
                        }
                    }
                }

                // Get users friends in this group
                $friendsCount = $groupModel->getFriendsCount($my->id, $group->id);
            }

            // Get list of unapproved members
            $unapproved = $groupModel->getMembers($group->id, null, false);
            $unapproved = count($unapproved);

            // Test if the current user is admin
            $isAdmin = $groupModel->isAdmin($my->id, $group->id);

            // Test if the current browser is a member of the group
            $isMember = $groupModel->isMember($my->id, $group->id);
            $waitingApproval = false;

            // Test if the current user is banned from this group
            $isBanned = $group->isBanned($my->id);

            // Attach avatar of the member
            // Pre-load multiple users at once
            $userids = array();
            $limitloop = $limit;
            foreach ($approvedMembers as $uid) {
                if ($limitloop-- < 1){
                    break;
                }
                $userids[] = $uid->id;
            }
            CFactory::loadUsers($userids);

            $limitloop = $limit;
            for ($i = 0; ($i < count($approvedMembers)); $i++) {
                if ($limitloop-- < 1){
                    break;
                }
                $row = $approvedMembers[$i];
                $approvedMembers[$i] = CFactory::getUser($row->id);
            }

            $membersCount = $group->membercount;

            if ($isBanned) {
                $mainframe = Factory::getApplication();
                $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_GROUPS_MEMBER_BANNED'), 'error');
                return;
            }

            // If I have tried to join this group, but not yet approved, display a notice
            if ($groupModel->isWaitingAuthorization($my->id, $group->id)) {
                $waitingApproval = true;
            }

            // Get like
            $likes = new CLike();
            $isUserLiked = false;

            if ($isLikeEnabled = $likes->enabled('groups')) {
                $isUserLiked = $likes->userLiked('groups', $group->id, $my->id);
            }

            $totalLikes = $likes->getLikeCount('groups', $group->id);

            // Get discussions data
            $discussionData = $this->_cachedCall('_getDiscussionListHTML', array($params, $group->id), $group->id, array(COMMUNITY_CACHE_TAG_GROUPS_DETAIL));
            $discussionsHTML = $discussionData['HTML'];
            $totalDiscussion = $discussionData['total'];
            $discussions = $discussionData['data'];

            // Get bulletins data
            $bulletinData = $this->_cachedCall('_getBulletinListHTML', array($group->id), $group->id, array(COMMUNITY_CACHE_TAG_GROUPS_DETAIL));
            $totalBulletin = $bulletinData['total'];
            $bulletinsHTML = $bulletinData['HTML'];
            $bulletins = $bulletinData['data'];

            // Get album data
            $albumData = $this->_cachedCall('_getAlbums', array($params, $group->id), $group->id, array(COMMUNITY_CACHE_TAG_GROUPS_DETAIL));
            $albums = $albumData['data'];
            $totalAlbums = $albumData['total'];

            // Get video data
            $videoData = $this->_getVideos($params, $group->id);
            $videos = $videoData['data'];
            $totalVideos = $videoData['total'];

            // Get poll data
            $pollData = $this->_getPolls($params, $group->id);
            $polls = $pollData['data'];
            $totalPolls = $pollData['total'];

            $tmpl = new CTemplate();

            $isMine = ($my->id == $group->ownerid);
            $isSuperAdmin = COwnerHelper::isCommunityAdmin();

            if ($group->approvals == '1' && !$isMine && !$isMember && !CFactory::getUser()->authorise('community.groupeditstate', 'com_community') && !CFactory::getUser()->authorise('community.groupedit', 'com_community') && !CFactory::getUser()->authorise('community.groupdelete', 'com_community')) {
                $this->addWarning(Text::_('COM_COMMUNITY_GROUPS_PRIVATE_NOTICE'));
            }

            $eventsModel = CFactory::getModel('Events');
            $tmpEvents = $eventsModel->getGroupEvents($group->id, $params->get('grouprecentevents', GROUP_EVENT_RECENT_LIMIT));
            $totalEvents = $eventsModel->getTotalGroupEvents($group->id);

            $events = array();
            foreach ($tmpEvents as $event) {
                $table = Table::getInstance('Event', 'CTable');
                $table->bind($event);
                $events[] = $table;
            }

            $allowCreateEvent = CGroupHelper::allowCreateEvent($my->id, $group->id);

            if ($group->approvals == '0' || $isMine || ($isMember && !$isBanned) || $isSuperAdmin) {
                // Set feed url
                $feedLink = CRoute::_('index.php?option=com_community&view=groups&task=viewbulletins&groupid=' . $group->id . '&format=feed');
                $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_TO_BULLETIN_FEEDS') . '" href="' . $feedLink . '"/>';
                $document->addCustomTag($feed);

                $feedLink = CRoute::_('index.php?option=com_community&view=groups&task=viewdiscussions&groupid=' . $group->id . '&format=feed');
                $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_TO_DISCUSSION_FEEDS') . '" href="' . $feedLink . '"/>';
                $document->addCustomTag($feed);

                $feedLink = CRoute::_('index.php?option=com_community&view=photos&groupid=' . $group->id . '&format=feed');
                $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_TO_GROUP_PHOTOS_FEEDS') . '" href="' . $feedLink . '"/>';
                $document->addCustomTag($feed);

                $feedLink = CRoute::_('index.php?option=com_community&view=videos&groupid=' . $group->id . '&format=feed');
                $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_TO_GROUP_VIDEOS_FEEDS') . '"  href="' . $feedLink . '"/>';
                $document->addCustomTag($feed);

                $feedLink = CRoute::_('index.php?option=com_community&view=events&groupid=' . $group->id . '&format=feed');
                $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_TO_GROUP_EVENTS_FEEDS') . '"  href="' . $feedLink . '"/>';
                $document->addCustomTag($feed);
            }

            // Upgrade wall to stream @since 2.5
            if (!$params->get('stream', FALSE)) {
                $group->upgradeWallToStream();
            }

            $group->getAvatar();
            $group->defaultAvatar = empty($group->avatar);

            // Find avatar album.
            $album = Table::getInstance('Album', 'CTable');
            $albumId = $album->isAvatarAlbumExists($group->id, 'group');
            $group->avatarAlbum = $albumId ? $albumId : false;

            // Check if default cover is used.
            $group->defaultCover = empty($group->cover) ? true : false;

            // Cover position.
            $group->coverPostion = $params->get('coverPosition', '');
            if ( strpos( $group->coverPostion, '%' ) === false )
                $group->coverPostion = 0;

            // Find cover album and photo.
            $group->coverAlbum = false;
            $group->coverPhoto = false;
            $album = Table::getInstance('Album', 'CTable');
            $albumId = $album->isCoverExist('group', $group->id);
            if ($albumId) {
                $album->load($albumId);
                $group->coverAlbum = $albumId;
                $group->coverPhoto = $album->photoid;
            }

            // Add custom stream
            $activities = new CActivities();
            $streamHTML = $activities->getOlderStream(1000000000, 'active-group', $group->id);
            $totalStream = $activityModel->getTotalActivities(array("`groupid` = '{$group->id}'"));

            $creators = array();
            $creators[] = CUserStatusCreator::getMessageInstance();
            if (( ($isAdmin || $isSuperAdmin) && $params->get('photopermission') == 1) || (($isMember || $isSuperAdmin) && $params->get('photopermission') == 2) || $isSuperAdmin)
                $creators[] = CUserStatusCreator::getPhotoInstance();
            if (( ($isAdmin || $isSuperAdmin) && $params->get('videopermission') == 1) || (($isMember || $isSuperAdmin) && $params->get('videopermission') == 2) || $isSuperAdmin)
                $creators[] = CUserStatusCreator::getVideoInstance();
            if (($allowCreateEvent || $isSuperAdmin ) && $config->get('group_events') && $config->get('enableevents') && ($config->get('createevents') ) || $isSuperAdmin)
                $creators[] = CUserStatusCreator::getEventInstance();

            $status = new CUserStatus($group->id, 'groups', $creators);

            // Get Event Admins
            $groupAdmins = $group->getAdmins(12, CC_RANDOMIZE);
            $adminsInArray = array();

            // Attach avatar of the admin
            for ($i = 0; ($i < count($groupAdmins)); $i++) {
                $row = $groupAdmins[$i];
                $admin = CFactory::getUser($row->id);
                array_push($adminsInArray, '<a href="' . CUrlHelper::userLink($admin->id) . '">' . $admin->getDisplayName() . '</a>');
            }

            $totalPhotos = 0;

            $allAlbumData = $this->_cachedCall('_getAlbums', array($params, $group->id, true), $group->id, array(COMMUNITY_CACHE_TAG_GROUPS_DETAIL));

            foreach ($allAlbumData['data'] as $album) {
                if (!in_array($album->type, array('group.avatar', 'groupgroup.Cover'))) {
                    $albumParams = new CParameter($album->params);
                    $totalPhotos = $totalPhotos + $albumParams->get('count');
                }
            }

            $adminsList = ltrim(implode(', ', $adminsInArray), ',');

            $showMoreActivity = ($totalStream <= $config->get('maxactivities')) ? false : true;

            $groupsModel = CFactory::getModel('groups');
            $bannedMembers = $groupsModel->getBannedMembers($group->id);

            /* Opengraph */
            CHeadHelper::addOpengraph('og:image', $group->getAvatar('avatar'), true);
            CHeadHelper::addOpengraph('og:image', $group->getCover(), true);

            $featured = new CFeatured(FEATURED_GROUPS);
            $featuredList = $featured->getItemIds();

            echo $tmpl->setMetaTags('group', $group)
                    ->set('streamHTML', $streamHTML)
                    ->set('showMoreActivity', $showMoreActivity)
                    ->set('status', $status)
                    ->set('events', $events)
                    ->set('totalEvents', $totalEvents)
                    ->set('showEvents', $config->get('group_events') && $config->get('enableevents') && $params->get('eventpermission',1) >= 1)
                    ->set('showPhotos', ( $params->get('photopermission') != -1 ) && $config->get('enablephotos') && $config->get('groupphotos'))
                    ->set('showVideos', ( $params->get('videopermission') != -1 ) && $config->get('enablevideos') && $config->get('groupvideos'))
                    ->set('showPolls', ( $params->get('pollspermission') != -1 ) && $config->get('enablepolls') && $config->get('group_polls'))
                    ->set('eventPermission', $params->get('eventpermission'))
                    ->set('photoPermission', $params->get('photopermission'))
                    ->set('videoPermission', $params->get('videopermission'))
                    ->set('pollspermission', $params->get('pollspermission'))
                    ->set('allowCreateEvent', $allowCreateEvent)
                    ->set('videos', $videos)
                    ->set('totalVideos', $totalVideos)
                    ->set('albums', $albums)
                    ->set('editGroup', $editGroup)
                    ->set('waitingApproval', $waitingApproval)
                    ->set('config', $config)
                    ->set('isMine', $isMine)
                    ->set('isAdmin', $isAdmin)
                    ->set('isSuperAdmin', $isSuperAdmin)
                    ->set('isMember', $isMember)
                    ->set('isInvited', $isInvited)
                    ->set('friendsCount', $friendsCount)
                    ->set('join', $join)
                    ->set('unapproved', $unapproved)
                    ->set('membersCount', $membersCount)
                    ->set('group', $group)
                    ->set('totalBulletin', $totalBulletin)
                    ->set('totalDiscussion', $totalDiscussion)
                    ->set('totalVideos', $totalVideos)
                    ->set('members', $approvedMembers)
                    ->set('bulletins', $bulletins)
                    ->set('discussions', $discussions)
                    ->set('discussionsHTML', $discussionsHTML)
                    ->set('bulletinsHTML', $bulletinsHTML)
                    ->set('isBanned', $isBanned)
                    ->set('totalBannedMembers', count($bannedMembers) )
                    ->set('isPrivate', $group->approvals)
                    ->set('limit', $limit)
                    ->set('adminsList', $adminsList)
                    ->set('isFile', $fileModel->isfileAvailable($group->id, 'group') )
                    /* Set notification counts */
                    ->set('alertNewDiscussion', $my->count('group_discussion_' . $group->id) != $totalDiscussion)
                    ->set('alertNewBulletin', $my->count('group_bulletin_' . $group->id) != $totalBulletin)
                    ->set('alertNewStream', $my->count('group_activity_' . $group->id) != $totalStream)
                    ->set('isUserLiked', $isUserLiked)
                    ->set('totalLikes', $totalLikes)
                    ->set('isLikeEnabled', $isLikeEnabled)
                    ->set('totalPhotos', $totalPhotos)
                    ->set('totalAlbums', $totalAlbums)
                    ->set('totalPolls', $totalPolls)
                    ->set('profile', $my)
                    ->set('featuredList', $featuredList)
                    ->fetch('groups/single');

            // Update stream count cache, can only set this after we've set the alert aove
            if($my->id){
                $my->setCount('group_activity_' . $group->id, $totalStream);
            }
        }

        public function uploadAvatar($data) {
            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_AVATAR_UPLOAD'));

            $this->_addGroupInPathway($data->id);
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_AVATAR_UPLOAD'));

            $this->showSubmenu();

            $config = CFactory::getConfig();
            $uploadLimit = (double) $config->get('maxuploadsize');
            $uploadLimit .= 'MB';

            $group = Table::getInstance('Group', 'CTable');
            $group->load($data->id);

            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }

            $app = CAppPlugins::getInstance();
            $appFields = $app->triggerEvent('onFormDisplay', array('jsform-groups-uploadavatar'));
            $beforeFormDisplay = CFormElement::renderElements($appFields, 'before');
            $afterFormDisplay = CFormElement::renderElements($appFields, 'after');

            $tmpl = new CTemplate();
            echo $tmpl->set('beforeFormDisplay', $beforeFormDisplay)
                    ->set('afterFormDisplay', $afterFormDisplay)
                    ->set('groupId', $data->id)
                    ->set('avatar', $group->getAvatar('avatar'))
                    ->set('thumbnail', $group->getAvatar())
                    ->set('uploadLimit', $uploadLimit)
                    ->fetch('groups.uploadavatar');
        }

        /**
         * Method to display groups that belongs to a user.
         *
         * @access public
         */
        public function mygroups($userid) {
            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;
            $document = Factory::getDocument();
            $user = CFactory::getUser($userid);
            $my = CFactory::getUser();

            if(!$user->_userid){
                $mainframe->redirect(CRoute::_('index.php?option=com_community&view=groups'));
            }

            // Respect profile privacy setting.
            if (!CPrivacy::isAccessAllowed($my->id, $user->id, 'user', 'privacyGroupsView')) {
                //echo Text::_('COM_COMMUNITY_ACCESS_FORBIDDEN');
                echo "<div class=\"cEmpty cAlert\">" . Text::_('COM_COMMUNITY_PRIVACY_ERROR_MSG') . "</div>";
                return;
            }

            $title = ($my->id == $user->id) ? Text::_('COM_COMMUNITY_GROUPS_MY_GROUPS') : Text::sprintf('COM_COMMUNITY_GROUPS_USER_TITLE', $user->getDisplayName());
            /**
             * Opengraph
             */
            CHeadHelper::setType('website', $title);

            // Add the miniheader if necessary
            if ($my->id != $user->id) {
                $this->attachMiniHeaderUser($user->id);
            }

            // Load required filterbar library that will be used to display the filtering and sorting.

            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS'), CRoute::_('index.php?option=com_community&view=groups'));
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_MY_GROUPS'), '');

            $uri = Uri::base();

            //@todo: make mygroups page to contain several admin tools for owner?
            $config = CFactory::getConfig();
            $defaultSortOrder = $config->get('group_default_sort_order', 'latest');

            $groupsModel = CFactory::getModel('groups');
            $avatarModel = CFactory::getModel('avatar');
            $wallsModel = CFactory::getModel('wall');
            $activityModel = CFactory::getModel('activities');
            $discussionModel = CFactory::getModel('discussions');
            $sorted = $jinput->get->get('sort', $defaultSortOrder, 'STRING');
            // @todo: proper check with CError::assertion
            // Make sure the sort value is not other than the array keys

            $groups = $groupsModel->getGroups($user->id, $sorted);
            $pagination = $groupsModel->getPagination(count($groups));

            require_once( JPATH_COMPONENT . '/libraries/activities.php');
            $act = new CActivityStream();

            // Attach additional properties that the group might have
            $groupIds = '';
            if ($groups) {
                foreach ($groups as $group) {
                    $groupIds = (empty($groupIds)) ? $group->id : $groupIds . ',' . $group->id;
                }
            }

            // Get the template for the group lists
            $groupsHTML = $this->_getGroupsHTML($groups, $pagination);

            $feedLink = CRoute::_('index.php?option=com_community&view=groups&task=mygroups&userid=' . $userid . '&format=feed');
            $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_TO_LATEST_MY_GROUPS_FEED') . '"  href="' . $feedLink . '"/>';
            $document->addCustomTag($feed);

            $feedLink = CRoute::_('index.php?option=com_community&view=groups&task=viewmylatestdiscussions&groupids=' . $groupIds . '&userid=' . $userid . '&format=feed');
            $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_TO_LATEST_MY_GROUP_DISCUSSIONS_FEED') . '"  href="' . $feedLink . '"/>';
            $document->addCustomTag($feed);
            
            $sortItems = array(
                'latest' => Text::_('COM_COMMUNITY_GROUPS_SORT_LATEST'),
                'oldest' => Text::_('COM_COMMUNITY_GROUPS_SORT_OLDEST'),
                'alphabetical' => Text::_('COM_COMMUNITY_SORT_ALPHABETICAL'),
                'mostactive' => Text::_('COM_COMMUNITY_GROUPS_SORT_MOST_ACTIVE')
            );

            if(CFactory::getConfig()->get('show_featured')){
                $sortItems['featured'] = Text::_('COM_COMMUNITY_GROUP_SORT_FEATURED');
            }

            $tmpl = new CTemplate();
            echo $tmpl->set('groupsHTML', $groupsHTML)
                    ->set('pagination', $pagination)
                    ->set('isMyGroups', true)
                    ->set('my', $my)
                    ->set('user', $user)
                    ->set('title', $title)
                    ->set('sortings', CFilterBar::getHTML(CRoute::getURI(), $sortItems, $defaultSortOrder))
                    ->set('discussionsHTML', $this->modUserDiscussion($user->id))
                    ->set('submenu', $this->showSubmenu(false))
                    ->fetch('groups/base');
        }

        public function myinvites() {
            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;
            $userId = $jinput->get('userid', '', 'INT');

            $config = CFactory::getConfig();
            // Load required filterbar library that will be used to display the filtering and sorting.
            $document = Factory::getDocument();

            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS'), CRoute::_('index.php?option=com_community&view=groups'));
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_PENDING_INVITES'), '');

            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_PENDING_INVITES'));

            $feedLink = CRoute::_('index.php?option=com_community&view=groups&task=mygroups&userid=' . $userId . '&format=feed');
            $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_TO_PENDING_INVITATIONS_FEED') . '"  href="' . $feedLink . '"/>';
            $document->addCustomTag($feed);

            $my = CFactory::getUser();
            $model = CFactory::getModel('groups');
            $discussionModel = CFactory::getModel('discussions');
            $sorted = $jinput->get->get('sort', 'latest', 'STRING');

            $rows = $model->getGroupInvites($my->id);
            $pagination = $model->getPagination(count($rows));
            $groups = array();
            $ids = '';

            if ($rows) {
                foreach ($rows as $row) {
                    $table = Table::getInstance('Group', 'CTable');
                    $table->load($row->groupid);
                    $table->description = CStringHelper::clean(JHTML::_('string.truncate', $table->description, $config->get('tips_desc_length')));
                    $groups[] = $table;
                    $ids = (empty($ids)) ? $table->id : $ids . ',' . $table->id;
                }
            }

            $sortItems = array(
                'latest' => Text::_('COM_COMMUNITY_GROUPS_SORT_LATEST'),
                'oldest' => Text::_('COM_COMMUNITY_GROUPS_SORT_OLDEST'),
                'alphabetical' => Text::_('COM_COMMUNITY_SORT_ALPHABETICAL'),
                'mostactive' => Text::_('COM_COMMUNITY_GROUPS_SORT_MOST_ACTIVE'));

            $defaultSortOrder = $config->get('group_default_sort_order', 'latest');

            $tmpl = new CTemplate();
            echo $tmpl->set('groups', $groups)
                    ->set('showFeatured', $config->get('show_featured'))
                    ->set('pagination', $pagination)
                    ->set('count', $pagination->total)
                    ->set('my', $my)
                    ->set('sortings', CFilterBar::getHTML(CRoute::getURI(), $sortItems, $defaultSortOrder))
                    ->set('submenu', $this->showSubmenu(false))
                    ->fetch('groups.myinvites');
        }

        /**
         * @since 2.4
         */
        public function modPublicDiscussion($categoryId = null) {
            $groupsModel = CFactory::getModel('groups');
            $discussionModel = CFactory::getModel('discussions');

            // getting group's latest discussion activities.
            $templateParams = CTemplate::getTemplateParams();
            $discussions = $groupsModel->getGroupLatestDiscussion($categoryId, '', $templateParams->get('sidebarTotalDiscussions'));

            return $this->_getSidebarDiscussions($discussions);
        }

        /**
         * @since 2.4
         */
        public function modUserDiscussion($userid) {
            $user = CFactory::getUser($userid);
            $groupsModel = CFactory::getModel('groups');
            $discussionModel = CFactory::getModel('discussions');
            $groupIds = $user->_groups;

            // getting group's latest discussion activities.
            $templateParams = CTemplate::getTemplateParams();
            $discussions = $groupsModel->getGroupLatestDiscussion('', $groupIds, $templateParams->get('sidebarTotalDiscussions'));

            return $this->_getSidebarDiscussions($discussions);
        }

        private function _getSidebarDiscussions($discussions) {

            if (!empty($discussions)) {
                $discussionModel = CFactory::getModel('discussions');

                for ($i = 0; $i < count($discussions); $i++) {
                    $row = $discussions[$i];
                    $creator = CFactory::getUser($row->creator);
                    $commentorName = '';

                    /**
                     * need to retrieve last replier's id
                     * if there is lastreplied (date) for corresponding discussion
                     */
                    if (!empty($discussions[$i]->lastreplied)) {
                        $lastReplier = $discussionModel->getLastReplier($discussions[$i]->id);
                        // Add is_null check to avoid earlier wall post being removed but lastreplied is with valid date
                        if (!is_null($lastReplier)) {
                            $discussions[$i]->lastReplier = $lastReplier->post_by;
                        }
                    }

                    if ($creator->block) {
                        $row->title = Text::_('COM_COMMUNITY_CENSORED');
                    }

                    /**
                     * Modified by Adam Lim on 14 July 2011
                     * Check for lastReplier and get lastReplier's name to display
                     * Note: Check for lastReplier and in mygroups function already checked for lastreplied (date)
                     */
                    if (!empty($row->lastReplier)) {
                        $commentor = CFactory::getUser($row->lastReplier);
                        $commentorName = $commentor->getDisplayName();
                    }

                    $row->creatorName = $creator->getDisplayName();
                    $row->commentorName = $commentorName;
                }


                $tmpl = new CTemplate();
                return $tmpl->set('discussions', $discussions)
                                ->fetch('groups.module.discussions');
            }
            return '';
        }

        public function viewbulletin() {
            $document = Factory::getDocument();
            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;

            // Load necessary libraries
            $groupsModel = CFactory::getModel('groups');
            $bulletin = Table::getInstance('Bulletin', 'CTable');
            $group = Table::getInstance('Group', 'CTable');
            $my = CFactory::getUser();
            $bulletinId = $jinput->get('bulletinid', '', 'INT');
            $bulletin->load($bulletinId);
            $group->load($bulletin->groupid);

            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }

            if ($group->approvals == 1 && !($group->isMember($my->id) ) && !COwnerHelper::isCommunityAdmin()) {
                $this->noAccess(Text::_('COM_COMMUNITY_GROUPS_PRIVATE_NOTICE'));
                return;
            }

            /**
             * Opengraph
             */
            CHeadHelper::setType('website', $bulletin->title);

            // Santinise output
            $bulletin->title = strip_tags($bulletin->title);
            $bulletin->title = CStringHelper::escape($bulletin->title);

            // Add pathways
            $this->_addGroupInPathway($group->id);
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_BULLETIN'), CRoute::_('index.php?option=com_community&view=groups&task=viewbulletins&groupid=' . $group->id));
            $this->addPathway(Text::sprintf('COM_COMMUNITY_GROUPS_BULLETIN_PATHWAY_TITLE', $bulletin->title));

            if ($groupsModel->isAdmin($my->id, $group->id) || COwnerHelper::isCommunityAdmin()) {
                $this->addSubmenuItem('', Text::_('COM_COMMUNITY_DELETE'), "joms.api.announcementRemove('" . $bulletin->groupid . "', '" . $bulletin->id . "');", true);
                $this->addSubmenuItem('', Text::_('COM_COMMUNITY_EDIT'), "joms.api.announcementEdit('" . $bulletin->groupid . "', '" . $bulletin->id . "');", true);
            }

            $config = CFactory::getConfig();
            $editor = new CEditor($config->get('htmleditor', 'none'));

            $appsLib = CAppPlugins::getInstance();
            $appsLib->loadApplications();

            $args[] = $bulletin;
            $editorMessage = $bulletin->message;

            // Format the bulletins
            $appsLib->triggerEvent('onBulletinDisplay', $args);

            $bookmarks = new CBookmarks(CRoute::getExternalURL('index.php?option=com_community&view=groups&task=viewbulletin&groupid=' . $group->id . '&bulletinid=' . $bulletin->id));
            $bookmarksHTML = $bookmarks->getHTML();

            $creator = CFactory::getUser($bulletin->created_by);

            //filesharing
            $filesharingHTML = '';
            $permission = CGroupHelper::getMediaPermission($bulletin->groupid);
            if ($config->get('groupbulletinfilesharing') && $permission->params->get('groupannouncementfilesharing')) {

                $file = new CFilesLibrary();
                $filesharingHTML = $file->getFileHTML('bulletin', $bulletin->id);
            }
            $params = $bulletin->getParams();
            $gparams = $group->getParams();
            $tmpl = new CTemplate();
            echo $tmpl->set('bookmarksHTML', $bookmarksHTML)
                    ->set('creator', $creator)
                    ->set('bulletin', $bulletin)
                    ->set('editor', $editor)
                    ->set('config', $config)
                    ->set('editorMessage', $editorMessage)
                    ->set('filesharingHTML', $filesharingHTML)
                    ->set('params', $params)
                    ->set('gparams', $gparams)
                    ->set('group', $group)
                    ->set('canCreate', $my->authorise('community.create', 'groups.discussions.' . $group->id))
                    ->set('submenu', $this->showSubmenu(false))
                    ->fetch('groups.viewbulletin');
        }

        /**
         * Display a list of bulletins from the specific group
         * */
        public function viewbulletins() {
            $document = Factory::getDocument();
            $jinput = Factory::getApplication()->input;

            $id = $jinput->getInt('groupid');
            $my = CFactory::getUser();

            // Load the group
            $group = Table::getInstance('Group', 'CTable');
            $group->load($id);
            $this->_addGroupInPathway($group->id);
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_BULLETIN'));

            if ($group->id == 0) {
                echo Text::_('COM_COMMUNITY_GROUPS_ID_NOITEM');
                return;
            }

            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }

            //display notice if the user is not a member of the group
            if ($group->approvals == 1 && !($group->isMember($my->id) ) && !COwnerHelper::isCommunityAdmin()) {
                $this->noAccess(Text::_('COM_COMMUNITY_GROUPS_PRIVATE_NOTICE'));
                return;
            }

            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::sprintf('COM_COMMUNITY_GROUPS_VIEW_ALL_BULLETINS_TITLE', $group->name));

            // Load submenu
            //$this->showSubMenu();

            $model = CFactory::getModel('bulletins');
            $bulletins = $model->getBulletins($group->id);

            // Set feed url
            $feedLink = CRoute::_('index.php?option=com_community&view=groups&task=viewbulletins&groupid=' . $group->id . '&format=feed');
            $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_TO_BULLETIN_FEEDS') . '" href="' . $feedLink . '"/>';
            $document->addCustomTag($feed);

            // Get the creator of the bulletins
            for ($i = 0; $i < count($bulletins); $i++) {
                $row = $bulletins[$i];

                $row->creator = CFactory::getUser($row->created_by);
            }

            // Only trigger the bulletins if there is really a need to.
            if (!empty($bulletins) && isset($bulletins)) {
                $appsLib = CAppPlugins::getInstance();
                $appsLib->loadApplications();

                // Format the bulletins
                // the bulletins need to be an array or reference to work around
                // PHP 5.3 pass by value
                $args = array();
                foreach ($bulletins as &$b) {
                    $args[] = $b;
                }
                $appsLib->triggerEvent('onBulletinDisplay', $args);
            }
            // Process bulletins HTML output
            $tmpl = new CTemplate();
            $bulletinsHTML = $tmpl->set('bulletins', $bulletins)
                    ->set('groupId', $group->id)
                    ->set('isAdmin',$group->isAdmin($my->id))
                    ->fetch('groups.bulletinlist');

            unset($tmpl);

            $tmpl = new CTemplate();
            echo $tmpl->set('group', $group)
                    ->set('bulletinsHTML', $bulletinsHTML)
                    ->set('pagination', $model->getPagination())
                    ->fetch('groups.viewbulletins');
        }

        public function banlist($data) {
            $this->viewmembers($data);
        }

        /**
         * View method to display members of the groups
         *
         * @access	public
         * @param	string 	Group Id
         * @returns object  An object of the specific group
         */
        public function viewmembers($data) {
            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;

            $groupsModel = CFactory::getModel('groups');
            $friendsModel = CFactory::getModel('friends');
            $userModel = CFactory::getModel('user');
            $my = CFactory::getUser();
            $config = CFactory::getConfig();
            $type = $jinput->get->get('approve', '', 'NONE');
            $group = Table::getInstance('Group', 'CTable');
            $list = $jinput->get->get('list', '', 'NONE');

            if (!$group->load($data->id)) {
                echo CSystemHelper::showErrorPage();
                return;
            }

            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }

            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::sprintf('COM_COMMUNITY_GROUPS_MEMBERS_TITLE', $group->name));

            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS'), CRoute::_('index.php?option=com_community&view=groups'));
            $this->addPathway($group->name, CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id));
            $this->addPathway(Text::_('COM_COMMUNITY_MEMBERS'));


            $isSuperAdmin = COwnerHelper::isCommunityAdmin();
            $isAdmin = $groupsModel->isAdmin($my->id, $group->id);
            $isMember = $group->isMember($my->id);
            $isMine = ($my->id == $group->ownerid);
            $isBanned = $group->isBanned($my->id);

            if ($group->approvals == '1' && !$isMine && !$isMember && !$isSuperAdmin) {
                $this->noAccess(Text::_('COM_COMMUNITY_GROUPS_PRIVATE_NOTICE'));
                return;
            }

            switch ($list) {
                case COMMUNITY_GROUP_ADMIN :
                    $members = $groupsModel->getAdmins($data->id);
                    $title = Text::_('COM_COMMUNITY_GROUP_MEMBERS');
                    break;
                case COMMUNITY_GROUP_BANNED :
                    $members = $groupsModel->getBannedMembers($data->id);
                    $title = Text::_('COM_COMMUNITY_GROUPS_BANNED_MEMBERS');
                    break;
                default :
                    $title = Text::_('COM_COMMUNITY_GROUP_MEMBERS');
                    if (!empty($type) && ( $type == '1' )) {
                        $members = $groupsModel->getMembers($data->id, 0, false);
                    } else {
                        $members = $groupsModel->getMembers($data->id, 0, true, false, SHOW_GROUP_ADMIN);
                    }
            }

            if($type == 1){
                $title = TEXT::_('COM_COMMUNITY_GROUPS_MEMBERS_PENDING_APPROVAL_TITLE');
            }

            // Attach avatar of the member
            // Pre-load multiple users at once
            $userids = array();
            foreach ($members as $uid) {
                $userids[] = $uid->id;
            }
            CFactory::loadUsers($userids);

            $membersList = array();
            foreach ($members as $member) {
                $user = CFactory::getUser($member->id);

                $user->friendsCount = $user->getFriendCount();
                $user->approved = $member->approved;
                $user->isMe = ( $my->id == $member->id ) ? true : false;
                $user->isAdmin = $groupsModel->isAdmin($user->id, $group->id);
                $user->isOwner = ( $member->id == $group->ownerid ) ? true : false;

                // Check user's permission
                $groupmember = Table::getInstance('GroupMembers', 'CTable');
                $keys['groupId'] = $group->id;
                $keys['memberId'] = $member->id;
                $groupmember->load($keys);
                $user->isBanned = ( $groupmember->permissions == COMMUNITY_GROUP_BANNED ) ? true : false;

                $membersList[] = $user;
            }
            // Featured
            $featured = new CFeatured(FEATURED_USERS);
            $featuredList = $featured->getItemIds();

            $pagination = $groupsModel->getPagination();

            $tmpl = new CTemplate();
            echo $tmpl->set('members', $membersList)
                    ->set('list', $list)
                    ->set('type', $type)
                    ->set('title', $title)
                    ->set('isMine', $groupsModel->isCreator($my->id, $group->id))
                    ->set('isAdmin', $isAdmin)
                    ->set('isMember', $isMember)
                    ->set('isSuperAdmin', $isSuperAdmin)
                    ->set('pagination', $pagination)
                    ->set('groupid', $group->id)
                    ->set('my', $my)
                    ->set('config', $config)
                    ->set('group', $group)
                    ->set('submenu', $this->showSubmenu(false))
                    ->set('featuredList', $featuredList)
                    ->fetch('groups.viewmembers');
        }

        /**
         * View method to display discussions from a group
         *
         * @access	public
         */
        public function viewdiscussions() {
            $document = Factory::getDocument();
            $jinput = Factory::getApplication()->input;

            $id = $jinput->getInt('groupid');
            $my = CFactory::getUser();
            $model = CFactory::getModel('discussions');

            // Load the group
            $group = Table::getInstance('Group', 'CTable');
            $group->load($id);
            $this->_addGroupInPathway($group->id);
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_DISCUSSION_TITLE'));
            $params = $group->getParams();

            //check if group is valid
            if ($group->id == 0) {
                echo Text::_('COM_COMMUNITY_GROUPS_ID_NOITEM');
                return;
            }

            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }

            //display notice if the user is not a member of the group
            if ($group->approvals == 1 && !($group->isMember($my->id) ) && !CFactory::getUser()->authorise('community.groupeditstate', 'com_community') && !CFactory::getUser()->authorise('community.groupedit', 'com_community') && !CFactory::getUser()->authorise('community.groupdelete', 'com_community')) {
                $this->noAccess(Text::_('COM_COMMUNITY_GROUPS_PRIVATE_NOTICE'));
                return;
            }

            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::sprintf('COM_COMMUNITY_GROUPS_VIEW_ALL_DISCUSSIONS_TITLE', $group->name));

            $feedLink = CRoute::_('index.php?option=com_community&view=groups&task=viewdiscussions&groupid=' . $group->id . '&format=feed');
            $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_TO_DISCUSSION_FEEDS') . '" href="' . $feedLink . '"/>';
            $document->addCustomTag($feed);

            // Load submenu
            //$this->showSubMenu();
            $discussions = $model->getDiscussionTopics($group->id, 0, 0, DISCUSSION_ORDER_BYLASTACTIVITY);

            for ($i = 0; $i < count($discussions); $i++) {
                $row = $discussions[$i];

                $row->user = CFactory::getUser($row->creator);
                $row->lastreplyuser = CFactory::getUser($row->lastmessageby);

                if (isset($row->lastreplyuser->block) && $row->lastreplyuser->block == 1) {
                    $row->title = $row->lastmessage = Text::_('COM_COMMUNITY_CENSORED');
                }
            }

            // Process discussions HTML output
            $tmpl = new CTemplate();
            $my = CFactory::getUser();
            $discussionsHTML = $tmpl->set('discussions', $discussions)
                    ->set('groupId', $group->id)
                    ->set('canCreate', $my->authorise('community.create', 'groups.discussions.' . $group->id))
                    ->fetch('groups.discussionlist');
            unset($tmpl);

            $tmpl = new CTemplate();
            echo $tmpl->set('group', $group)
                    ->set('discussions', $discussions)
                    ->set('discussionsHTML', $discussionsHTML)
                    ->set('pagination', $model->getPagination())
                    ->fetch('groups.viewdiscussions');
        }

        /*
         * @since 2.4
         */

        public function modRelatedDiscussion($keywords = null, $exclude = null) {
            $discussModel = CFactory::getModel('discussions');
            $relatedDiscussions = $discussModel->getRelatedDiscussion($keywords, $exclude);

            return $this->_getSidebarRelatedDiscussions($relatedDiscussions);
        }

        /*
         * @since 2.4
         */

        private function _getSidebarRelatedDiscussions($discussions) {
            if (!empty($discussions)) {
                $tmpl = new CTemplate();
                return $tmpl->set('discussions', $discussions)
                                ->fetch('groups.module.relateddiscussion');
            }

            return '';
        }

        /**
         * View method to display specific discussion from a group
         * @since 2.4
         * @access	public
         * @param	Object	Data object passed from controller
         */
        public function viewdiscussion() {
            $mainframe = Factory::getApplication();
            $document  = Factory::getDocument();
            $config    = CFactory::getConfig();

            CWindow::load();
            $jinput = Factory::getApplication()->input;

            $my = CFactory::getUser();
            $groupId = $jinput->get('groupid', 0, 'INT');
            $topicId = $jinput->get('topicid', 0, 'INT');

            // Load necessary library and objects
            $groupModel = CFactory::getModel('groups');
            
            $discussion = Table::getInstance('Discussion', 'CTable');
            $discussion->load($topicId);

            if ($discussion->groupid) $groupId = $discussion->groupid;

            $group = Table::getInstance('Group', 'CTable');
            $group->load($groupId);
            
            $isBanned = $group->isBanned($my->id);

            //check if discussion does not exist
            if(!$discussion->id){
                if($groupId){
                    //redirect to discussion page without group id to avoid miniheader to be displayed
                    $mainframe->redirect('index.php?option=com_community&view=groups&task=viewdiscussion&topicid='.$topicId);
                }
                $tmpl = new CTemplate();
                Factory::getApplication()->enqueueMessage(Text::_('COM_COMMUNITY_GROUP_DISCUSSION_NOT_FOUND'), 'Error');
                echo $tmpl->fetch('groups/missingdiscussion');
                return;
            }

            $document->addCustomTag('<link rel="image_src" href="' . $group->getThumbAvatar() . '" />');

            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }

            $feedLink = CRoute::_('index.php?option=com_community&view=groups&task=viewdiscussion&topicid=' . $topicId . '&format=feed');
            $feed     = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_GROUPS_LATEST_FEED') . '"  href="' . $feedLink . '"/>';
            $document->addCustomTag($feed);

            if ($group->approvals == 1 && !($group->isMember($my->id) ) && !CFactory::getUser()->authorise('community.groupeditstate', 'com_community') && !CFactory::getUser()->authorise('community.groupedit', 'com_community') && !CFactory::getUser()->authorise('community.groupdelete', 'com_community')) {
                $this->noAccess(Text::_('COM_COMMUNITY_GROUPS_PRIVATE_NOTICE'));
                return;
            }

            // Execute discussion onDisplay filter
            $appsLib = CAppPlugins::getInstance();
            $appsLib->loadApplications();
            $args = array();
            $args[] = $discussion;
            $appsLib->triggerEvent('onDiscussionDisplay', $args);

            // Get the discussion creator info
            $creator = CFactory::getUser($discussion->creator);

            // Format the date accordingly.
            //$discussion->created	= CTimeHelper::getDate( $discussion->created );
            $dayinterval = ACTIVITY_INTERVAL_DAY;
            $timeFormat = $config->get('activitiestimeformat');
            $dayFormat = $config->get('activitiesdayformat');

            if ($config->get('activitydateformat') == COMMUNITY_DATE_FIXED) {
                $discussion->created = CTimeHelper::getDate($discussion->created)->format(Text::_('DATE_FORMAT_LC2'), true);
            } else {
                $discussion->created = CTimeHelper::timeLapse(CTimeHelper::getDate($discussion->created));
            }

            if ($creator->block) {
                $discussion->title = $discussion->message = Text::_('COM_COMMUNITY_CENSORED');
            }

            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::sprintf('COM_COMMUNITY_GROUPS_DISCUSSION_TITTLE', $discussion->title),$discussion->message);

            // Add pathways
            $this->_addGroupInPathway($group->id);
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_DISCUSSION_TITLE'), CRoute::_('index.php?option=com_community&view=groups&task=viewdiscussions&groupid=' . $group->id));
            $this->addPathway(Text::sprintf('COM_COMMUNITY_GROUPS_DISCUSSION_TITTLE', $discussion->title));

            $isGroupAdmin = $groupModel->isAdmin($my->id, $group->id);

            if (($my->id == $creator->id || $isGroupAdmin || COwnerHelper::isCommunityAdmin()) && CFactory::getUser()->authorise('community.postcommentcreate', 'com_community')) {
                $title = Text::_('COM_COMMUNITY_DELETE_DISCUSSION');

                $titleLock = $discussion->lock ? Text::_('COM_COMMUNITY_UNLOCK_DISCUSSION') : Text::_('COM_COMMUNITY_LOCK_DISCUSSION');
                $actionLock = $discussion->lock ? Text::_('COM_COMMUNITY_UNLOCK') : Text::_('COM_COMMUNITY_LOCK');

                $this->addSubmenuItem('', $actionLock, "joms.api.discussionLock('" . $group->id . "', '" . $discussion->id . "');", SUBMENU_RIGHT);
                $this->addSubmenuItem('', Text::_('COM_COMMUNITY_DELETE'), "joms.api.discussionRemove('" . $group->id . "', '" . $discussion->id . "');", SUBMENU_RIGHT);
                $this->addSubmenuItem('index.php?option=com_community&view=groups&task=editdiscussion&groupid=' . $group->id . '&topicid=' . $discussion->id, Text::_('COM_COMMUNITY_EDIT'), '', SUBMENU_RIGHT);
            } else {
                if (CFactory::getUser()->authorise('community.postcommentdelete', 'com_community')) {
                     $this->addSubmenuItem('', Text::_('COM_COMMUNITY_DELETE'), "joms.api.discussionRemove('" . $group->id . "', '" . $discussion->id . "');", SUBMENU_RIGHT);
                }

                if (CFactory::getUser()->authorise('community.postcommentedit', 'com_community')) {
                     $this->addSubmenuItem('index.php?option=com_community&view=groups&task=editdiscussion&groupid=' . $group->id . '&topicid=' . $discussion->id, Text::_('COM_COMMUNITY_EDIT'), '', SUBMENU_RIGHT);
                }
            }

            $wallContent = CWallLibrary::getWallContents('discussions', $discussion->id, $isGroupAdmin, $config->get('stream_default_comments', 0), 0, 'wall/content', 'groups,discussion');
            $wallCount = CWallLibrary::getWallCount('discussions', $discussion->id);

            $viewAllLink = CRoute::_('index.php?option=com_community&view=groups&task=discussapp&topicid=' . $discussion->id . '&app=walls');

            $wallViewAll = '';
            if ( $wallCount > $config->get('stream_default_comments', 0) ) {
                $wallViewAll = CWallLibrary::getViewAllLinkHTML($viewAllLink, $wallCount);
            }

            // Test if the current browser is a member of the group
            $isMember = $group->isMember($my->id);
            $waitingApproval = false;

            // If I have tried to join this group, but not yet approved, display a notice
            if ($groupModel->isWaitingAuthorization($my->id, $group->id)) {
                $waitingApproval = true;
            }

            $wallForm = '';
            $config = CFactory::getConfig();
            // Only get the wall form if user is really allowed to see it.
            if (!$config->get('lockgroupwalls') || ($config->get('lockgroupwalls') && ($isMember) && (!$isBanned) && !($waitingApproval) ) || COwnerHelper::isCommunityAdmin()) {
                $outputLock = '<div class="cAlert">' . Text::_('COM_COMMUNITY_DISCUSSION_LOCKED_NOTICE') . '</div>';
                $outputUnLock = CWallLibrary::getWallInputForm($discussion->id, 'groups,ajaxSaveDiscussionWall', 'groups,ajaxRemoveReply');
                $wallForm = $discussion->lock ? $outputLock : $outputUnLock;
            }

            if (empty($wallForm) && $wallForm != false) {
                //user must join in order to see this page
                $tmpl = new CTemplate();
                $wallForm = $tmpl->set('groupid', $groupId)
                        ->fetch('groups.joingroup');

                $outputLock   = '<div class="cAlert">' . Text::_('COM_COMMUNITY_DISCUSSION_LOCKED_NOTICE') . '</div>';
                $outputUnLock = CWallLibrary::getWallInputForm($discussion->id, 'groups,ajaxSaveDiscussionWall', 'groups,ajaxRemoveReply');
                $wallForm2    = '<div class="cWall-Header">' . Text::_('COM_COMMUNITY_REPLIES') . '</div>';
                $wallForm2    .= $discussion->lock ? $outputLock : $outputUnLock;
                $wallForm     = $wallForm . '<div style="display:none" class="reply-form">' . $wallForm2 . '</div>';
            }

            $config = CFactory::getConfig();

            // Get creator link
            $creatorLink = CRoute::_('index.php?option=com_community&view=profile&userid=' . $creator->id);

            // Get reporting html
            $report = new CReportingLibrary();
            $reportHTML = $report->getReportingHTML(Text::_('COM_COMMUNITY_GROUPS_DISCUSSION_REPORT'), 'groups,reportDiscussion', array($discussion->id));
            $bookmarks = new CBookmarks(CRoute::getExternalURL('index.php?option=com_community&view=groups&task=viewdiscussion&groupid=' . $group->id . '&topicid=' . $discussion->id));
            $bookmarksHTML = $bookmarks->getHTML();

            //filesharing
            $filesharingHTML = '';
            $permission = CGroupHelper::getMediaPermission($groupId);
            if ($config->get('groupdiscussfilesharing') && $permission->params->get('groupdiscussionfilesharing')) {

                $file = new CFilesLibrary();
                $filesharingHTML = $file->getFileHTML('discussion', $discussion->id);
            }

            $likes = new CLike();
            $isUserLiked = false;
            $totalLikes = 0;
            if ($isLikeEnabled = $likes->enabled('discussion')) {
                $isUserLiked = $likes->userLiked('discussion', $discussion->id, $my->id);
                $totalLikes = $likes->getLikeCount('discussion', $discussion->id);
            }

            $tmpl = new CTemplate();
            echo $tmpl->set('bookmarksHTML', $bookmarksHTML)
                    ->set('discussion', $discussion)
                    ->set('creator', $creator)
                    ->set('wallContent', $wallContent)
                    ->set('wallForm', $wallForm)
                    ->set('wallCount', $wallCount)
                    ->set('wallViewAll', $wallViewAll)
                    ->set('creatorLink', $creatorLink)
                    ->set('reportHTML', $reportHTML)
                    ->set('filesharingHTML', $filesharingHTML)
                    ->set('group', $group)
                    ->set('canCreate', $my->authorise('community.create', 'groups.discussions.' . $group->id))
                    ->set('isTimeLapsed', $config->get('activitydateformat'))
                    ->set('submenu', $this->showSubmenu(false))
                    ->set('isUserLiked', $isUserLiked)
                    ->set('totalLikes', $totalLikes)
                    ->set('isLikeEnabled', $isLikeEnabled)
                    ->fetch('groups.viewdiscussion');
        }

        /**
         * View method to display new discussion form
         *
         * @access	public
         * @param	Object	Data object passed from controller
         */
        public function adddiscussion(&$discussion) {
            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_DISCUSSION_CREATE'));

            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;
            $groupId = $jinput->get('groupid', '', 'INT');

            $this->_addGroupInPathway($groupId);
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_DISCUSSION_CREATE'));
            //$this->showSubmenu();

            $config = CFactory::getConfig();
            $editorType = ($config->get('allowhtml') ) ? $config->get('htmleditor', 'none') : 'none';
            $editor = new CEditor($editorType);

            $group = Table::getInstance('Group', 'CTable');
            $group->load($groupId);

            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }
            $params = $group->getParams();
            $app = CAppPlugins::getInstance();
            $appFields = $app->triggerEvent('onFormDisplay', array('jsform-groups-discussionform'));
            $beforeFormDisplay = CFormElement::renderElements($appFields, 'before');
            $afterFormDisplay = CFormElement::renderElements($appFields, 'after');

            $tmpl = new CTemplate();
            echo $tmpl->set('beforeFormDisplay', $beforeFormDisplay)
                    ->set('afterFormDisplay', $afterFormDisplay)
                    ->set('config', $config)
                    ->set('editor', $editor)
                    ->set('group', $group)
                    ->set('discussion', $discussion)
                    ->set('params', $params)
                    ->fetch('groups.adddiscussion');
        }

        /**
         * View method to display new discussion form
         *
         * @access	public
         * @param	Object	Data object passed from controller
         */
        public function editdiscussion($discussion) {
            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_EDIT_DISCUSSION'));

            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;

            $groupId = $jinput->get('groupid', '', 'INT');
            $topicId = $jinput->get('topicid', '', 'INT');

            $this->_addGroupInPathway($groupId);
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_EDIT_DISCUSSION'));

            $this->showSubmenu();

            $config = CFactory::getConfig();
            $editorType = ($config->get('allowhtml') ) ? $config->get('htmleditor', 'none') : 'none';
            $editor = new CEditor($editorType);

            $group = Table::getInstance('Group', 'CTable');
            $group->load($groupId);

            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }

            // Santinise output
            $discussion->title = strip_tags($discussion->title);
            $discussion->title = CStringHelper::escape($discussion->title);

            $app = CAppPlugins::getInstance();
            $appFields = $app->triggerEvent('onFormDisplay', array('jsform-groups-discussionform'));
            $beforeFormDisplay = CFormElement::renderElements($appFields, 'before');
            $afterFormDisplay = CFormElement::renderElements($appFields, 'after');

            $params = $discussion->getParams();
            $gparams = $group->getParams();
            $tmpl = new CTemplate();
            echo $tmpl->set('beforeFormDisplay', $beforeFormDisplay)
                    ->set('afterFormDisplay', $afterFormDisplay)
                    ->set('config', $config)
                    ->set('editor', $editor)
                    ->set('group', $group)
                    ->set('discussion', $discussion)
                    ->set('params', $params)
                    ->set('gparams', $gparams)
                    ->fetch('groups.editdiscussion');
        }

        /**
         * View method to search groups
         *
         * @access	public
         *
         * @returns object  An object of the specific group
         */
        public function search() {
            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_SEARCH_TITLE'));

            $mainframe = Factory::getApplication();
            $jinput = $mainframe->input;

            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS'), CRoute::_('index.php?option=com_community&view=groups'));
            $this->addPathway(Text::_("COM_COMMUNITY_SEARCH"), '');

            $search = $jinput->get('search', '', 'STRING');
            $catId = $jinput->get('catid', 0, 'INT');
            $groups = '';
            $pagination = null;
            $posted = false;
            $count = 0;

            $model = CFactory::getModel('groups');

            $categories = $model->getCategories();

            // Test if there are any post requests made
            if ((!empty($search) || !empty($catId))) {
                Session::checkToken('get') or jexit(Text::_('COM_COMMUNITY_INVALID_TOKEN'));

                $appsLib = CAppPlugins::getInstance();
                $saveSuccess = $appsLib->triggerEvent('onFormSave', array('jsform-groups-search'));

                if (empty($saveSuccess) || !in_array(false, $saveSuccess)) {
                    $posted = true;

                    $groups = $model->getAllGroups($catId, null, $search);
                    $pagination = $model->getPagination();
                    $count = count($groups);
                }
            }

            // Get the template for the group lists
            $groupsHTML = $this->_getGroupsHTML($groups, $pagination);

            $app = CAppPlugins::getInstance();
            $appFields = $app->triggerEvent('onFormDisplay', array('jsform-groups-search'));
            $beforeFormDisplay = CFormElement::renderElements($appFields, 'before');
            $afterFormDisplay = CFormElement::renderElements($appFields, 'after');

            $searchLinks = parent::getAppSearchLinks('groups');

            $tmpl = new CTemplate();
            echo $tmpl->set('beforeFormDisplay', $beforeFormDisplay)
                    ->set('afterFormDisplay', $afterFormDisplay)
                    ->set('posted', $posted)
                    ->set('groupsCount', $count)
                    ->set('groupsHTML', $groupsHTML)
                    ->set('search', $search)
                    ->set('categories', $categories)
                    ->set('catId', $catId)
                    ->set('searchLinks', $searchLinks)
                    ->set('submenu', $this->showSubmenu(false))
                    ->fetch('groups.search');
        }

        /**
         * Method to display add new bulletin form
         *
         * @param	$title	The title of the bulletin if the adding failed
         * @param	$message	The message of the bulletin if adding failed
         * */
        public function addNews($bulletin) {
            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::_('COM_COMMUNITY_GROUPS_ADD_BULLETIN'));

            $jinput = Factory::getApplication()->input;
            $this->showSubmenu();

            $config = CFactory::getConfig();
            $groupId = $jinput->get('groupid');

            $group = Table::getInstance('Group', 'CTable');
            $group->load($groupId);

            // @rule: Test if the group is unpublished, don't display it at all.
            if (!$group->published) {
                $this->_redirectUnpublishGroup();
                return;
            }

            // Add pathways
            $this->_addGroupInPathway($groupId);
            $this->addPathway(Text::_('COM_COMMUNITY_GROUPS_BULLETIN_CREATE'));

            $editor = new CEditor($config->get('htmleditor', 'none'));
            $title = ( $bulletin ) ? $bulletin->title : '';
            $message = ( $bulletin ) ? $bulletin->message : '';
            $params = $group->getParams();

            $tmpl = new CTemplate();
            echo $tmpl->set('config', $config)
                    ->set('title', $title)
                    ->set('message', $message)
                    ->set('groupid', $groupId)
                    ->set('editor', $editor)
                    ->set('params', $params)
                    ->fetch('groups.addnews');
        }

        public function _getGroupsHTML($tmpGroups, $tmpPagination = NULL) {
            $config = CFactory::getConfig();
            $tmpl = new CTemplate();
            $featured = new CFeatured(FEATURED_GROUPS);
            $featuredList = $featured->getItemIds();

            $groups = array();

            if ($tmpGroups) {
                foreach ($tmpGroups as $row) {
                    $group = Table::getInstance('Group', 'CTable');
                    $group->bind($row);
                    $group->updateStats(); //ensure that stats are up-to-date
                    $group->description = CStringHelper::clean(HTMLHelper::_('string.truncate', $group->description, $config->get('tips_desc_length')));
                    $groups[] = $group;
                }
                unset($tmpGroups);
            }

            $groupsHTML = $tmpl->set('showFeatured', $config->get('show_featured'))
                    ->set('featuredList', $featuredList)
                    ->set('isCommunityAdmin', COwnerHelper::isCommunityAdmin())
                    ->set('groups', $groups)
                    ->set('pagination', $tmpPagination)
                    ->fetch('groups/list');
            unset($tmpl);

            return $groupsHTML;
        }

        /**
         * Return the video list for viewGroup display
         */
        protected function _getVideos($params, $groupId) {
            $result = array();
            $videoModel = CFactory::getModel('videos');
            $tmpVideos = $videoModel->getGroupVideos($groupId, '', $params->get('grouprecentvideos', GROUP_VIDEO_RECENT_LIMIT));
            $videos = array();

            if ($tmpVideos) {
                foreach ($tmpVideos as $videoEntry) {
                    $video = Table::getInstance('Video', 'CTable');
                    $video->bind($videoEntry);
                    $videos[] = $video;
                }
            }

            $totalVideos = $videoModel->total ? $videoModel->total : 0;
            $result['total'] = $totalVideos;
            $result['data'] = $videos;
            return $result;
        }

        /**
         * Return the poll list for viewGroup display
         */
        protected function _getPolls($params, $groupId) {
            $result = array();
            $pollModel = CFactory::getModel('polls');
            $tmpPolls = $pollModel->getAllPolls(null, null, null, null, false, true, $groupId);
            
            $polls = array();
            $totalPolls = 0; 

            if ($tmpPolls) {
                foreach ($tmpPolls as $pollEntry) {
                    $poll = Table::getInstance('Poll', 'CTable');
                    $poll->bind($pollEntry);
                    $polls[] = $poll;

                    $totalPolls++;
                }
            }

            $result['total'] = $totalPolls;
            $result['data'] = $polls;
            return $result;
        }

        /**
         * Return the albu list for viewGroup display
         */
        protected function _getAlbums($params, $groupId, $ignoreRecentPhotos = false) {
            $result = array();

            $photosModel = CFactory::getModel('photos');

            if(!$ignoreRecentPhotos){
                $albums = $photosModel->getGroupAlbums($groupId, true, false, $params->get('grouprecentphotos', GROUP_PHOTO_RECENT_LIMIT), false, '', array('group.avatar', 'group.Cover'));
            }else{
                $albums = $photosModel->getGroupAlbums($groupId, false, false);
            }

            $db = Factory::getDBO();
            $where = 'WHERE a.' . $db->quoteName('groupid') . ' = ' . $db->quote($groupId);
            $where .= ' AND a.' . $db->quoteName('type') . ' != ' . $db->quote('group.avatar');
            $where .= ' AND a.' . $db->quoteName('type') . ' != ' . $db->quote('group.Cover');

            $totalAlbums = $photosModel->getAlbumCount($where);

            $result['total'] = $totalAlbums;
            $result['data'] = $albums;

            return $result;
        }

        /**
         * Return the an array of HTML part of bulletings in viewGroups
         * and the total number of bulletin
         */
        protected function _getDiscussionListHTML($params, $groupId) {
            $result = array();

            $discussModel = CFactory::getModel('discussions');

            $discussions = $discussModel->getDiscussionTopics($groupId, '10', 0);
            $totalDiscussion = $discussModel->total;

            // Attach avatar of the member to the discussions
            for ($i = 0; $i < count($discussions); $i++) {
                $row = $discussions[$i];
                $row->user = CFactory::getUser($row->creator);

                // Get last replier for the discussion
                $row->lastreplier = $discussModel->getLastReplier($row->id);
                if ($row->lastreplier) {
                    $row->lastreplier->post_by = CFactory::getUser($row->lastreplier->post_by);
                }

                if ($row->lastmessageby) {
                    $row->lastreplyuser = CFactory::getUser($row->lastmessageby);
                }

                if ($row->user->block) {
                    $row->title = Text::_('COM_COMMUNITY_CENSORED');
                }

                if (isset($row->lastreplyuser->block)  && $row->lastreplyuser->block == 1) {
                    $row->lastmessage = Text::_('COM_COMMUNITY_CENSORED');
                }
            }

            // Process discussions HTML output
            $tmpl = new CTemplate();
            $my = CFactory::getUser();
            $discussionsHTML = $tmpl->set('discussions', $discussions)
                    ->set('groupId', $groupId)
                    ->set('canCreate', $my->authorise('community.create', 'groups.discussions.' . $groupId))
                    ->fetch('groups.discussionlist');
            unset($tmpl);

            $result['HTML'] = $discussionsHTML;
            $result['total'] = $totalDiscussion;
            $result['data'] = $discussions;

            return $result;
        }

        /**
         * Return the an array of HTML part of bulletings in viewGroups
         * and the total number of bulletin
         */
        protected function _getBulletinListHTML($groupId) {

            $result = array();

            $bulletinModel = CFactory::getModel('bulletins');
            $bulletins = $bulletinModel->getBulletins($groupId);
            $totalBulletin = $bulletinModel->total;


            // Get the creator of the discussions
            for ($i = 0; $i < count($bulletins); $i++) {
                $row = $bulletins[$i];

                $row->creator = CFactory::getUser($row->created_by);
            }

            // Only trigger the bulletins if there is really a need to.
            if (!empty($bulletins)) {
                $appsLib = CAppPlugins::getInstance();
                $appsLib->loadApplications();

                // Format the bulletins
                // the bulletins need to be an array or reference to work around
                // PHP 5.3 pass by value
                $args = array();
                foreach ($bulletins as &$b) {
                    $args[] = $b;
                }
                $appsLib->triggerEvent('onBulletinDisplay', $args);
            }

            // Process bulletins HTML output
            $tmpl = new CTemplate();
            $bulletinsHTML = $tmpl->set('bulletins', $bulletins)
                    ->set('groupId', $groupId)
                    ->fetch('groups.bulletinlist');
            unset($tmpl);

            $result['HTML'] = $bulletinsHTML;
            $result['total'] = $totalBulletin;
            $result['data'] = $bulletins;

            return $result;
        }

        private function _getPendingListHTML($userId) {
            $model = CFactory::getModel('groups');
            $rows = $model->getGroupInvites($userId);
            $groups = array();

            if ($rows) {
                foreach ($rows as $row) {
                    $table = Table::getInstance('Group', 'CTable');
                    $table->load($row->groupid);

                    $groups[] = $table;
                }
            }
            if (count($rows) > 0) {

                $tmpl = new CTemplate();
                return $tmpl->set('groups', $groups)
                                ->fetch('groups.pendinginvitelist');
            } else {
                return '';
            }
        }

        /**
         * List all the category including the children and format it
         */
        public function getFullGroupsCategories($id = 0, $level = 0, $categoryList = array()){
            $model = CFactory::getModel('groups');
            $mainCategories = $model->getCategories($id);

            if(count($mainCategories) > 0){
                foreach($mainCategories as $category){
                    $prefix = '';
                    for($i = 0; $i < $level; $i++){
                        $prefix = $prefix.'-'; // this will add the - in front of the category name
                    }

                    $category->name = $prefix.' '.Text::_($category->name);
                    $categoryList[] = $category;
                    $categoryList = $this->getFullGroupsCategories($category->id, $level+1, $categoryList);
                }
            }

            return $categoryList;
        }

    }

}
