<?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\Filter\InputFilter;
use Joomla\CMS\Language\Text;

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();

class CommunityNotificationController extends CommunityBaseController
{

    public function ajaxGetNotification()
    {
        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $json = array();

        $my = CFactory::getUser();

        //$inboxModel       = CFactory::getModel( 'inbox' );
        $friendModel    = CFactory::getModel( 'friends' );
        $eventModel     = CFactory::getModel( 'events' );
        $groupModel     = CFactory::getModel( 'groups' );
        $pageModel     = CFactory::getModel( 'pages' );

        $notiTotal          = 0;

        //getting pending event request
        $pendingEvents   = $eventModel->getPending($my->id);
        $eventHtml      = '';
        $event          = JTable::getInstance( 'Event' , 'CTable' );

        if(!empty($pendingEvents))
        {   
            foreach ($pendingEvents as $key => $pendingEvent) {
                $row = $pendingEvent;
                $row->invitor = CFactory::getUser($row->invited_by);
                $event->load( $row->eventid );

                // remove the notification if there is no longer seats available
                if(!CEventHelper::seatsAvailable($event)){
                    unset($pendingEvents[$key]);
                    continue;
                }

                $row->eventAvatar = $event->getThumbAvatar();
                $row->url = CRoute::_('index.php?option=com_community&view=events&task=viewevent&eventid=' . $row->eventid. false);
                $row->isGroupEvent = ($event->type == 'group') ? true : false ;
                $row->isPageEvent = ($event->type == 'page') ? true : false ;
                
                if($row->isGroupEvent){
                    $group = JTable::getInstance('Group', 'CTable');
                    $group->load($event->contentid);
                    $row->groupname = $group->name;
                    $row->grouplink = CUrlHelper::groupLink($group->id);
                }

                if($row->isPageEvent){
                    $page = JTable::getInstance('Page', 'CTable');
                    $page->load($event->contentid);
                    $row->pagename = $page->name;
                    $row->pagelink = CUrlHelper::pageLink($page->id);
                }
            }

            $notiTotal += count($pendingEvents);

            $tmpl = new CTemplate();
            $tmpl->set( 'rows'  , $pendingEvents );
            $tmpl->setRef( 'my' , $my );
            $eventHtml = $tmpl->fetch( 'notification.event.invitations' );
        }
        
        //getting pending page request
        $pendingPage   = $pageModel->getPageInvites($my->id);
        $pageHtml      = '';
        $page          = JTable::getInstance( 'Page' , 'CTable' );
        $pageNotiTotal =0;

        if(!empty($pendingPage))
        {
            $pageNotiTotal     +=count($pendingPage);

            for($i=0; $i< count($pendingPage); $i++)
            {
                $gRow               =   $pendingPage[$i];
                $gRow->invitor      =   CFactory::getUser($gRow->creator);
                $page->load( $gRow->pageid );
                $gRow->name         =   $page->name;
                $gRow->groupAvatar  =   $page->getThumbAvatar();
                $gRow->url          =   CRoute::_('index.php?option=com_community&view=pages&task=viewpage&pageid=' . $gRow->pageid . false);
            }

            $tmpl   = new CTemplate();

            $tmpl->set( 'gRows'     , $pendingPage );
            $tmpl->setRef( 'my' , $my );
            $pageHtml = $tmpl->fetch( 'notification.page.invitations' );
        }
        
        //geting pending private page join request
        //Find Users Pages Admin
        $allPages = $pageModel->getAdminPages( $my->id , COMMUNITY_PRIVATE_PAGE);
        $pageMemberApproveHTML = '';
        
        //Get unApproved member
        if(!empty($allPages))
        {
            foreach($allPages as $pages)
            {

                $member    =    $groupModel->getMembers( $pages->id , null, false );

                if(!empty($member))
                {

                    for($i=0; $i< count($member); $i++){

                        $oRow =  $member[$i];
                        $page->load($pages->id);
                        $oRow->pageId  = $pages->id;
                        $oRow->pageName = $pages->name;
                        $oRow->pageAvatar  =   $page->getThumbAvatar();
                        $oRow->url          =   CRoute::_('index.php?option=com_community&view=pages&task=viewpage&pageid=' . $page->id . false);
                        $members[]=$member[$i];
                    }
                }
            }
        }

        //getting pending group request
        $pendingGroup   = $groupModel->getGroupInvites($my->id);
        $groupHtml      = '';
        $group          = JTable::getInstance( 'Group' , 'CTable' );
        $groupNotiTotal =0;

        if(!empty($pendingGroup))
        {
            $groupNotiTotal     +=count($pendingGroup);

            for($i=0; $i< count($pendingGroup); $i++)
            {
                $gRow               =   $pendingGroup[$i];
                $gRow->invitor      =   CFactory::getUser($gRow->creator);
                $group->load( $gRow->groupid );
                $gRow->name         =   $group->name;
                $gRow->groupAvatar  =   $group->getThumbAvatar();
                $gRow->url          =   CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $gRow->groupid . false);
            }

            $tmpl   = new CTemplate();

            $tmpl->set( 'gRows'     , $pendingGroup );
            $tmpl->setRef( 'my' , $my );
            $groupHtml = $tmpl->fetch( 'notification.group.invitations' );
        }

        //geting pending private group join request
        //Find Users Groups Admin
        $allGroups = $groupModel->getAdminGroups( $my->id , COMMUNITY_PRIVATE_GROUP);
        $groupMemberApproveHTML = '';

        //Get unApproved member
        if(!empty($allGroups))
        {
            foreach($allGroups as $groups)
            {

                $member    =    $groupModel->getMembers( $groups->id , null, false );

                if(!empty($member))
                {

                    for($i=0; $i< count($member); $i++){

                        $oRow =  $member[$i];
                        $group->load($groups->id);
                        $oRow->groupId  = $groups->id;
                        $oRow->groupName = $groups->name;
                        $oRow->groupAvatar  =   $group->getThumbAvatar();
                        $oRow->url          =   CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id . false);
                        $members[]=$member[$i];
                    }
                }
            }
        }

        if(!empty($members))
        {
            $tmpl = new CTemplate();

            $tmpl->set( 'oRows' ,   $members );
            $tmpl->set( 'my'    ,   $my );
            $groupMemberApproveHTML = $tmpl->fetch('notification.group.request');
        }

        //non require action notification

        $itemHtml = '';
        $notifCount = 10;
        $notificationModel  = CFactory::getModel( 'notification' );
        $myParams           =   $my->getParams();

        $notifications = $notificationModel->getNotification($my->id,'0',$notifCount,$myParams->get('lastnotificationlist',''));
        if(!empty($notifications)){

            //there are some notification that cannot be skipped even if the actor is 0
            $systemNotifications = array(
                'notif_videos_convert_success'
            );

            for($i=0; $i< count($notifications); $i++){
                $iRow               =   $notifications[$i];
                $iRow->actorUser    =   CFactory::getUser($iRow->actor);
                $iRow->actorAvatar  =   $iRow->actorUser->getThumbAvatar();
                $iRow->actorName    =   $iRow->actorUser->getDisplayName();
                $iRow->timeDiff     =   CTimeHelper::timeLapse(CTimeHelper::getDate($iRow->created));
                $iRow->contentHtml  =   CContentHelper::injectTags($iRow->content,$iRow->params,true);
                $params = new CParameter( $iRow->params );
                $iRow->url          =   $params->get('url','');

                if(in_array($notifications[$i],$systemNotifications)){
                    $iRow->systemMessage = true; // this is to prevent the message to be skipped in notification item
                }
            }
            $tmpl   = new CTemplate();
            $tmpl->set( 'iRows'     , $notifications );
            $tmpl->setRef( 'my' , $my );
            $itemHtml = $tmpl->fetch( 'notification.item' );
        }

        $notiHtml = $pageHtml . $eventHtml . $groupHtml . $groupMemberApproveHTML . $itemHtml;

        if (empty($notiHtml)) {
            $notiHtml .= '<li>';
            $notiHtml .= Text::_('COM_COMMUNITY_NO_NOTIFICATION');
            $notiHtml .= '</li>';
        }

        $date = JDate::getInstance();
        $myParams->set('lastnotificationlist', $date->toSql());
        $my->save('params');

        $url = CRoute::_('index.php?option=com_community&view=profile&task=notifications');
        $notiHtml .= '<div>';
        $notiHtml .= '<a href="' . $url . '" class="joms-button--neutral joms-button--full">' . Text::_('COM_COMMUNITY_VIEW_ALL') . '</a>';
        $notiHtml .= '</div>';

        $json['title'] = Text::_('COM_COMMUNITY_NOTIFICATIONS');
        $json['html'] = $notiHtml;

        die( json_encode($json) );
    }

    private function _getTimeDiffString($created,$daydiff=''){

        $timeDiff = '';
        if($daydiff== 0)
        {
            $date           = CTimeHelper::getDate($created);
            $timeDiff           = CTimeHelper::timeLapse($date);

        }
        else if($daydiff == 1)
        {
            $timeDiff = Text::_('COM_COMMUNITY_ACTIVITIES_YESTERDAY');
        }
        else if($daydiff< 7)
        {
            $timeDiff = Text::sprintf('COM_COMMUNITY_ACTIVITIES_DAYS_AGO', $daydiff);
        }
        else if(($daydiff >= 7) && ($daydiff < 30))
        {
            $dayinterval = ACTIVITY_INTERVAL_WEEK;
            $timeDiff = (intval($daydiff/$dayinterval) == 1 ? Text::_('COM_COMMUNITY_ACTIVITIES_WEEK_AGO') : Text::sprintf('COM_COMMUNITY_ACTIVITIES_WEEK_AGO_MANY', intval($daydiff/$dayinterval)));
        }
        else if(($daydiff >= 30))
        {
            $dayinterval = ACTIVITY_INTERVAL_MONTH;
            $timeDiff = (intval($daydiff/$dayinterval) == 1 ? Text::_('COM_COMMUNITY_ACTIVITIES_MONTH_AGO') : Text::sprintf('COM_COMMUNITY_ACTIVITIES_MONTH_AGO_MANY', intval($daydiff/$dayinterval)));
        }
        return $timeDiff;
    }
    /**
     * Ajax function to reject a friend request
     **/
    public function ajaxRejectRequest( $requestId )
    {
        $filter = InputFilter::getInstance();
        $requestId = $filter->clean($requestId, 'int');

        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $objResponse    = new JAXResponse();
        $my             = CFactory::getUser();
        $friendsModel   = CFactory::getModel('friends');

        if( $friendsModel->isMyRequest( $requestId , $my->id) )
        {
            $pendingInfo = $friendsModel->getPendingUserId($requestId);

            if( $friendsModel->rejectRequest( $requestId ) )
            {
                //add user points - friends.request.reject removed @ 20090313

                $objResponse->addScriptCall( 'joms.jQuery("#msg-pending-' . $requestId . '").html("'.Text::_('COM_COMMUNITY_FRIENDS_REQUEST_REJECTED').'");');
                $objResponse->addScriptCall( 'joms.jQuery("#noti-pending-' . $requestId . '").fadeOut(1000, function() { joms.jQuery("#noti-pending-' . $requestId . '").remove();} );');

                $objResponse->addScriptCall('update_counter("#jsMenuNotif > .notifcount", -1);');
                $objResponse->addScriptCall('update_counter("#jsMenuFriend > .notifcount", -1);');

                //trigger for onFriendReject
                require_once(JPATH_ROOT .'/components/com_community/controllers/friends.php');
                $eventObject = new stdClass();
                $eventObject->profileOwnerId    = $my->id;
                $eventObject->friendId          = $pendingInfo->connect_from;
                CommunityFriendsController::triggerFriendEvents( 'onFriendReject' , $eventObject);
                unset($eventObject);
            }
            else
            {
                $objResponse->addScriptCall( 'joms.jQuery("#error-pending-' . $requestId . '").html("' . Text::sprintf('COM_COMMUNITY_FRIEND_REQUEST_REJECT_FAILED', $requestId ) . '");' );
                $objResponse->addScriptCall( 'joms.jQuery("#error-pending-' . $requestId . '").attr("class", "error");');
            }

        }
        else
        {
            $objResponse->addScriptCall( 'joms.jQuery("#error-pending-' . $requestId . '").html("' . Text::_('COM_COMMUNITY_FRIENDS_NOT_YOUR_REQUEST') . '");' );
            $objResponse->addScriptCall( 'joms.jQuery("#error-pending-' . $requestId . '").attr("class", "error");');
        }

        return $objResponse->sendResponse();
    }

    /**
     * Ajax function to approve a friend request
     **/
    public function ajaxApproveRequest( $requestId )
    {
        $filter = InputFilter::getInstance();
        $requestId = $filter->clean($requestId, 'int');

        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $objResponse    = new JAXResponse();
        $my             = CFactory::getUser();
        $friendsModel   = CFactory::getModel( 'friends' );

        if( $friendsModel->isMyRequest( $requestId , $my->id) )
        {
            $connected      = $friendsModel->approveRequest( $requestId );

            if( $connected )
            {
                $act            = new stdClass();
                $act->cmd       = 'friends.request.approve';
                $act->actor     = $connected[0];
                $act->target    = $connected[1];
                $act->title     = '';//Text::_('COM_COMMUNITY_ACTIVITY_FRIENDS_NOW');
                $act->content   = '';
                $act->app       = 'friends.connect';
                $act->cid       = 0;

                $friendId       = ( $connected[0] == $my->id ) ? $connected[1] : $connected[0];
                $friend         = CFactory::getUser( $friendId );

                //generate the activity if enabled
                $userPointModel = CFactory::getModel('Userpoints');
                $point = $userPointModel->getPointData('friends.request.approve');
                if($point->published){
                    CActivityStream::add($act);
                    //add user points - give points to both party
                    //CFactory::load( 'libraries' , 'userpoints' );
                    CUserPoints::assignPoint('friends.request.approve');
                    CUserPoints::assignPoint('friends.request.approve', $friendId);
                }

                // Add the friend count for the current user and the connected user
                $friendsModel->addFriendCount( $connected[0] );
                $friendsModel->addFriendCount( $connected[1] );

                // Add notification
                //CFactory::load( 'libraries' , 'notification' );

                $params         = new CParameter( '' );
                $params->set( 'url' , 'index.php?option=com_community&view=profile&userid='.$my->id );
                $params->set( 'friend' , $my->getDisplayName() );
                $params->set( 'friend_url' , 'index.php?option=com_community&view=profile&userid='.$my->id );

                CNotificationLibrary::add( 'friends_create_connection' , $my->id , $friend->id , Text::sprintf('COM_COMMUNITY_FRIEND_REQUEST_APPROVED' ) , '' , 'friends.approve' , $params );

                $objResponse->addScriptCall( 'joms.jQuery("#msg-pending-' . $requestId . '").html("'.addslashes(Text::sprintf('COM_COMMUNITY_FRIENDS_NOW', $friend->getDisplayName())).'");');
                $objResponse->addScriptCall( 'joms.jQuery("#noti-pending-' . $requestId . '").fadeOut(1000, function() { joms.jQuery("#noti-pending-' . $requestId . '").remove();} );');

                $objResponse->addScriptCall('update_counter("#jsMenuNotif > .notifcount", -1);');
                $objResponse->addScriptCall('update_counter("#jsMenuFriend > .notifcount", -1);');

                //trigger for onFriendApprove
                require_once(JPATH_ROOT .'/components/com_community/controllers/friends.php');
                $eventObject = new stdClass();
                $eventObject->profileOwnerId    = $my->id;
                $eventObject->friendId          = $friendId;
                CommunityFriendsController::triggerFriendEvents( 'onFriendApprove' , $eventObject);
                unset($eventObject);
            }
        }
        else
        {
            $objResponse->addScriptCall( 'joms.jQuery("#error-pending-' . $requestId . '").html("' . Text::_('COM_COMMUNITY_FRIENDS_NOT_YOUR_REQUEST') . '");' );
            $objResponse->addScriptCall( 'joms.jQuery("#error-pending-' . $requestId . '").attr("class", "error");');
        }

        return $objResponse->sendResponse();
    }

    /**
     * Popup all friend request
     */
    public function ajaxGetRequest()
    {
        $objResponse    =   new JAXResponse();

        $my = CFactory::getUser();
        $friendModel = CFactory::getModel('friends');
        $rows = $friendModel->getPending($my->id);

        // format for template
        $data = array();
        $friendIdList = array();
        foreach( $rows as $row )
        {
            if(!in_array($row->id,$friendIdList)){
                $user               = CFactory::getUser($row->id);
                $obj                = new stdClass();
                $obj->user          = $user;
                $obj->msg           = $row->msg;
                $obj->connection_id = $row->connection_id;
                $data[]             = $obj;
            }

            $friendIdList[] = $row->id;
        }

        $template = new CTemplate();
        $html = $template
            ->set('rows', $data)
            ->fetch('notification/friend-request');

        $json = array(
            'title' => Text::_('COM_COMMUNITY_NOTI_NEW_FRIEND_REQUEST'),
            'html' => $html
        );

        die( json_encode($json) );
    }

    /**
     * @since 3.3
     * ajax response to dropdown box to see friend request
     */
    public function ajaxGetFriendRequest()
    {
        $my = CFactory::getUser();
        $friendModel = CFactory::getModel('friends');
        $rows = $friendModel->getPending($my->id);

        // format for response
        $data = array();
        $friendIdList = array();

        if (!$rows || count($rows) == 0) {
            die(json_encode(array('error' => true, 'message' => Text::_('COM_COMMUNITY_PENDING_APPROVAL_EMPTY'))));
        }

        foreach ($rows as $row) {
            if (!in_array($row->id, $friendIdList)) {
                $user = CFactory::getUser($row->id);
                $data[] = array(
                    'name' => $user->getDisplayName(),
                    'avatar' => $user->getThumbAvatar(),
                    'connection_id' => $row->connection_id,
                    'approve_lang' => Text::_('COM_COMMUNITY_PENDING_ACTION_APPROVE'),
                    'reject_lang' => Text::_('COM_COMMUNITY_FRIENDS_PENDING_ACTION_REJECT')
                );
            }
        }

        die(json_encode($data));
    }

    /**
     * Popup message notification
     */
    public function ajaxGetInbox()
    {
        $inboxModel = CFactory::getModel('inbox');
        //$messages = $inboxModel->getInbox(false);
        $messages = $inboxModel->getUnReadInbox();

        // format for template
        $data = array();

        foreach( $messages as $row )
        {
            $user         = CFactory::getUser($row->from);
            $obj          = new stdClass();
            $obj->user    = $user;
            $obj->subject = $row->subject;
            $obj->link    = CRoute::_('index.php?option=com_community&view=inbox&task=read&msgid=' . $row->parent);
            $obj->created = CTimeHelper::timeLapse(CTimeHelper::getDate($row->posted_on));
            $data[] = $obj;
        }

        $template = new CTemplate();
        $html = $template
            ->set('rows', $data)
            ->fetch('notification/inbox');

        $json = array(
            'title' => Text::_('COM_COMMUNITY_MESSAGE'),
            'html' => $html
        );

        die( json_encode($json) );
    }


    /**
     * Ajax function to join an event invitation
     *
     **/
    public function ajaxJoinInvitation( $invitationId, $eventId){
        $filter = InputFilter::getInstance();
        $invitationId = $filter->clean($invitationId, 'int');
        $eventId = $filter->clean($eventId, 'int');

        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $json = array();
        $my = CFactory::getUser();

        // Get events model
        $model  = CFactory::getModel('events');

        if( $model->isInvitedMe( $invitationId , $my->id) ){
            $event  = JTable::getInstance( 'Event' , 'CTable' );
            $event->load( $eventId );

            $this->_updateInviteStatus($invitationId, $eventId, COMMUNITY_EVENT_STATUS_ATTEND);

            // Activity stream purpose
            $act = new stdClass();
            $act->cmd       = 'event.join';
            $act->actor     = $my->id;
            $act->target    = 0;
            $act->title     = '';//Text::sprintf('COM_COMMUNITY_ACTIVITIES_EVENT_ATTEND' , $event->title);
            $act->content   = '';
            $act->app       = 'events';
            $act->cid       = $event->id;

            $params         = new CParameter('');
            $action_str     = 'event.join';
            $params->set( 'eventid' , $event->id);
            $params->set( 'action', $action_str );
            $params->set( 'event_url', 'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id);

            // Add activity logging.
            CActivityStream::addActor( $act, $params->toString() );

            $url = CRoute::_('index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id);

            $json['success'] = true;
            $json['message'] = Text::sprintf('COM_COMMUNITY_EVENTS_ACCEPTED', $event->title, $url);

        } else {
            $json['error'] = Text::_('COM_COMMUNITY_EVENTS_NOT_INVITED_NOTIFICATION');
        }

        die( json_encode($json) );
    }


    /**
     * Ajax function to reject an event invitation
     *
     **/
    public function ajaxRejectInvitation( $invitationId, $eventId){
        $filter = InputFilter::getInstance();
        $invitationId = $filter->clean($invitationId, 'int');
        $eventId = $filter->clean($eventId, 'int');

        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $json = array();
        $my = CFactory::getUser();

        // Get events model
        $model  = CFactory::getModel('events');

        if( $model->isInvitedMe( $invitationId , $my->id) ){
            $event  = JTable::getInstance( 'Event' , 'CTable' );
            $event->load( $eventId );

            $this->_updateInviteStatus($invitationId, $eventId, COMMUNITY_EVENT_STATUS_WONTATTEND);

            $url = CRoute::_('index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id);

            $json['success'] = true;
            $json['message'] = Text::sprintf('COM_COMMUNITY_EVENTS_REJECTED', $event->title, $url);

        } else {
            $json['error'] = Text::_('COM_COMMUNITY_EVENTS_NOT_INVITED_NOTIFICATION');
        }

        die( json_encode($json) );
    }

    /**
     * Update invitation status
     */
    private function _updateInviteStatus($inviteId, $eventId, $status)
    {
        $my             =   CFactory::getUser();
        $event  = JTable::getInstance( 'Event' , 'CTable' );
        $event->load( $eventId );

        $guest  = JTable::getInstance( 'EventMembers' , 'CTable' );
        $key['eventId'] = $eventId;
        $key['memberId'] = $my->id;
        $guest->load($key);

        // Set status to
        $guest->status = $status;
        $guest->store();

        // Update event stats count
        $event->updateGuestStats();
        $event->store();
    }


    /**
     * Ajax function to join an group invitation
     *
     **/
    public function ajaxGroupJoinInvitation( $groupId )
    {
        $filter     = InputFilter::getInstance();
        $groupId    = $filter->clean( $groupId, 'int');

        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $json = array();
        $my = CFactory::getUser();

        // Get groups table
        $table      = JTable::getInstance( 'GroupInvite' , 'CTable' );
        $keys = array('groupid'=>$groupId, 'userid'=>$my->id);
        $table->load($keys);

        if( $table->isOwner() ){
            $group      = JTable::getInstance( 'Group' , 'CTable' );
            $member     = JTable::getInstance( 'GroupMembers' , 'CTable' );

            $group->load( $groupId );
            $params     = $group->getParams();

            // Set the properties for the members table
            $member->groupid    = $group->id;
            $member->memberid   = $my->id;

            // @rule: If approvals is required, set the approved status accordingly.
            $member->approved   = ( $group->approvals == COMMUNITY_PRIVATE_GROUP ) ? '0' : 1;

            // @rule: Special users should be able to join the group regardless if it requires approval or not
            $member->approved   = COwnerHelper::isCommunityAdmin() ? 1 : $member->approved;

            $groupModel     = CFactory::getModel( 'groups' );

            // @rule: If the Invitation is sent by group admin, do not need futher approval
            if($groupModel->isAdmin($table->creator,$groupId)){
                $member->approved = 1;
            }

            //@todo: need to set the privileges
            $member->permissions    = '0';

            $member->store();

            //trigger for onGroupJoin
            $this->triggerEvents('onGroupJoin' , $group , $my->id);

                        // Update user group list
                        $my->updateGroupList();

            // Test if member is approved, then we add logging to the activities.
            if( $member->approved )
            {
                // remove the notication count
                $table  = JTable::getInstance( 'GroupInvite' , 'CTable' );
                $keys = array('groupid'=>$groupId, 'userid'=>$my->id);
                $table->load( $keys);
                $table->delete();

                CGroups::joinApproved($groupId, $my->id);

                $url    =   CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id);

                $json['success'] = true;
                $json['message'] = Text::sprintf('COM_COMMUNITY_GROUPS_ACCEPTED_INVIT', $group->name, $url);
            }

        } else {
            $json['error'] = Text::_('COM_COMMUNITY_GROUPS_NOT_INVITED_NOTIFICATION');
        }

        die( json_encode($json) );
    }

        /**
     * Ajax function to reject an event invitation
     *
     **/
    public function ajaxGroupRejectInvitation( $groupId ){
        $filter = InputFilter::getInstance();
        $groupId = $filter->clean($groupId, 'int');

        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $json  = array();
        $my    = CFactory::getUser();
        $table = JTable::getInstance( 'GroupInvite' , 'CTable' );
        $keys  = array('groupid'=>$groupId, 'userid'=>$my->id);
        $table->load( $keys);

        if ( $table->isOwner() ) {
            if ( $table->delete() ) {
                $group = JTable::getInstance( 'Group' , 'CTable' );
                $group->load( $table->groupid );

                $url = CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id );

                $json['success'] = true;
                $json['message'] = Text::sprintf('COM_COMMUNITY_GROUPS_REJECTED_INVIT', $group->name, $url);
            }

        } else {
            // when the user is the owner group we need avoid the invitation
            $table->delete();
            $json['error'] = Text::_('COM_COMMUNITY_GROUPS_NOT_INVITED_NOTIFICATION');
        }

        die( json_encode($json) );
    }
    
    public function ajaxPageJoinInvitation( $pageId )
    {
        $filter     = InputFilter::getInstance();
        $pageId    = $filter->clean( $pageId, 'int');

        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $json = array();
        $my = CFactory::getUser();

        // Get pages table
        $table      = JTable::getInstance( 'PageInvite' , 'CTable' );
        $keys = array('pageid'=>$pageId, 'userid'=>$my->id);
        $table->load($keys);

        if( $table->isOwner() ){
            $page      = JTable::getInstance( 'Page' , 'CTable' );
            $member     = JTable::getInstance( 'PageMembers' , 'CTable' );

            $page->load( $pageId );
            $params     = $page->getParams();

            // Set the properties for the members table
            $member->pageid    = $page->id;
            $member->memberid   = $my->id;

            // @rule: If approvals is required, set the approved status accordingly.
            $member->approved   = ( $page->approvals == COMMUNITY_PRIVATE_PAGE ) ? '0' : 1;

            // @rule: Special users should be able to join the page regardless if it requires approval or not
            $member->approved   = COwnerHelper::isCommunityAdmin() ? 1 : $member->approved;

            $pageModel     = CFactory::getModel( 'pages' );

            // @rule: If the Invitation is sent by page admin, do not need futher approval
            if($pageModel->isAdmin($table->creator,$pageId)){
                $member->approved = 1;
            }

            //@todo: need to set the privileges
            $member->permissions    = '0';

            $member->store();

            //trigger for onPageJoin
            $this->triggerEvents('onPageJoin' , $page , $my->id);

            // Update user page list
            $my->updatePageList();

            // Test if member is approved, then we add logging to the activities.
            if( $member->approved )
            {
                // remove the notication count
                $table  = JTable::getInstance( 'PageInvite' , 'CTable' );
                $keys = array('pageid'=>$pageId, 'userid'=>$my->id);
                $table->load( $keys);
                $table->delete();

                CPages::joinApproved($pageId, $my->id);

                $url    =   CRoute::_('index.php?option=com_community&view=pages&task=viewpage&pageid=' . $page->id);

                $json['success'] = true;
                $json['message'] = Text::sprintf('COM_COMMUNITY_PAGES_ACCEPTED_INVIT', $page->name, $url);
            }

        } else {
            $json['error'] = Text::_('COM_COMMUNITY_PAGES_NOT_INVITED_NOTIFICATION');
        }

        die( json_encode($json) );
    }

        /**
     * Ajax function to reject an event invitation
     *
     **/
    public function ajaxPageRejectInvitation( $pageId ){
        $filter = InputFilter::getInstance();
        $pageId = $filter->clean($pageId, 'int');

        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $json  = array();
        $my    = CFactory::getUser();
        $table = JTable::getInstance( 'PageInvite' , 'CTable' );
        $keys  = array('pageid'=>$pageId, 'userid'=>$my->id);
        $table->load( $keys);

        if ( $table->isOwner() ) {
            if ( $table->delete() ) {
                $page = JTable::getInstance( 'Page' , 'CTable' );
                $page->load( $table->pageid );

                $url = CRoute::_('index.php?option=com_community&view=pages&task=viewpage&pageid=' . $page->id );

                $json['success'] = true;
                $json['message'] = Text::sprintf('COM_COMMUNITY_PAGES_REJECTED_INVIT', $page->name, $url);
            }

        } else {
            // when the user is the owner page we need avoid the invitation
            $table->delete();
            $json['error'] = Text::_('COM_COMMUNITY_PAGES_NOT_INVITED_NOTIFICATION');
        }

        die( json_encode($json) );
    }
    
    public function triggerEvents( $eventName, &$args, $target = null)
    {
        CError::assert( $args , 'object', 'istype', __FILE__ , __LINE__ );

        require_once( COMMUNITY_COM_PATH.'/libraries/apps.php' );
        $appsLib    = CAppPlugins::getInstance();
        $appsLib->loadApplications();

        $params     = array();
        $params[]   = $args;

        if(!is_null($target))
            $params[]   = $target;

        $appsLib->triggerEvent( $eventName , $params);
        return true;
    }
        /**
     * Ajax function to accept Private Group Request
     *
     **/
    public function ajaxGroupJoinRequest($memberId, $groupId)
    {

        $filter = InputFilter::getInstance();
        $groupId = $filter->clean($groupId, 'int');
        $memberId = $filter->clean($memberId, 'int');

        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $objResponse = new JAXResponse();
        $my = CFactory::getUser();
        $model = $this->getModel('groups');

        //CFactory::load( 'helpers' , 'owner' );

        if (!$model->isAdmin($my->id, $groupId) && !COwnerHelper::isCommunityAdmin()) {
            $objResponse->addScriptCall(Text::_('COM_COMMUNITY_NOT_ALLOWED_TO_ACCESS_SECTION'));
        } else {
            //Load Necessary Table
            $member = JTable::getInstance('GroupMembers', 'CTable');
            $group = JTable::getInstance('Group', 'CTable');

            // Load the group and the members table
            $group->load($groupId);
            $keys = array('groupId' => $groupId, 'memberId' => $memberId);
            $member->load($keys);

            // Only approve members that is really not approved yet.
            if ($member->approved) {
                $objResponse->addScriptCall(
                    'joms.jQuery(".error-request-' . $group->id . '").html("' . Text::_(
                        'COM_COMMUNITY_EVENTS_NOT_INVITED_NOTIFICATION'
                    ) . '");'
                );
                $objResponse->addScriptCall('joms.jQuery(".error-request-' . $group->id . '").attr("class", "error");');
            } else {
                $member->approve();

                $user = CFactory::getUser($memberId);
                $user->updateGroupList(true);


                // Add notification
                //CFactory::load( 'libraries' , 'notification' );

                $params = new CParameter('');
                $params->set(
                    'url',
                    CRoute::getExternalURL(
                        'index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id
                    )
                );
                $params->set('group', $group->name);
                $params->set(
                    'group_url',
                    'index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id
                );

                CNotificationLibrary::add(
                    'groups_member_approved',
                    $group->ownerid,
                    $user->id,
                    Text::sprintf('COM_COMMUNITY_GROUP_MEMBER_APPROVED_EMAIL_SUBJECT'),
                    '',
                    'groups.memberapproved',
                    $params
                );

                $act = new stdClass();
                $act->cmd = 'group.join';
                $act->actor = $memberId;
                $act->target = 0;
                $act->title = ''; //Text::sprintf('COM_COMMUNITY_GROUPS_ACTIVITIES_MEMBER_JOIN_GROUP' , '{group_url}' , $group->name );
                $act->content = '';
                $act->app = 'groups.join';
                $act->cid = $group->id;

                $params = new CParameter('');
                $params->set('action', 'group.join');
                $params->set(
                    'group_url',
                    'index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id
                );

                // Add activity logging
                if(CUserPoints::assignPoint('group.join', $memberId)){
                    CActivityStream::addActor($act, $params->toString() );
                }

                //trigger for onGroupJoinApproved
                $this->triggerEvents('onGroupJoinApproved', $group, $memberId);
                $this->triggerEvents('onGroupJoin', $group, $memberId);

                // UPdate group stats();
                $group->updateStats();
                $group->store();

                $url = CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id);

                $objResponse->addScriptCall(
                    'joms.jQuery(".msg-request-' . $memberId . '").html("' . addslashes(
                        Text::sprintf('COM_COMMUNITY_EVENTS_ACCEPTED', $group->name, $url)
                    ) . '");'
                );
                $objResponse->addScriptCall('joms.fn.notification.updateCounter("general", '.$memberId.', -1);');
                $objResponse->addScriptCall(
                    'joms.jQuery(".noti-request-group-' . $memberId . '").fadeOut(1000, function() { joms.jQuery(".noti-request-group-' . $memberId . '").remove();} );'
                );
                $objResponse->addScriptCall(
                    'aspan = joms.jQuery(".cMenu-Icon b"); aspan.html(parseInt(aspan.html())-1);'
                );
            }

        }
        return $objResponse->sendResponse();
    }
        /**
     * Ajax function to decline Private Group Request
     *
     **/
    public function ajaxGroupRejectRequest( $memberId , $groupId )
        {

                $filter = InputFilter::getInstance();
                $groupId = $filter->clean($groupId, 'int');
                $memberId = $filter->clean($memberId, 'int');

        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $objResponse    =   new JAXResponse();
        $my     =   CFactory::getUser();
                $model      =       $this->getModel( 'groups' );
                $group      = JTable::getInstance( 'Group' , 'CTable' );
        $group->load( $groupId );
                //CFactory::load( 'helpers' , 'owner' );

                if( !$group->isAdmin( $my->id , $groupId ) && !COwnerHelper::isCommunityAdmin() )
        {
            $objResponse->addScriptCall( Text::_('COM_COMMUNITY_NOT_ALLOWED_TO_ACCESS_SECTION') );
        }
                else
                {
                    //Load Necessary Table
                    $groupMember    = JTable::getInstance( 'GroupMembers' , 'CTable' );

                    $data       = new stdClass();

                    $data->groupid  = $groupId;
                    $data->memberid = $memberId;

                    $model->removeMember($data);

                    //add user points
                    //CFactory::load( 'libraries' , 'userpoints' );
                    CUserPoints::assignPoint('group.member.remove', $memberId);

                    //trigger for onGroupLeave
                    $this->triggerEvents( 'onGroupLeave' , $group , $memberId);

                    $group->updateStats();
                    $group->store();

                    $url    =   CRoute::_('index.php?option=com_community&view=groups&task=viewgroup&groupid=' . $group->id);

                    $objResponse->addScriptCall( 'joms.jQuery(".msg-request-' . $memberId  . '").html("'.addslashes(Text::sprintf('COM_COMMUNITY_EVENTS_REJECTED', $group->name , $url )).'");');
                    $objResponse->addScriptCall('joms.fn.notification.updateCounter("general", '.$memberId.', -1);');
                    $objResponse->addScriptCall( 'joms.jQuery(".noti-request-group-' . $memberId  . '").fadeOut(1000, function() { joms.jQuery(".noti-request-group-' . $memberId . '").remove();} );');
                    $objResponse->addScriptCall( 'aspan = joms.jQuery("#jsMenu .jsMenuIcon span"); aspan.html(parseInt(aspan.html())-1);');
                }
               return $objResponse->sendResponse();
    }
}
