<?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\Application\ApplicationHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Table\Table;
use Joomla\CMS\Uri\Uri;
use Joomla\Filesystem\File;
use Joomla\Input\Input;

// no direct access
defined('_JEXEC') or die('Restricted access');

/**
 * Events Controller
 */
class CommunityEventsController extends CommunityBaseController
{

    protected $_disabledMessage = '';

    /**
     * Responsible to return necessary contents to the Invitation library
     * so that it can add the mails into the queue
     * */
    public function inviteUsers($cid, $users, $emails, $message)
    {
        $model = CFactory::getModel('Events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($cid);

        $my = CFactory::getUser();
        $mainframe = Factory::getApplication();
        $status = $event->getUserStatus($my->id);

        $isGroupEvent = false; 
        if ($event->type == 'group') {
            $isGroupEvent = true; 
        }

        $isPageEvent = false; 
        if ($event->type == 'page') {
            $isPageEvent = true; 
        }
        

        $invitedCount = 0;

        foreach ($users as $id) {
            // only invite non members
            if ($event->getMemberStatus($id) == COMMUNITY_EVENT_STATUS_INVITED) {
                $date = JDate::getInstance();
                $eventMember = Table::getInstance('EventMembers', 'CTable');
                $eventMember->eventid = $event->id;
                $eventMember->memberid = $id;
                $eventMember->status = COMMUNITY_EVENT_STATUS_INVITED;
                $eventMember->invited_by = $my->id;
                $eventMember->created = $date->toSql();

                $eventMember->store();
                $invitedCount++;
            }
        }

        //now update the invited count in event
        $event->invitedcount = $event->invitedcount + $invitedCount;
        $event->store();

        // Send notification to the invited user.

        $params = new CParameter('');
        $params->set(
            'url',
            CRoute::getExternalURL('index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id)
        );
        $params->set('event', $event->title);
        $params->set('event_url', 'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id);

        $htmlTemplate = new CTemplate();
        $htmlTemplate->set('eventTitle', $event->title);
        $htmlTemplate->set('message', $message);

        if ($isGroupEvent) {
            $htmlTemplate->set('eventDesc', $event->summary);
            $html = $htmlTemplate->fetch('email.events.group.invite.html');
        } else if ($isPageEvent) {
            $htmlTemplate->set('eventDesc', $event->summary);
            $html = $htmlTemplate->fetch('email.events.page.invite.html');
        } else {
            $html = $htmlTemplate->fetch('email.events.invite.html');
        }


        $textTemplate = new CTemplate();
        $textTemplate->set('eventTitle', $event->title);
        $textTemplate->set('message', $message);
        
        if ($isGroupEvent) {
            $textTemplate->set('eventDesc', $event->summary);
            $text = $textTemplate->fetch('email.events.group.invite.text');
        } else if ($isPageEvent) {
            $textTemplate->set('eventDesc', $event->summary);
            $text = $textTemplate->fetch('email.events.page.invite.text');
        } else {
            $text = $textTemplate->fetch('email.events.invite.text');
        }

        //title for the mail
        if ($isGroupEvent) {
            $group = Table::getInstance('group', 'CTable');
            $group->load($event->contentid);
            $params->set('groupname', $group->name);
            $titleStr = Text::sprintf('COM_COMMUNITY_EVENTS_GROUP_JOIN_INVITE', $event->title);
        } else if ($isPageEvent) {
            $page = Table::getInstance('page', 'CTable');
            $page->load($event->contentid);
            $params->set('pagename', $page->name);
            $titleStr = Text::sprintf('COM_COMMUNITY_EVENTS_PAGE_JOIN_INVITE', $event->title);
        } else {
            $titleStr = Text::sprintf('COM_COMMUNITY_EVENTS_JOIN_INVITE', $event->title);
        }

        $inviteMail = new CInvitationMail(
            'events_invite',
            $html,
            $text,
            $titleStr,
            $params
        );
        $allowed = array(
            COMMUNITY_EVENT_STATUS_INVITED,
            COMMUNITY_EVENT_STATUS_ATTEND,
            COMMUNITY_EVENT_STATUS_WONTATTEND,
            COMMUNITY_EVENT_STATUS_MAYBE
        );
        $accessAllowed = ((in_array($status, $allowed)) && $status != COMMUNITY_EVENT_STATUS_BLOCKED) ? true : false;
        $accessAllowed = COwnerHelper::isCommunityAdmin() ? true : $accessAllowed;

        //CFactory::load( 'helpers' , 'event' );

        if (!($accessAllowed && $event->allowinvite) && !$event->isAdmin($my->id)) {

            throw new Exception(Text::_('COM_COMMUNITY_ACCESS_FORBIDDEN'));
        }

        return $inviteMail;
    }

    public function __construct()
    {
        $this->_disabledMessage = Text::_('COM_COMMUNITY_EVENTS_DISABLED');
    }

    public function editEventsWall($wallId)
    {
        $wall = Table::getInstance('Wall', 'CTable');
        $wall->load($wallId);

        $event = Table::getInstance('Event', 'CTable');
        $event->load($wall->contentid);

        $my = CFactory::getUser();

        // @rule: We only allow editing of wall in 15 minutes
        $now = JDate::getInstance();
        $interval = CTimeHelper::timeIntervalDifference($wall->date, $now->toSql());
        $interval = abs($interval);

        if (($event->isCreator($my->id) || $event->isAdmin($my->id) || COwnerHelper::isCommunityAdmin() || $my->id == $wall->post_by)
        ) {
            return true;
        }
        return false;
    }

    /**
     * Full application view
     */
    public function app()
    {
        $view = $this->getView('events');

        echo $view->get('appFullView');
    }

    /*
     * Display nearby events
     * @param   $location	Current location get from Google Map API v3 OR user input
     *
     */

    public function ajaxDisplayNearbyEvents($location)
    {
        $response = new JAXResponse();

        $config = CFactory::getConfig();

        $filter = InputFilter::getInstance();
        $location = $filter->clean($location, 'string');

        $advance = array();
        $advance['radius'] = $config->get('event_nearby_radius');

        if ($config->get('eventradiusmeasure') == COMMUNITY_EVENT_UNIT_KM) { //find out if radius is in km or miles
            $advance['radius'] = $advance['radius'] * 0.621371192;
        }


        $advance['fromlocation'] = $location;

        $model = CFactory::getModel('events');
        $objs = $model->getEvents(null, null, null, null, null, null, null, $advance);

        $events = array();

        $tmpl = new CTemplate();

        if ($objs) {
            foreach ($objs as $row) {
                $event = Table::getInstance('Event', 'CTable');
                $event->bind($row);
                $events[] = $event;
            }
            unset($objs);
        }

        // Get list of nearby events
        $tmpl->set('events', $events);
        $tmpl->set('radius', $config->get('event_nearby_radius'));
        $tmpl->set('measurement', $config->get('eventradiusmeasure'));
        $tmpl->set('location', $location);
        $html = $tmpl->fetch('events.nearbylist');
        $response->addScriptCall('__callback', $html);

        return $response->sendResponse();
    }

    /**
     *  Ajax function to prompt warning during group deletion
     *
     * @param    $groupId    The specific group id to unpublish
     * */
    public function ajaxWarnEventDeletion($eventId)
    {
        $response = new JAXResponse();

        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventId, 'int');

        $title = Text::_('COM_COMMUNITY_EVENTS_DELETE');
        $content = Text::_('COM_COMMUNITY_EVENTS_DELETE_WARNING');

        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        $json = array(
            'title'     => Text::_('COM_COMMUNITY_EVENTS_DELETE'),
            'html'      => Text::_('COM_COMMUNITY_EVENTS_DELETE_WARNING'),
            'btnCancel' => Text::_('COM_COMMUNITY_CANCEL_BUTTON'),
            'btnDelete' => Text::_('COM_COMMUNITY_DELETE'),
            'radios'    => array()
        );

        if ($event->isRecurring()) {
            $json['radios'] = array(
                array( 'current', Text::_('COM_COMMUNITY_EVENTS_DELETE_MESSAGE_ONLY_THIS'), true ),
                array( 'future', Text::_('COM_COMMUNITY_EVENTS_DELETE_MESSAGE_FOLLOWING_THIS') )
            );
        }

        die( json_encode($json) );
    }

    /**
     * Ajax function to add new admin to the event
     *
     * @param memberid    Members id
     * @param groupid    Eventid
     *
     * */
    public function ajaxManageAdmin($memberId, $eventId, $task)
    {
        $response = new JAXResponse();

        $filter = InputFilter::getInstance();
        $memberId = $filter->clean($memberId, 'int');
        $eventId = $filter->clean($eventId, 'int');
        $task = $filter->clean($task, 'string');

        $my = CFactory::getUser();
        $model = $this->getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        $handler = CEventHelper::getHandler($event);

        if (!$handler->manageable()) {
            $response->addScriptCall(
                'joms.jQuery("#notice-message").html("' . Text::_('COM_COMMUNITY_PERMISSION_DENIED_WARNING') . '");'
            );
            $response->addScriptCall('joms.jQuery("#notice").css("display","block");');
            $response->addScriptCall('joms.jQuery("#notice").attr("class","alert alert-danger");');
        } else {
            $member = Table::getInstance('EventMembers', 'CTable');
            $keys = array('eventId' => $event->id, 'memberId' => $memberId);
            $member->load($keys);

            $response->addScriptCall('joms.jQuery("#member_' . $memberId . '");');
            $response->addScriptCall('joms.jQuery("#notice").css("display","block");');
            $response->addScriptCall('joms.jQuery("#notice").attr("class","alert alert-success");');

            switch ($task) {
                case 'add' :
                    $member->permission = 2;
                    $message = Text::_('COM_COMMUNITY_EVENTS_ADD_ADMIN');
                    break;
                case 'remove' :
                    $member->permission = 3;
                    $message = Text::_('COM_COMMUNITY_EVENTS_REVERT_ADMIN');
                    break;
                default:
                    break;
            }

            $member->store();
            $response->addScriptCall('joms.jQuery("#notice-message").html("' . $message . '");');
            $response->addScriptCall('joms.jQuery("#notice").css("display","block");');
            $response->addScriptCall('joms.jQuery("#notice").attr("class","alert alert-info");');
        }

        return $response->sendResponse();
    }

    /**
     * Ajax function to display the join event
     *
     * @params $eventid    A string that determines the evnt id
     * */
    public function ajaxRequestInvite($eventId)
    {
        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventId, 'int');

        $my = CFactory::getUser();
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        $eventMembers = Table::getInstance('EventMembers', 'CTable');
        $keys = array('eventId' => $eventId, 'memberId' => $my->id);
        $eventMembers->load($keys);

        $isMember = $eventMembers->exists();
        $tmpl = new CTemplate();
        $tmpl->set('isMember', $isMember);
        $tmpl->set('event', $event);
        $contents = $tmpl->fetch('ajax.events.requestinvite');

        if (!$isMember) {
            $contents .= '<form method="POST" action="' . CRoute::_('index.php?option=com_community&view=events&task=requestInvite') . '" style="margin:0;padding:0;">';
            $contents .= '<input type="hidden" value="' . $eventId . '" name="eventid">';
            $contents .= '</form>';
        }

        $json = array(
            'title'    => Text::_('COM_COMMUNITY_EVENTS_REQUEST_INVITATION_TITLE'),
            'html'     => $contents,
            'btnYes'   => Text::_('COM_COMMUNITY_YES_BUTTON'),
            'btnNo'    => Text::_('COM_COMMUNITY_NO_BUTTON'),
            'isMember' => $isMember
        );

        die( json_encode($json) );
    }

    /**
     * A user decided to ignore this event. Once he 'ignore' an event. He
     * cannot be invited or contacted by event admin
     * */
    public function ajaxIgnoreEvent($eventId)
    {
        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventId, 'int');

        $model = $this->getModel('events');
        $my = CFactory::getUser();

        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        $html  = Text::sprintf('COM_COMMUNITY_EVENTS_LEAVE_MESSAGE', $event->title);
        $html .= '<form method="POST" action="' . CRoute::_('index.php?option=com_community&view=events&task=ignore') . '" style="margin:0;padding:0;">';
        $html .= '<input type="hidden" value="' . $eventId . '" name="eventid">';
        $html .= '</form>';

        $json = array(
            'title'  => Text::_('COM_COMMUNITY_EVENTS_IGNORE'),
            'html'   => $html,
            'btnYes' => Text::_('COM_COMMUNITY_YES_BUTTON'),
            'btnNo'  => Text::_('COM_COMMUNITY_NO_BUTTON')
        );

        die( json_encode($json) );
    }

    /**
     * Ajax function to approve a specific member when event admin or site admin tries to approve an invitation.
     *
     * @params    string    id    The member's id that needs to be approved.
     * @params    string    groupid    The group id that the user is in.
     * */
    public function ajaxApproveInvite($memberId, $eventId)
    {
        $response = new JAXResponse();

        $filter = InputFilter::getInstance();
        $memberId = $filter->clean($memberId, 'int');
        $eventId = $filter->clean($eventId, 'int');

        $my = CFactory::getUser();
        $model = $this->getModel('events');

        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        $handler = CEventHelper::getHandler($event);

        if (!$handler->manageable()) {
            $response->addScriptCall(Text::_('COM_COMMUNITY_NOT_ALLOWED_TO_ACCESS_SECTION'));
        } else {
            // Load required tables
            $member = Table::getInstance('EventMembers', 'CTable');
            $keys = array('eventId' => $eventId, 'memberId' => $memberId);
            $member->load($keys);

            $member->attend();
            $member->store();

            // Build the URL.
            $url = CUrl::build('events', 'viewevent', array('eventid' => $event->id), true);
            $user = CFactory::getUser($memberId);

            $tmplData = array();
            $tmplData['url'] = CRoute::getExternalURL(
                'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                false
            );
            $tmplData['event'] = $event->title;
            $tmplData['user'] = $user->getDisplayName();
            $tmplData['approval'] = 1;

            // Send email to evnt member once their invitation is approved
            $params = new CParameter('');
            $params->set(
                'url',
                CRoute::getExternalURL(
                    'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                    false
                )
            );
            $params->set('eventTitle', $event->title);
            $params->set('event', $event->title);
            $params->set(
                'event_url',
                'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id
            );
            CNotificationLibrary::add(
                'events_invitation_approved',
                $event->creator,
                $user->id,
                Text::sprintf('COM_COMMUNITY_EVENTS_EMAIL_SUBJECT', $event->title),
                '',
                'events.invitation.approved',
                $params
            );

            $response->addScriptCall('joms.jQuery("#member_' . $memberId . '");');
            $response->addScriptCall(
                'joms.jQuery("#notice-message").html("' . Text::_('COM_COMMUNITY_EVENTS_REQUEST_APPROVED') . '");'
            );
            $response->addScriptCall('joms.jQuery("#notice").css("display","block");');
            $response->addScriptCall('joms.jQuery("#notice").attr("class","alert alert-info");');
            $response->addScriptCall('joms.jQuery("#events-approve-' . $memberId . '").remove();');
        }
        $this->cacheClean(array(COMMUNITY_CACHE_TAG_EVENTS));
        return $response->sendResponse();
    }

    /**
     *  Ajax function to delete a event
     *
     * @param    $eventId    The specific event id to unpublish
     * */
    public function ajaxDeleteEvent($eventId, $step = 1, $action = '')
    {
        $response = new JAXResponse();
        $json = array();

        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventId, 'int');
        $step = $filter->clean($step);

        $model = CFactory::getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        $membersCount = $event->getMembersCount('accepted');

        $my = CFactory::getUser();
        $isMine = ($my->id == $event->creator);

        $handler = CEventHelper::getHandler($event);

        // only check for step 1 as the following steps will remove member, including event creator which will violate permission
        if (!$handler->manageable() && $step == 1) {
            $json['error'] = Text::_('COM_COMMUNITY_EVENTS_NOT_ALLOW_DELETE');
            die( json_encode($json) );
        }

        $doneMessage = ' - <span class=\'success\'>' . Text::_('COM_COMMUNITY_DONE') . '</span><br />';
        $failedMessage = ' - <span class=\'failed\'>' . Text::_('COM_COMMUNITY_FAILED') . '</span><br />';

        switch ($step) {
            case 1:
                // Nothing gets deleted yet. Just show a messge to the next step
                if (empty($eventId)) {
                    $json['error'] = Text::_('COM_COMMUNITY_EVENTS_INVALID_ID_ERROR');
                } else {
                    $json['message']  = '<strong>' . Text::sprintf('COM_COMMUNITY_EVENTS_DELETING', $event->title) . '</strong><br/>';
                    $json['message'] .= Text::_('COM_COMMUNITY_EVENTS_DELETE_MEMBERS');
                    $json['next'] = 2;

                    $this->triggerEvents('onBeforeEventDelete', $event);
                }
                break;

            case 2:
                // Delete all event members
                if ($event->deleteAllMembers($action)) {
                    $content = $doneMessage;
                } else {
                    $content = $failedMessage;
                }
                $content .= Text::_('COM_COMMUNITY_EVENTS_DELETE_WALLS');

                $json['message'] = $content;
                $json['next'] = 3;
                break;

            case 3:
                // Delete all event wall
                if ($event->deleteWalls()) {
                    $content = $doneMessage;
                } else {
                    $content = $failedMessage;
                }

                //delete the event's media - add to new steps in the future if needed
                $event->deleteMedia();

                $json['message'] = $content;
                $json['next'] = 4;
                break;

            case 4:
                // Delete event master record
                $eventData = $event;
                $deleted = false;
                $eventList = array();

                // delete the current event only
                if ($action == 'current') {
                    $event->published = 3;
                    $deleted = $event->store();
                    // Delete all event in the series
                } else {
                    if ($action == 'future') {

                        $eventList = $model->getEventChilds($event->parent, array('eventid' => $event->id));
                        foreach ($eventList as $key => $value) {
                            $event->load($value['id']);
                            $event->published = 3;
                            $deleted = $event->store();
                        }
                        // Delete non recurring event
                    } else {
                        $deleted = $event->delete();
                    }
                }

                if ($deleted) {
                    // Delete featured event.
                    $featured = new CFeatured(FEATURED_EVENTS);

                    if (!empty($eventList)) {
                        foreach ($eventList as $key => $value) {
                            $obj = new stdClass();
                            $obj->avatar = $value['avatar'];
                            $obj->thumb = $value['thumb'];
                            $obj->id = $value['id'];
                            // Delete Avatar
                            $this->deleteEventAvatar($obj, true);
                            // Delete feature
                            $featured->delete($value['id']);
                        }
                    } else {
                        // Delete avatar
                        $this->deleteEventAvatar($eventData);
                        // Delete featuer
                        $featured->delete($eventId);
                    }

                    $content = Text::_('COM_COMMUNITY_EVENTS_DELETED');

                    //trigger for onGroupDelete
                    $this->triggerEvents('onAfterEventDelete', $eventData);

                    $this->cacheClean(
                        array(
                            COMMUNITY_CACHE_TAG_FRONTPAGE,
                            COMMUNITY_CACHE_TAG_EVENTS,
                            COMMUNITY_CACHE_TAG_EVENTS_CAT,
                            COMMUNITY_CACHE_TAG_ACTIVITIES
                        )
                    );
                } else {
                    $content = Text::_('COM_COMMUNITY_EVENTS_DELETING_ERROR');
                }

                $redirectURL = CRoute::_('index.php?option=com_community&view=events&task=myevents&userid=' . $my->id, false);

                $json['message'] = $content;
                $json['redirect'] = $redirectURL;
                $json['btnDone'] = Text::_('COM_COMMUNITY_DONE_BUTTON');
                break;

                break;
            default:
                break;
        }

        die( json_encode($json) );

        // return $response->sendResponse();
    }

    public function deleteEventAvatar($eventData, $series = false)
    {
        jimport('joomla.filesystem.file');

        $model = CFactory::getModel('events');

        $avatarInused = $model->isImageInUsed($eventData->avatar, 'avatar', $eventData->id, $series);
        if ($eventData->avatar != "components/com_community/assets/eventAvatar.png" && !empty($eventData->avatar) && !$avatarInused) {
            $path = explode('/', $eventData->avatar);

            $file = JPATH_ROOT . '/' . $path[0] . '/' . $path[1] . '/' . $path[2] . '/' . $path[3];
            if (is_file($file)) {
                File::delete($file);
            }
        }

        $thumbInused = $model->isImageInUsed($eventData->thumb, 'thumb', $eventData->id, $series);
        if ($eventData->thumb != "components/com_community/assets/event_thumb.png" && !empty($eventData->avatar) && !$thumbInused) {
            //$path = explode('/', $eventData->avatar);
            //$file = JPATH_ROOT .'/'. $path[0] .'/'. $path[1] .'/'. $path[2] .'/'. $path[3];
            $file = JPATH_ROOT . '/' . CString::str_ireplace('/', '/', $eventData->thumb);
            if (is_file($file)) {
                File::delete($file);
            }
        }
    }

    /**
     * Unblock this user for this event
     */
    public function ajaxUnblockGuest($userid, $eventid)
    {
        $my = CFactory::getUser();


        $response = new JAXResponse();

        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventId, 'int');
        $userid = $filter->clean($userid, 'int');

        // @todo: caller needs to be admin
        $model = CFactory::getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventid);

        // Make sure I am the group admin
        if ($event->isAdmin($my->id)) {
            // Make sure the user is not an admin
            if (COwnerHelper::isCommunityAdmin($userid)) {
                // Should not require exact string since it should never
                // gets executed unless user try to inject ajax code
                $response->addAlert(Text::_('COM_COMMUNITY_ACCESS_FORBIDDEN'));
            } else {
                $guest = Table::getInstance('EventMembers', 'CTable');
                $keys = array('eventId' => $eventId, 'memberId' => $userid);
                $guest->load($keys);

                $guest->status = COMMUNITY_EVENT_STATUS_MAYBE;
                $guest->store();

                // Update event stats count
                $event->updateGuestStats();
                $event->store();

                $header = Text::_('COM_COMMUNITY_EVENTS_UNBLOCK');
                $message = Text::_('COM_COMMUNITY_EVENTS_UNBLOCKED_MESSAGE');

                $response->addAssign('cwin_logo', 'innerHTML', $header);

                $actions = '<button  class="btn" onclick="window.location.reload()">' . Text::_(
                        'COM_COMMUNITY_BUTTON_CLOSE_BUTTON'
                    ) . '</button>';

                $response->addScriptCall('cWindowAddContent', $message, $actions);
            }
        } else {
            $response->addAlert(Text::_('COM_COMMUNITY_ACCESS_FORBIDDEN'));
        }

        return $response->sendResponse();
    }

    /**
     * Block this user from this event
     */
    public function ajaxBlockGuest($userid, $eventid)
    {
        $my = CFactory::getUser();
        $json = array();

        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventid, 'int');
        $userid = $filter->clean($userid, 'int');

        // @todo: caller needs to be admin
        $model = CFactory::getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventid);

        $actions = '';
        // Make sure I am the group admin
        if ($event->isAdmin($my->id) || COwnerHelper::isCommunityAdmin($my->id)) {
            $guest = Table::getInstance('EventMembers', 'CTable');
            $keys = array('eventId' => $eventid, 'memberId' => $userid);

            $guest->load($keys);

            // Set status to "BLOCKED"
            $guest->status = COMMUNITY_EVENT_STATUS_BLOCKED;
            $guest->store();

            // Update event stats count
            $event->updateGuestStats();
            $event->store();

            $json['success'] = true;
            $json['message'] = Text::_('COM_COMMUNITY_EVENTS_BLOCKED_MESSAGE');
        } else {
            $json['error'] = Text::_('COM_COMMUNITY_ACCESS_FORBIDDEN');
        }

        die( json_encode( $json ) );
    }

    /**
     * AJAX remove user from event
     *
     */
    public function ajaxRemoveGuest($userid, $eventid)
    {
        $my = CFactory::getUser();
        $json = array();

        $filter = InputFilter::getInstance();
        $userid = $filter->clean($userid, 'int');
        $eventId = $filter->clean($eventid, 'int');

        $model = CFactory::getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventid);

        // Site admin can remove guest
        // Event creator can remove guest
        // The guest himself can remove himself
        if ($event->isAdmin($my->id) || COwnerHelper::isCommunityAdmin($my->id) || $my->id == $userid) {
            // Delete guest from event
            $event->removeGuest($userid, $eventid);

            // Update event stats count
            $event->updateGuestStats();
            $event->store();

            $json['success'] = true;
            $json['message'] = Text::_('COM_COMMUNITY_EVENTS_GUEST_REMOVED');
        } else {
            $json['error'] = Text::_('COM_COMMUNITY_ACCESS_FORBIDDEN');
        }

        die( json_encode( $json ) );
    }

    /**
     * Ajax remove guest confirmation prompt
     *
     */
    public function ajaxConfirmRemoveGuest($userid, $eventid)
    {

        $objResponse = new JAXResponse();

        $filter = InputFilter::getInstance();
        $userid = $filter->clean($userid, 'int');
        $eventId = $filter->clean($eventid, 'int');

        // Get html
        $user = CFactory::getUser($userid);

        $html  = Text::sprintf( 'COM_COMMUNITY_EVENTS_REMOVE_GUEST_WARNING', $user->getDisplayName() );
        $html .= '<div><input type="checkbox"> ' . Text::_('COM_COMMUNITY_ALSO_BLOCK_GUEST') . '</div>';

        $json = array(
            'title'  => Text::_('COM_COMMUNITY_EVENTS_REMOVE_GUEST'),
            'html'   => $html,
            'btnYes' => Text::_('COM_COMMUNITY_YES_BUTTON'),
            'btnNo'  => Text::_('COM_COMMUNITY_NO_BUTTON')
        );

        die( json_encode( $json ) );
    }

    /**
     * AJAX confirm block guest
     *
     */
    public function ajaxConfirmBlockGuest($userid, $eventid)
    {
        $response = new JAXResponse();

        $filter = InputFilter::getInstance();
        $userid = $filter->clean($userid, 'int');
        $eventId = $filter->clean($eventId, 'int');

        $header = Text::_('COM_COMMUNITY_EVENTS_BLOCK');
        $message = Text::_('COM_COMMUNITY_EVENTS_BLOCK_WARNING');

        $actions = '<button class="btn" onclick="cWindowHide();">' . Text::_('COM_COMMUNITY_NO') . '</button>';
        $actions .= '<button class="btn btn-primary pull-right" onclick="joms.events.blockGuest(' . $userid . ',' . $eventid . ');">' . Text::_(
                'COM_COMMUNITY_YES'
            ) . '</button>';

        $response->addAssign('cwin_logo', 'innerHTML', $header);
        $response->addScriptCall('cWindowAddContent', $message, $actions);

        return $response->sendResponse();
    }

    /**
     * AJAX confirm unblock guest
     *
     */
    public function ajaxConfirmUnblockGuest($userid, $eventid)
    {
        $response = new JAXResponse();

        $filter = InputFilter::getInstance();
        $userid = $filter->clean($userid, 'int');
        $eventId = $filter->clean($eventId, 'int');

        $header = Text::_('COM_COMMUNITY_EVENTS_UNBLOCK');
        $message = Text::_('COM_COMMUNITY_EVENTS_UNBLOCK_WARNING');
        $actions = '<button class="btn" onclick="cWindowHide();">' . Text::_('COM_COMMUNITY_NO') . '</button>';
        $actions .= '<button  class="btn btn-primary pull-right" onclick="joms.events.unblockGuest(' . $userid . ',' . $eventid . ');">' . Text::_(
                'COM_COMMUNITY_YES'
            ) . '</button>';

        $response->addAssign('cwin_logo', 'innerHTML', $header);
        $response->addScriptCall('cWindowAddContent', $message, $actions);

        return $response->sendResponse();
    }

    /**
     * Ajax function to join an event invitation
     *
     * */
    public function ajaxJoinInvitation($eventId)
    {
        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $json = array();
        $my = CFactory::getUser();

        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventId, 'int');

        // Get events model
        $model = CFactory::getModel('events');
        $event = Table::getInstance('Event', 'CTable');

        // Check the event availability
        if ($event->load($eventId)) {
            $guest = Table::getInstance('EventMembers', 'CTable');
            $keys = array('eventId' => $event->id, 'memberId' => $my->id);
            $guest->load($keys);

            //we must make sure the seats are available before letting user join
            if(!CEventHelper::seatsAvailable($event)){
                return false;
            }

            // Set status to "CONFIRMED"
            $guest->status = COMMUNITY_EVENT_STATUS_ATTEND;
            $guest->store();

            // Update event stats count
            $event->updateGuestStats();
            $event->store();

            $handler = CEventHelper::getHandler($event);

            // Activity stream purpose if the event is a public event
            if ($handler->isPublic()) {
                $actor = $my->id;
                $target = 0;
                $content = '';
                $cid = $event->id;
                $app = 'events';
                $act = $handler->getActivity('events.join', $actor, $target, $content, $cid, $app);
                $act->eventid = $event->id;

                $params = new CParameter('');
                $action_str = 'events.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::add($act, $params->toString());
            }

            $url = $handler->getFormattedLink('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_DELETED_ERROR');
        }

        $this->cacheClean(array(COMMUNITY_CACHE_TAG_EVENTS, COMMUNITY_CACHE_TAG_ACTIVITIES));

        die( json_encode($json) );
    }

    /**
     * Ajax function to reject an event invitation
     *
     * */
    public function ajaxRejectInvitation($eventId)
    {
        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $json = array();
        $my = CFactory::getUser();

        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventId, 'int');

        // Get events model
        $model = CFactory::getModel('events');
        $event = Table::getInstance('Event', 'CTable');

        // Check the event availability
        if ($event->load($eventId)) {
            $guest = Table::getInstance('EventMembers', 'CTable');
            $keys = array('eventId' => $event->id, 'memberId' => $my->id);
            $guest->load($keys);

            // Set status to "REJECTED"
            $guest->status = COMMUNITY_EVENT_STATUS_WONTATTEND;
            $guest->store();

            // Update event stats count
            $event->updateGuestStats();
            $event->store();

            $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_DELETED_ERROR');
        }

        die( json_encode($json) );
    }

    /**
     * Ajax retreive Featured Events Information
     * @since 2.4
     */
    public function ajaxShowEventFeatured($eventId, $allday)
    {
        $my = CFactory::getUser();
        $objResponse = new JAXResponse();
        //CFactory::load( 'models' , 'events' );
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        // Get event link
        // Get Avatar
        $avatar = $event->getAvatar('avatar');

        /// Event date
        $config = CFactory::getConfig();
        $format = ($config->get('eventshowampm')) ? Text::_('COM_COMMUNITY_EVENTS_TIME_FORMAT_12HR') : Text::_(
            'COM_COMMUNITY_EVENTS_TIME_FORMAT_24HR'
        );

        $startDate = $event->getStartDate(false);
        $endDate = $event->getEndDate(false);
        $allday = false;

        if (($startDate->format('%Y-%m-%d') == $endDate->format('%Y-%m-%d')) && $startDate->format(
                '%H:%M:%S'
            ) == '00:00:00' && $endDate->format('%H:%M:%S') == '23:59:59'
        ) {
            $format = Text::_('COM_COMMUNITY_EVENT_TIME_FORMAT_LC1');
            $allday = true;
        }

        if ($allday) {
            $eventDate = Text::sprintf(
                'COM_COMMUNITY_EVENTS_ALLDAY_DATE',
                CTimeHelper::getFormattedTime($event->startdate, $format)
            );
        } else {
            $eventDate = Text::sprintf(
                'COM_COMMUNITY_EVENTS_DURATION',
                CTimeHelper::getFormattedTime($event->startdate, $format),
                CTimeHelper::getFormattedTime($event->enddate, $format)
            );
        }

        // Get event link
        $eventLink = CRoute::_('index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id);


        //CFactory::load( 'helpers' , 'event' );
        $handler = CEventHelper::getHandler($event);
        $now = new JDate();
        $isPastEvent = ($event->getEndDate(false)->toSql() < $now->toSql()) ? true : false;
        // Get RSVP
        $rsvp = '';
        if ($my->id != 0) {
            if ($handler->isAllowed() && !$isPastEvent) {
                $rsvp = '<div class="selector focus" id="jomSelect-undefined">';
                /* Fix missing select style */
                if ($event->getMemberStatus($my->id) == COMMUNITY_EVENT_STATUS_ATTEND) {
                    $rsvp .= '<span class="attend">' . Text::_('COM_COMMUNITY_EVENTS_RSVP_ATTEND') . '</span>';
                } elseif ($event->getMemberStatus($my->id) >= COMMUNITY_EVENT_STATUS_WONTATTEND) {
                    $rsvp .= '<span class="notAttend">' . Text::_('COM_COMMUNITY_EVENTS_RSVP_NOT_ATTEND') . '</span>';
                } else {
                    $rsvp .= '<span class="noResponse">' . Text::_(
                            'COM_COMMUNITY_GROUPS_INVITATION_RESPONSE'
                        ) . '</span>';
                }
                $rsvp .= '<select onchange="joms.events.submitRSVP(' . $event->id . ',this)" style="opacity:0;">';
                if ($event->getMemberStatus($my->id) == 0) {
                    $rsvp .= '<option class="noResponse" selected="selected">' . Text::_(
                            'COM_COMMUNITY_GROUPS_INVITATION_RESPONSE'
                        ) . '</option>';
                }
                $rsvp .= '<option class="attend"';
                if ($event->getMemberStatus($my->id) == COMMUNITY_EVENT_STATUS_ATTEND) {
                    $rsvp .= ' selected="selected" ';
                }
                $rsvp .= 'value="' . COMMUNITY_EVENT_STATUS_ATTEND . '">' . Text::_(
                        'COM_COMMUNITY_EVENTS_RSVP_ATTEND'
                    ) . '</option>';
                $rsvp .= '<option class="notAttend"';
                if ($event->getMemberStatus($my->id) >= COMMUNITY_EVENT_STATUS_WONTATTEND) {

                    $rsvp .= 'selected="selected"';
                }
                $rsvp .= 'value="' . COMMUNITY_EVENT_STATUS_WONTATTEND . '">' . Text::_(
                        'COM_COMMUNITY_EVENTS_RSVP_NOT_ATTEND'
                    ) . '</option>';
                $rsvp .= '</select>';
                $rsvp .= '</div>';
            } else {
                $rsvp = Text::_('COM_COMMUNITY_EVENTS_PASSED');
            }
        }

        // Get unfeature icon
        $eventUnfeature = '<a class="album-action remove-featured" title="' . Text::_(
                'COM_COMMUNITY_REMOVE_FEATURED'
            ) . '" onclick="joms.featured.remove(\'' . $event->id . '\',\'events\');" href="javascript:void(0);">' . Text::_(
                'COM_COMMUNITY_REMOVE_FEATURED'
            ) . '</a>';

        // Get like
        //CFactory::load( 'libraries' , 'like' );
        $likes = new CLike();
        $likesHTML = $likes->getHTML('events', $eventId, $my->id);
        $objResponse->addScriptCall(
            'updateEvent',
            $eventId,
            $event->title,
            Text::_($event->getCategoryName()),
            $likesHTML,
            $avatar,
            $eventDate,
            $event->location,
            $event->summary,
            $eventLink,
            $rsvp,
            $eventUnfeature
        );
        $objResponse->sendResponse();
    }

    /**
     * Method is called from the reporting library. Function calls should be
     * registered here.
     *
     * return    String    Message that will be displayed to user upon submission.
     * */
    public function reportEvent($link, $message, $eventId)
    {
        //CFactory::load( 'libraries' , 'reporting' );

        $report = new CReportingLibrary();
        $report->createReport(Text::_('COM_COMMUNITY_EVENTS_BAD'), $link, $message);

        $action = new stdClass();
        $action->label = 'COM_COMMUNITY_EVENTS_UNPUBLISH';
        $action->method = 'events,unpublishEvent';
        $action->parameters = $eventId;
        $action->defaultAction = true;

        $report->addActions(array($action));

        return Text::_('COM_COMMUNITY_REPORT_SUBMITTED');
    }

    public function unpublishEvent($eventId)
    {
        //CFactory::load( 'models' , 'events' );

        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        if ($event->published == 1) {
            $event->published = '0';
            $msg = Text::_('COM_COMMUNITY_EVENTS_UNPUBLISHED');
        } else {
            $event->published = '1';
            $msg = Text::_('COM_COMMUNITY_EVENTS_PUBLISHED');
        }

        $event->store();
        return $msg;
    }

    /**
     * Displays the default events view
     * */
    public function display($cacheable = false, $urlparams = false)
    {
        $config = CFactory::getConfig();

        if (!$config->get('enableevents')) {
            echo Text::_('COM_COMMUNITY_EVENTS_DISABLED');
            return;
        }
        $jinput = Factory::getApplication()->input;
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);

        echo $view->get(__FUNCTION__);
    }

    /*
     * Export an event
     */

    public function export()
    {
        $config = CFactory::getConfig();

        if (!$config->get('enableevents')) {
            echo Text::_('COM_COMMUNITY_EVENTS_DISABLED');
            return;
        }

        $jinput = Factory::getApplication()->input;
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);

        $eventId = $jinput->request->get('eventid', '0', 'Int');

        $model = $this->getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        echo $view->get(__FUNCTION__, $event);
        exit;
    }

    /**
     * A user decided to ignore an event
     * Banned used cannot be ignored
     */
    public function ignore()
    {
        $jinput = Factory::getApplication()->input;

        $eventId = $jinput->post->get('eventid', 0, 'Int');
        CError::assert($eventId, '', '!empty', __FILE__, __LINE__);

        $model = $this->getModel('events');
        $my = CFactory::getUser();

        if ($my->id == 0) {
            return $this->blockUnregister();
        }

        $eventMembers = Table::getInstance('EventMembers', 'CTable');
        $keys = array('eventId' => $eventId, 'memberId' => $my->id);
        $eventMembers->load($keys);

        $message = '';

        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        // Add user in ignore list
        if ($eventMembers->id != 0) {
            $eventMembers->status = COMMUNITY_EVENT_STATUS_IGNORE;
            $eventMembers->store();

            //now we need to update the events various count.
            $event->updateGuestStats();
            $event->store();
            $message = Text::_('COM_COMMUNITY_EVENTS_IGNORE_MESSAGE');
        }

        //CFactory::load( 'helpers' , 'event' );
        $handler = CEventHelper::getHandler($event);
        $mainframe = Factory::getApplication();
        $mainframe->enqueueMessage($message);
        $mainframe->redirect($handler->getIgnoreRedirectLink());
    }

    /**
     * Method is used to receive POST requests from specific user
     * that wants to join a event
     *
     * @return    void
     * */
    public function requestInvite()
    {
        $mainframe = Factory::getApplication();
        $jinput = $mainframe->input;
        $eventId = $jinput->post->get('eventid', 0, 'Int');

        // Add assertion to the event id since it must be specified in the post request
        CError::assert($eventId, '', '!empty', __FILE__, __LINE__);

        // Get the current user's object
        $my = CFactory::getUser();

        if ($my->id == 0) {
            return $this->blockUnregister();
        }

        // Load necessary tables
        $model = CFactory::getModel('events');

        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        $eventMembers = Table::getInstance('EventMembers', 'CTable');
        $keys = array('eventId' => $eventId, 'memberId' => $my->id);
        $eventMembers->load($keys);
        $isMember = $eventMembers->exists();

        if ($isMember) {
            $url = CRoute::_('index.php?option=com_community&view=events&task=viewevent&eventid=' . $eventId, false);
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_ALREADY_MEMBER'));
            $mainframe->redirect($url);
        } else {

            // Set the properties for the members table
            $eventMembers->eventid = $event->id;
            $eventMembers->memberid = $my->id;

            //CFactory::load( 'helpers' , 'owner' );
            //required approval
            //$eventMembers->approval	= 1;
            //@todo: need to set the privileges
            $date = JDate::getInstance();
            $eventMembers->status = COMMUNITY_EVENT_STATUS_REQUESTINVITE; // for now just set it to approve for the demo purpose
            $eventMembers->permission = '3'; //always a member
            $eventMembers->created = $date->toSql();

            // Get the owner data
            $owner = CFactory::getUser($event->creator);

            $store = $eventMembers->store();

            // Add assertion if storing fails
            CError::assert($store, true, 'eq', __FILE__, __LINE__);
            // Build the URL.
            //$url	= CUrl::build( 'groups' , 'viewgroup' , array( 'groupid' => $group->id ) , true );
            $url = CRoute::getExternalURL(
                'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                false
            );

            // Add notification
            //CFactory::load( 'libraries' , 'notification' );
            //CFactory::load( 'helpers' , 'event' );

            $emails = array();
            $emails[] = $owner->id;

            $params = new CParameter('');
            $params->set('url', 'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id);
            $params->set('event', $event->title);
            $params->set(
                'event_url',
                'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id
            );
            CNotificationLibrary::add(
                'event_join_request',
                $my->id,
                $emails,
                Text::sprintf('COM_COMMUNITY_EVENT_JOIN_REQUEST_SUBJECT'),
                '',
                'events.joinrequest',
                $params
            );


            // Notify admin via email if user is unapproved or approved.
            // @todo: If user is not approve yet, display links to approve , reject
            $tmplData = array();
            $tmplData['url'] = $url;
            $tmplData['event'] = $event->title;
            $tmplData['user'] = $my->getDisplayName();
            $tmplData['status'] = $eventMembers->status;

            //trigger for on event request invite
            $this->triggerEvents('onEventRequestInvite', $event, $my->id);

            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_INVITATION_REQUEST_SUCCESS'));
            $mainframe->redirect($url);
        }
    }

    /*
     * Method to display myevent page
     */

    public function myevents()
    {
        $jinput = Factory::getApplication()->input;
        $my = CFactory::getUser();
        
        // check if user exist or not
        $userid = $jinput->get('userid', $my->id);
        $user = CFactory::getUser($userid);
            
        if (!$user->id) {
            $redirectUrl = CRoute::_('index.php?option=com_community&view=events', false);
            Factory::getApplication()->redirect($redirectUrl);
        }

        $document = Factory::getDocument();
        $viewType = $document->getType();
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);

        echo $view->get(__FUNCTION__);
    }

    /*
     * Method to display myinvites page
     */

    public function myinvites()
    {
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $jinput = Factory::getApplication()->input;
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);

        echo $view->get(__FUNCTION__);
    }

    /*
     * Method to display pastevents page
     */

    public function pastevents()
    {
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $jinput = Factory::getApplication()->input;
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);

        echo $view->get(__FUNCTION__);
    }

    public function saveImport()
    {
        $mainframe = Factory::getApplication();
        $jinput = $mainframe->input;
        $events = $jinput->get('events', '', 'NONE');
        $my = CFactory::getUser();
        $config = CFactory::getConfig();
        $groupId = $jinput->get->get('groupid', 0, 'Int');
        $groupLink = $groupId > 0 ? '&groupid=' . $groupId : '';

        $pageId = $jinput->get->get('pageid', 0, 'Int');
        $pageLink = $pageId > 0 ? '&pageid=' . $pageId : '';

        if (!empty($events)) {
            $errors = array();

            foreach ($events as $index) {
                $event = Table::getInstance('Event', 'CTable');
                $event->title = $jinput->get('event-' . $index . '-title', '', 'String');
                $event->startdate = $jinput->get('event-' . $index . '-startdate', '', 'String');
                $event->enddate = $jinput->get('event-' . $index . '-enddate', '', 'String');
                $event->offset = $jinput->get('event-' . $index . '-offset', '0', 'String');
                $event->description = $jinput->get('event-' . $index . '-description', '', 'String');
                $event->catid = $jinput->get('event-' . $index . '-catid', '', 'String');
                $event->location = $jinput->get('event-' . $index . '-location', '', 'String');
                $event->allowinvite = $jinput->get('event-' . $index . '-invite', 'String');
                $event->creator = $my->id;
                $event->summary = $jinput->get('event-' . $index . '-summary', '', 'String');
                $event->ticket = $jinput->get('event-' . $index . '-ticket', 0, 'Int');
                $event->repeat = $jinput->get('event-' . $index . '-repeat', 0, 'String');
                $event->repeatend = $jinput->get('event-' . $index . '-repeatend', 'String');

                $params = new CParameter('');
                $params->set('eventrecentphotos', '6');
                $params->set('eventrecentvideos', '6');
                $params->set('timezone', null);
                $params->set('photopermission', 2);
                $params->set('videopermission', 2);
                $params->set('filesharingpermission', 2);
                $params->set('pollspermission', 2);
                
                $event->params = $params->toString();

                $postData['limit'] = $jinput->get('event-' . $index . '-limit', 0, 'Int');

                $error = array();

                $handler = CEventHelper::getHandler($event);
                $event->contentid = $handler->getContentId();
                $event->type = $handler->getType();

                if (empty($event->title)) {
                    $error[] = Text::_('COM_COMMUNITY_EVENTS_TITLE_ERROR');
                }

                if (empty($event->startdate)) {
                    $error[] = Text::_('COM_COMMUNITY_EVENTS_START_DATE_ERROR');
                } else {
                    $event->startdate = CTimeHelper::getFormattedUTC($event->startdate, $event->offset);
                }

                if (empty($event->enddate)) {
                    $error[] = Text::_('COM_COMMUNITY_EVENTS_END_DATE_ERROR');
                } else {
                    $event->enddate = CTimeHelper::getFormattedUTC($event->enddate, $event->offset);
                }

                if (empty($event->catid)) {
                    $error[] = Text::_('COM_COMMUNITY_EVENTS_CATEGORY_ERROR');
                }

                $eventChild = array();
                // check event recurrence limit.
                if (!empty($event->repeat)) {
                    $repeatLimit = 'COMMUNITY_EVENT_RECURRING_LIMIT_' . strtoupper($event->repeat);
                    if (defined($repeatLimit)) {
                        $eventChild = $this->_generateRepeatList($event, $postData);
                        if (count($eventChild) > constant($repeatLimit)) {
                            $error[] = $event->title . ' - ' . sprintf(
                                    Text::_('COM_COMMUNITY_EVENTS_REPEAT_LIMIT_ERROR'),
                                    constant($repeatLimit)
                                );
                        }
                    }
                }

                if (!empty($error)) {
                    $errors[] = $error;
                }

                //@rule: If event moderation is enabled, event should be unpublished by default
                $event->published = $this->isPublished();
                $event->created = JDate::getInstance()->toSql();

                // @rule: Only store event when no errors.
                if (empty($error)) {
                    $event->store();
                    // Save event member
                    if (!$event->isRecurring()) {

                        $this->_saveMember($event);

                        // Increment the member count.
                        $event->updateGuestStats();

                        // Apparently the updateGuestStats does not store the item. Need to store it again.
                        $event->store();
                    } else {
                        $event->parent = $event->id;
                    }
                    // Save recurring event's child.
                    $this->_saveRepeatChild($event, $eventChild, true, $postData);

                    // Create event activity stream.
                    $this->_addActivityStream($event);

                    //add notification: New group event is added
                    $this->_addGroupNotification($event);
                }
            }

            if (!empty($errors)) {
                foreach ($errors as $err) {
                    $errorMessage .= implode(',', $err) . "\n";
                }
                $mainframe->enqueueMessage($errorMessage, 'error');
                $mainframe->redirect(
                    CRoute::_('index.php?option=com_community&view=events&task=import' . $groupLink . $pageLink, false)
                );
            } else {
                $message = !$event->isPublished() ? Text::_(
                    'COM_COMMUNITY_EVENTS_IMPORT_SUCCESS_MODERATED'
                ) : Text::_('COM_COMMUNITY_EVENTS_IMPORT_SUCCESS');

                $mainframe->enqueueMessage($message);
                $mainframe->redirect(
                    CRoute::_('index.php?option=com_community&view=events&task=import' . $groupLink . $pageLink, false)
                );
            }
        } else {
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_NOT_SELECTED'), 'error');
            $mainframe->redirect(
                CRoute::_('index.php?option=com_community&view=events&task=import' . $groupLink . $pageLink, false)
            );
        }
    }

    /**
     * Method to display import event form
     *
     * */
    public function import()
    {
        $mainframe = Factory::getApplication();
        $jinput = $mainframe->input;
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);
        $events = array();
        $config = CFactory::getConfig();
        $groupId = $jinput->get->get('groupid', 0, 'Int');
        $groupLink = $groupId > 0 ? '&groupid=' . $groupId : '';
        $pageId = $jinput->get->get('pageid', 0, 'Int');
        $pageLink = $pageId > 0 ? '&pageid=' . $pageId : '';
        $my = CFactory::getUser();

        if (!$config->get('event_import_ical')) {
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_IMPORT_DISABLED'), 'error');
            $mainframe->redirect(
                CRoute::_('index.php?option=com_community&view=events' . $groupLink . $pageLink, false)
            );
        }

        if (!$my->canCreateEvents()) {
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_IMPORT_DISABLED'), 'error');
            $mainframe->redirect(
                CRoute::_('index.php?option=com_community&view=events' . $groupLink . $pageLink, false)
            );
        }

        if ($jinput->getMethod() == 'POST') {
            CFactory::load('libraries', 'ical');
            $type = $jinput->get('type', 'file', 'NONE');
            $valid = false;

            if ($type == 'file') {
                $fileFilter = new Input($jinput->files->getArray());
                $file = $fileFilter->get('file', '', 'array');
                $valid = $file['type'] == 'text/calendar' || $file['type'] == 'application/octet-stream';
                $path = $file['tmp_name'];

                if ($valid && is_file($path)) {
                    $contents = file_get_contents($path);
                }
                $icalParser = new ICal($path);
            }

            if ($type == 'url') {
                //CFactory::load( 'helpers' , 'remote' );
                $file = $jinput->get('url', '', 'STRING');
                $contents = CRemoteHelper::getContent($file, true);
                preg_match('/Content-Type: (.*)/im', $contents, $matches);
                $valid = isset($matches[1]) && stripos(CStringHelper::trim($matches[1]), 'text/calendar') !== false;
                $icalParser = new ICal($file);
            }

            $ical = new CICal($contents);

            if ($ical->init() && $valid) {
                $events = $ical->getItems();
            } else {
                $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_IMPORT_SUCCESS_UNABLE_LOAD_ICS'), 'error');
                $mainframe->redirect(
                    CRoute::_('index.php?option=com_community&view=events&task=import' . $groupLink . $pageLink, false)
                );
            }
        }
        $data['events'] = $events;
        if (isset($icalParser)) {
            $data['icalParser'] = $icalParser;
        }

        echo $view->get(__FUNCTION__, $data);
    }

    /*
     * Method to create an event
     */

    public function create()
    {
        $document = Factory::getDocument();
        $mainframe = Factory::getApplication();
        $jinput = $mainframe->input;
        $viewType = $document->getType();
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);
        $eventId = $jinput->get->get('eventid', 0, 'Int');
        $config = CFactory::getConfig();
        $model = $this->getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $handler = CEventHelper::getHandler($event);
        $groupId = $jinput->request->get('groupid', 0, 'Int');
        $pageId = $jinput->request->get('pageid', 0, 'Int');
        $my = CFactory::getUser();
        $isBanned = false;
        $isDuplicate = ($eventId) ? true : false;


        if ($groupId) {
            $group = Table::getInstance('Group', 'CTable');
            $group->load($groupId);
            // Check if the current user is banned from this group
            $isBanned = $group->isBanned($my->id);
        }

        if ($pageId) {
            $page = Table::getInstance('Page', 'CTable');
            $page->load($pageId);
            // Check if the current user is banned from this page
            $isBanned = $page->isBanned($my->id);
        }

        if ($my->id == 0) {
            return $this->blockUnregister();
        }

        if (!$handler->creatable() || $isBanned || !$my->canCreateEvents()) {
            CSystemHelper::showErrorPage();
            return;
        }

        //check for user daily limit first, then check for the total limit
        if (CFactory::getConfig()->get("limit_events_perday") <= CFactory::getModel("events")->getTotalToday($my->id)) {
            $eventLimit = CFactory::getConfig()->get("limit_events_perday");
            echo Text::sprintf('COM_COMMUNITY_EVENTS_DAILY_LIMIT', $eventLimit);
            return;
        } else {
            if (CLimitsHelper::exceededEventCreation($my->id)) {
                $eventLimit = $config->get('eventcreatelimit');
                echo Text::sprintf('COM_COMMUNITY_EVENTS_LIMIT', $eventLimit);
                return;
            }
        }

        if ($jinput->post->get('action', '', 'STRING') == 'save') {
            $eid = $this->save($event, $isDuplicate);

            if ($eid !== false) {

                $mainframe = Factory::getApplication();
                $event = Table::getInstance('Event', 'CTable');
                $event->load($eid);

                //create default albums
                $coverAlbum = Table::getInstance('Album', 'CTable');
                $coverAlbum->addCoverAlbum('event',$eid);
                $defaultAlbum = Table::getInstance('Album', 'CTable');
                $defaultAlbum->addDefaultAlbum($eid, 'event');

                //trigger for onGroupCreate
                $this->triggerEvents('onEventCreate', $event);

                $url = CEventHelper::getHandler($event)->getFormattedLink(
                    'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                    false
                );
                $message = Text::sprintf('COM_COMMUNITY_EVENTS_CREATED_NOTICE', $event->title);

                if (!$event->isPublished()) {
                    $message = Text::sprintf('COM_COMMUNITY_EVENTS_MODERATION_NOTICE', $event->title);
                }

                $mainframe->enqueueMessage($message);
                $mainframe->redirect($url);
                return;
            }
        }

        /* Begin: COPY EVENT */
        if (!empty($eventId)) {
            $event->load($eventId);

            if ($my->id != $event->creator && $event->permission == COMMUNITY_PRIVATE_EVENT) {
                $url = CEventHelper::getHandler($event)->getFormattedLink(
                    'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                    false
                );
                $message = Text::_('COM_COMMUNITY_EVENTS_PRIVITE_COPY_ERROR');
                $mainframe->enqueueMessage($message);
                $mainframe->redirect($url);
                return;
            }

            // Consider system will create new id
            $event->id = null;
        } else {
            // set event local date.
            $date = CTimeHelper::getLocaleDate();
            $event->startdate = $date->format('Y-m-d');
            $event->enddate = $event->startdate;
        }
        /* End: COPY EVENT */

        echo $view->get(__FUNCTION__, $event);
    }

    public function ajaxCreate($postData, $objResponse)
    {
        $objResponse = new JAXResponse();

        $filter = InputFilter::getInstance();
        $postData = $filter->clean($postData, 'array');

        $config = CFactory::getConfig();
        $my = CFactory::getUser();

        if (!JSession::checkToken('post')) {
            $objResponse->addScriptCall('__throwError', Text::_('COM_COMMUNITY_INVALID_TOKEN'));
            $objResponse->sendResponse();
        }


        //check for user daily limit first, then check for the total limit
        if (CFactory::getConfig()->get("limit_events_perday") <= CFactory::getModel("events")->getTotalToday($my->id)) {
            $eventLimit = CFactory::getConfig()->get("limit_events_perday");
            $objResponse->addScriptCall(
                '__throwError',
                Text::sprintf('COM_COMMUNITY_EVENTS_DAILY_LIMIT', $eventLimit)
            );
            $objResponse->sendResponse();
        } else {
            if (CLimitsHelper::exceededEventCreation($my->id)) {
                $eventLimit = $config->get('eventcreatelimit');
                $objResponse->addScriptCall('__throwError', Text::sprintf('COM_COMMUNITY_EVENTS_LIMIT', $eventLimit));
                $objResponse->sendResponse();
            }
        }

        //CFactory::load( 'helpers' , 'event' );
        $event = Table::getInstance('Event', 'CTable');
        $event->load();

        if ($postData['element'] == 'groups') {
            $event->contentid = $postData['target'];
            $event->type = 'group';
        }

        if ($postData['element'] == 'pages') {
            $event->contentid = $postData['target'];
            $event->type = 'page';
        }

        $handler = CEventHelper::getHandler($event);

        if (!$handler->creatable() || !$my->canCreateEvents()) {
            $objResponse->addScriptCall('__throwError', Text::_('COM_COMMUNITY_ACCESS_FORBIDDEN'));
            $objResponse->sendResponse();
        }

        // Format startdate and eendate with time before we bind into event object
        $postData = $this->_formatStartEndDate($postData);

        $event->bind($postData);

        if (empty($event->title)) {
            $objResponse->addScriptCall('__throwError', Text::_('COM_COMMUNITY_EVENTS_TITLE_ERROR'));
            $objResponse->sendResponse();
        }

        if (empty($event->location)) {
            $objResponse->addScriptCall('__throwError', Text::_('COM_COMMUNITY_EVENTS_LOCATION_ERR0R'));
            $objResponse->sendResponse();
        }

        // @rule: Start date cannot be empty
        if (empty($event->startdate)) {
            $objResponse->addScriptCall('__throwError', Text::_('COM_COMMUNITY_EVENTS_ENDDATE_ERROR'));
            $objResponse->sendResponse();
        }

        // @rule: End date cannot be empty
        if (empty($event->enddate)) {
            $objResponse->addScriptCall('__throwError', Text::_('COM_COMMUNITY_EVENTS_ENDDATE_ERROR'));
            $objResponse->sendResponse();
        }

        require_once(JPATH_COMPONENT . '/helpers/time.php');

        if (!isset($postData['allday'])) {
            $postData['allday'] = 0;
        }

        if (CTimeHelper::timeIntervalDifference($event->startdate, $event->enddate) > 0) {
            $objResponse->addScriptCall('__throwError', Text::_('COM_COMMUNITY_EVENTS_STARTDATE_GREATER_ERROR'));
            $objResponse->sendResponse();
        }

        // @rule: Event must not end in the past
        $now = CTimeHelper::getLocaleDate();

        // if all day event.
        $isToday = false;
        if ($postData['allday'] == '1') {
            $isToday = date("Y-m-d", strtotime($event->enddate)) == date(
                "Y-m-d",
                strtotime($now->toSql(true))
            ) ? true : $isToday;
        }

        if (CTimeHelper::timeIntervalDifference($now->toSql(true), $event->enddate) > 0 && !$isToday) {
            $objResponse->addScriptCall('__throwError', Text::_('COM_COMMUNITY_EVENTS_ENDDATE_GREATER_ERROR'));
            $objResponse->sendResponse();
        }

        $eventChild = array();

        // check event recurrence limit.
        if (!empty($event->repeat)) {
            $repeatLimit = 'COMMUNITY_EVENT_RECURRING_LIMIT_' . strtoupper($event->repeat);
            if (defined($repeatLimit)) {
                $eventChild = $this->_generateRepeatList($event, $postData);
                if (count($eventChild) > constant($repeatLimit)) {
                    $objResponse->addScriptCall(
                        '__throwError',
                        $event->title . ' - ' . sprintf(
                            Text::_('COM_COMMUNITY_EVENTS_REPEAT_LIMIT_ERROR'),
                            constant($repeatLimit)
                        )
                    );
                }
            }
        }

        $event->creator = $my->id;

        //@rule: If event moderation is enabled, event should be unpublished by default
        $event->published = $this->isPublished();
        $event->created = JDate::getInstance()->toSql();
        $event->contentid = $handler->getContentId();
        $event->type = $handler->getType();

        if ($postData['event']['private']) {
            $event->permission = 1;
        } else {
            $event->permission = 0;
        }

        // set defaul params
        $params = new CParameter('');
        $params->set('eventrecentphotos', '6');
        $params->set('eventrecentvideos', '6');
        $params->set('timezone', null);
        $params->set('photopermission', 2);
        $params->set('videopermission', 2);
        $params->set('filesharingpermission', 2);
        $params->set('pollspermission', 2);
        
        $event->params = $params->toString();

        $event->store();

        //create default albums
        $coverAlbum = Table::getInstance('Album', 'CTable');
        $coverAlbum->addCoverAlbum('event',$event->id);
        $defaultAlbum = Table::getInstance('Album', 'CTable');
        $defaultAlbum->addDefaultAlbum($event->id, 'event');

        //trigger for onGroupCreate
        $this->triggerEvents('onEventCreate', $event);

        if (!$event->isRecurring()) {
            $this->_saveMember($event);
            // Increment the member count.
            $event->updateGuestStats();
            // Apparently the updateGuestStats does not store the item. Need to store it again.
            $event->store();
        } else {
            $event->parent = $event->id;
        }

        // Save recurring event's child.
        $this->_saveRepeatChild($event, $eventChild, true, $postData);

        CEvents::addEventStream($event);
        // add user points
        CUserPoints::assignPoint('events.create');

        $this->triggerEvents('onEventCreate', $event);
        $this->cacheClean(
            array(
                COMMUNITY_CACHE_TAG_FRONTPAGE,
                COMMUNITY_CACHE_TAG_EVENTS,
                COMMUNITY_CACHE_TAG_EVENTS_CAT,
                COMMUNITY_CACHE_TAG_ACTIVITIES
            )
        );

        return $event;
    }

    private function _formatStartEndDate($postData)
    {

        if (isset($postData['starttime-ampm']) && $postData['starttime-ampm'] == 'PM' && $postData['starttime-hour'] != 12) {
            $postData['starttime-hour'] = $postData['starttime-hour'] + 12;
        }

        if (isset($postData['endtime-ampm']) && $postData['endtime-ampm'] == 'PM' && $postData['endtime-hour'] != 12) {
            $postData['endtime-hour'] = $postData['endtime-hour'] + 12;
        }

        if (isset($postData['starttime-ampm']) && $postData['starttime-ampm'] == 'AM' && $postData['starttime-hour'] == 12) {
            $postData['starttime-hour'] = 0;
        }

        if (isset($postData['endtime-ampm']) && $postData['endtime-ampm'] == 'AM' && $postData['endtime-hour'] == 12) {
            $postData['endtime-hour'] = 0;
        }

        // When the All-day is selected, means the startdate & enddate should be same.
        // The time should have to start from 00:00:00 until 23:59:59
        if (array_key_exists('allday', $postData) && $postData['allday'] == '1') {
            $postData['startdate'] = $postData['startdate'] . ' 00:00:00';
            $postData['enddate'] = $postData['enddate'] . ' 23:59:59';
        } else {
            $postData['startdate'] = $postData['startdate'] . ' ' . $postData['starttime-hour'] . ':' . $postData['starttime-min'] . ':00';
            $postData['enddate'] = $postData['enddate'] . ' ' . $postData['endtime-hour'] . ':' . $postData['endtime-min'] . ':00';
        }

        unset($postData['startdatetime']);
        unset($postData['enddatetime']);
        unset($postData['starttime-hour']);
        unset($postData['starttime-min']);
        unset($postData['starttime-ampm']);
        unset($postData['endtime-hour']);
        unset($postData['endtime-min']);
        unset($postData['endtime-ampm']);
        unset($postData['privacy']);

        return $postData;
    }

    /**
     * Controller method responsible to display the edit task.
     *
     * @return    none
     * */
    public function edit()
    {
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $jinput = Factory::getApplication()->input;
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);
        $eventId = $jinput->get('eventid', 0, 'Int');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        if (empty($event->id)) {
            return Factory::getApplication()->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_NOT_AVAILABLE_ERROR'), 'error');
        }

        $my = CFactory::getUser();

        $handler = CEventHelper::getHandler($event);

        if (!$handler->manageable()) {
            echo Text::_('COM_COMMUNITY_RESTRICTED_ACCESS');
            return;
        }

        if ($jinput->getMethod() == 'POST') {
            $eid = $this->save($event);

            if ($eid !== false) {
                $mainframe = Factory::getApplication();
                $event->load($eventId);

                //trigger for onGroupCreate
                $this->triggerEvents('onEventUpdate', $event);

                $action_str = 'event.update';

                $act = new stdClass();
                $act->cmd = $action_str;
                $act->actor = $my->id;
                $act->target = 0;
                $act->title = ''; //Text::sprintf('COM_COMMUNITY_GROUPS_GROUP_UPDATED' , '{group_url}' , $group->name );
                $act->content = '';
                $act->app = 'events.update';
                $act->cid = $event->id;
                $act->eventid = $event->id;
                $act->event_access = $event->permission;
                $act->groupid = ($event->type=='group') ? $event->contentid : 0;
                $act->pageid = ($event->type=='page') ? $event->contentid : 0;

                $params = new CParameter('');
                $params->set('action', $action_str);
                $params->set('event_url', 'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id);


                // Add activity logging. Delete old ones
                CActivityStream::remove($act->app, $act->cid);
                CActivityStream::add($act, $params->toString());

                // add user points
                CUserPoints::assignPoint('events.update');

                $mainframe->enqueueMessage(Text::sprintf('COM_COMMUNITY_EVENTS_UPDATE_NOTICE', $event->title));
                $mainframe->redirect(
                    $handler->getFormattedLink(
                        'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                        false
                    )
                );
                return;
            }
        }

        $this->cacheClean(array(COMMUNITY_CACHE_TAG_EVENTS_CAT, COMMUNITY_CACHE_TAG_ACTIVITIES));
        echo $view->get(__FUNCTION__, $event);
    }

    /**
     * A new event has been created
     */
    public function created()
    {
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $jinput = Factory::getApplication()->input;
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);

        echo $view->get(__FUNCTION__);
    }

    /**
     * Send an email announcement to members
     */
    public function announce()
    {
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $jinput = Factory::getApplication()->input;
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);
        $my = CFactory::getUser();
        $jinput = Factory::getApplication()->input;
        $eventId = $jinput->get('eventid', 0, 'Int');

        $model = $this->getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        if (!$event->isAdmin($my->id)) {
            echo "no access";
            return;
        }

        echo $view->get(__FUNCTION__, $event);
    }

    /**
     * Method to save the group
     * @return false if create fail, return the group id if create is successful
     * */
    public function save($event, $isDuplicate = false)
    {
        // Check for request forgeries
        JSession::checkToken('post') or jexit(Text::_('COM_COMMUNITY_INVALID_TOKEN'));

        $mainframe = Factory::getApplication();
        $jinput = $mainframe->input;
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);

        if (CStringHelper::strtoupper($jinput->getMethod()) != 'POST') {
            $view->addWarning(Text::_('COM_COMMUNITY_PERMISSION_DENIED_WARNING'));
            return false;
        }

        // Get my current data.
        $my = CFactory::getUser();
        $validated = true;
        $model = $this->getModel('events');
        $eventId = $jinput->get->get('eventid', 0, 'Int');
        $isNew = ($eventId == 0 || $isDuplicate) ? true : false;
        $postData = $jinput->post->getArray();
        $repeataction = $jinput->get('repeataction', null, 'NONE');
        $invitegroupmembers = $jinput->get('invitegroupmembers', 0, 'INT');
        $invitepagemembers = $jinput->get('invitepagemembers', 0, 'INT');

        $inviteAllMembers = $jinput->get('invitegroupmembers', 0, 'INT');

        if (!isset($postData['allday'])) {
            $postData['allday'] = 0;
        }

        //format startdate and eendate with time before we bind into event object
        $postData = $this->_formatStartEndDate($postData);

        $event->load($eventId);

        // record event original start and end date
        $postData['oldstartdate'] = $event->startdate;
        $postData['oldenddate'] = $event->enddate;
        $postData['unlisted'] = $jinput->post->get('unlisted', 0, 'INT');

        if (CFactory::getConfig()->get('eventshowtimezone')) {
            $timezoneName = $postData['offset'];
            $postData['offset'] = CTimeHelper::getOffsetByTimezone($postData['offset']); //update offset before binding
        } else {
            $timezoneName = null;
        }
        
        $event->bind($postData);

        if (!array_key_exists('permission', $postData)) {
            $event->permission = 0;
        }

        if (!array_key_exists('allowinvite', $postData)) {
            $event->allowinvite = 0;
        } elseif (isset($postData['endtime-ampm']) && $postData['endtime-ampm'] == 'AM' && $postData['endtime-hour'] == 12) {
            $postData['endtime-hour'] = 00;
        }

        $inputFilter = CFactory::getInputFilter(true);

        // Despite the bind, we would still need to capture RAW description
        $event->description = $jinput->post->get('description', '', 'raw');
        $event->description = $inputFilter->clean($event->description);

        // binding the params
        $params = new CParameter('');
        $photoPermissionAdmin =  $jinput->get('photopermission-admin', 0, 'STRING');
        $photoPermissionMember =  $jinput->get('photopermission-member', 0, 'STRING');
        $videoPermissionAdmin =  $jinput->get('videopermission-admin', 0, 'STRING');
        $videoPermissionMember =  $jinput->get('videopermission-member', 0, 'STRING');
        $filesharingPermissionAdmin =  $jinput->get('filesharingpermission-admin', 0, 'STRING');
        $filesharingPermissionMember =  $jinput->get('filesharingpermission-member', 0, 'STRING');
        $pollsPermissionAdmin =  $jinput->get('pollspermission-admin', 0, 'STRING');
        $pollsPermissionMember =  $jinput->get('pollspermission-member', 0, 'STRING');
        $eventRecentPhotos = $jinput->get('eventrecentphotos', 6, 'STRING');
        $eventRecentVideos = $jinput->get('eventrecentvideos', 6, 'STRING');

        $params->set('eventrecentphotos', $eventRecentPhotos);
        $params->set('eventrecentvideos',$eventRecentVideos);
        $params->set('timezone', $timezoneName);
        if($photoPermissionAdmin){
            $params->set('photopermission', EVENT_PHOTO_PERMISSION_ADMINS);

            if($photoPermissionMember){
                $params->set('photopermission', EVENT_PHOTO_PERMISSION_ALL);
            }
        }else{
            $params->set('photopermission', EVENT_PHOTO_PERMISSION_DISABLE);
        }

        if($videoPermissionAdmin){
            $params->set('videopermission', EVENT_VIDEO_PERMISSION_ADMINS);

            if($videoPermissionMember){
                $params->set('videopermission', EVENT_VIDEO_PERMISSION_ALL);
            }
        }else{
            $params->set('videopermission', EVENT_VIDEO_PERMISSION_DISABLE);
        }

        if($filesharingPermissionAdmin){
            $params->set('filesharingpermission', EVENT_FILESHARING_PERMISSION_ADMINS);

            if($filesharingPermissionMember){
                $params->set('filesharingpermission', EVENT_FILESHARING_PERMISSION_ALL);
            }
        }else{
            $params->set('filesharingpermission', EVENT_FILESHARING_PERMISSION_DISABLE);
        }

        if($pollsPermissionAdmin){
            $params->set('pollspermission', EVENT_POLLS_PERMISSION_ADMINS);

            if($pollsPermissionMember){
                $params->set('pollspermission', EVENT_POLLS_PERMISSION_ALL);
            }
        }else{
            $params->set('pollspermission', EVENT_POLLS_PERMISSION_DISABLE);
        }

        $oldParams = new CParameter($event->params);
        if ( $oldParams->get('coverPosition') ) {
            $params->set('coverPosition', $oldParams->get('coverPosition'));
        }

        //add in the url if there is any
        if (( preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $event->description))) {
            $linkFetchcontent = preg_replace('/<[^>]*>/', ' ', $event->description);
            $linkFetchcontent = strip_tags($linkFetchcontent);
            $graphObject = CParsers::linkFetch($linkFetchcontent);
            
            if ($graphObject){
                $params->merge($graphObject);
            }
        }

        $event->params = $params->toString();

        // @rule: Test for emptyness
        if (empty($event->title)) {
            $validated = false;
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_TITLE_ERROR'), 'error');
        }

        if (empty($event->location)) {
            $validated = false;
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_LOCATION_ERR0R'), 'error');
        }
        // @rule: Test if the event is exists
        if ($model->isEventExist(
            $event->title,
            $event->location,
            $event->startdate,
            $event->enddate,
            $eventId,
            $event->parent
        )
        ) {
            $validated = false;
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_TAKEN_ERROR'), 'error');
        }

        if(!$event->catid){
            $validated = false;
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_SELECT_CATEGORY'), 'error');
        }

        // @rule: Start date cannot be empty
        if (empty($event->startdate)) {
            $validated = false;
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_STARTDATE_ERROR'), 'error');
        }

        // @rule: End date cannot be empty
        if (empty($event->enddate)) {
            $validated = false;
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_ENDDATE_ERROR'), 'error');
        }

        // @rule: Number of ticket must at least be 0
        if (CStringHelper::strlen($event->ticket) <= 0) {
            $validated = false;
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_TICKET_EMPTY_ERROR'), 'error');
        }

        if (!is_numeric($event->ticket)) {
            $validated = false;
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_TICKET_INVALID_ERROR'), 'error');
        }
        $now = CTimeHelper::getLocaleDate();

        require_once(JPATH_COMPONENT . '/helpers/time.php');
        if (CTimeHelper::timeIntervalDifference($event->startdate, $event->enddate) > 0) {
            $validated = false;
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_STARTDATE_GREATER_ERROR'), 'error');
        }

        // if all day event.
        $isToday = false;
        if ($postData['allday'] == '1') {
            $isToday = date("Y-m-d", strtotime($event->enddate)) == date(
                "Y-m-d",
                strtotime($now->toSql(true))
            ) ? true : $isToday;
        }

        // @rule: Event must not end in the past

        if (CTimeHelper::timeIntervalDifference($now->toSql(true), $event->enddate) > 0 && !$isToday && $isNew) {
            $validated = false;
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_ENDDATE_GREATER_ERROR'), 'error');
        }

        $eventChild = array();
        // check event recurrence limit.
        if (!empty($event->repeat) && ($isNew || $postData['repeataction'] == 'future')) {
            $repeatLimit = 'COMMUNITY_EVENT_RECURRING_LIMIT_' . strtoupper($event->repeat);
            if (defined($repeatLimit)) {
                $eventChild = $this->_generateRepeatList($event);
                if (count($eventChild) > constant($repeatLimit)) {
                    $validated = false;
                    $mainframe->enqueueMessage(
                        sprintf(Text::_('COM_COMMUNITY_EVENTS_REPEAT_LIMIT_ERROR'), constant($repeatLimit)),
                        'error'
                    );
                }
            }
        }

        if ($validated) {
            // If show event timezone is disabled, we need to set the event offset to 0.
            $config = CFactory::getConfig();

            if (!$config->get('eventshowtimezone')) {
                $event->offset = 0;
            }

            if ($isDuplicate) {
                $event->id = 0;
                $isNew = 1;
            }

            // Set the default thumbnail and avatar for the event just in case
            // the user decides to skip this
            if ($isNew) {
                $event->creator = $my->id;
                $config = CFactory::getConfig();

                //@rule: If event moderation is enabled, event should be unpublished by default
                $event->published = $this->isPublished();
                $event->created = JDate::getInstance()->toSql();

                $handler = CEventHelper::getHandler($event);
                $event->contentid = $handler->getContentId();
                $event->type = $handler->getType();
            }

            if ($event->type == 'group') {
                $group = Table::getInstance('Group', 'CTable');
                $group->load($event->contentid);

                $event->permission = $group->approvals;
            } elseif ($event->type == 'page') {
                $page = Table::getInstance('Page', 'CTable');
                $page->load($event->contentid);

                $event->permission = $page->approvals;
            }

            $event->store();

            // Save event members
            if ($isNew && !$event->isRecurring()) {
                $this->_saveMember($event);

                // Increment the member count
                $event->updateGuestStats();
                $event->store();
            }

            if ($isNew) {
                $event->parent = !empty($event->repeat) ? $event->id : 0;
            }

            // Save recurring event's child.
            $this->_saveRepeatChild($event, $eventChild, $isNew, $postData);

            // Stream and notification
            if ($isNew) {
                // add activity stream
                $this->_addActivityStream($event);

                //add user points
                $action_str = 'events.create';
                CUserPoints::assignPoint($action_str);

                //add notification: New group event is added
                $this->_addGroupNotification($event);
            }

            $validated = $event->id;

            $this->cacheClean(
                array(
                    COMMUNITY_CACHE_TAG_FRONTPAGE,
                    COMMUNITY_CACHE_TAG_EVENTS,
                    COMMUNITY_CACHE_TAG_EVENTS_CAT,
                    COMMUNITY_CACHE_TAG_ACTIVITIES
                )
            );
        }

        //if saved and we should invite all members of the group
        if(($invitegroupmembers || $invitepagemembers) && $event->id && $event->contentid){
            
            if ($invitegroupmembers) {
                $groupid = $event->contentid;
                $groupsModel = CFactory::getModel('groups');
                $members = $groupsModel->getMembers($groupid, 0, true, false, SHOW_GROUP_ADMIN, true);
            } else if ($invitepagemembers) {
                $pageid = $event->contentid;
                $pagesModel = CFactory::getModel('pages');
                $members = $pagesModel->getMembers($pageid, 0, true, false, SHOW_GROUP_ADMIN, true);
            }

            $membersArr = array();
            foreach($members as $member){
                if($member->id == $my->id){
                    continue;
                }

                $membersArr[] = $member->id;
            }

            try {
                $inviteMail = $this->inviteUsers($event->id, $membersArr, '', '');
            } catch (Exception $e) {
                $validated = false;
            }

            if ($inviteMail instanceof CInvitationMail) {
                // Once stored, we need to store selected user so they wont be invited again
                $callback = "events,inviteUsers";
                $invitation = Table::getInstance('Invitation', 'CTable');
                $invitation->load($callback, $event->id);

                if ($membersArr) {
                    if (!$invitation->id) {
                        // If the record doesn't exists, we need add them into the
                        $invitation->cid = $event->id;
                        $invitation->callback = $callback;
                    }
                    $invitation->users = implode(',',$membersArr);
                    $invitation->store();
                }

                //start sending email and notification
                CNotificationLibrary::add($inviteMail->getCommand(), $my->id, $membersArr, $inviteMail->getTitle(), $inviteMail->getContent(), '', $inviteMail->getParams());
            }
        }

        return $validated;
    }

    public function printpopup()
    {
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $jinput = Factory::getApplication()->input;
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);
        $id = $jinput->request->get('eventid', 0, 'Int');

        $event = Table::getInstance('Event', 'CTable');
        $event->load($id);

        $handler = CEventHelper::getHandler($event);

        if (!$handler->showPrint()) {
            CSystemHelper::showErrorPage();
            return;
        }

        echo $view->get(__FUNCTION__, $event);
        exit;
    }

    /**
     * Controller method responsible to display the sendmail task
     *
     * @return    none
     * */
    public function sendmail()
    {
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $mainframe = Factory::getApplication();
        $jinput = $mainframe->input;
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);
        $id = $jinput->get('eventid', 0, 'INT');
        $message = $jinput->post->get('message', '', 'string');
        $title = $jinput->get('title', '', 'STRING');
        $my = CFactory::getUser();
        $type = $jinput->get('type', COMMUNITY_EVENT_STATUS_ATTEND , 'INT');

        $event = Table::getInstance('Event', 'CTable');
        $event->load($id);

        $handler = CEventHelper::getHandler($event);

        if (empty($id) || !$handler->manageable()) {
            CSystemHelper::showErrorPage();
            return;
        }

        if ($jinput->getMethod() == 'POST') {
            // Check for request forgeries
            JSession::checkToken('post') or jexit(Text::_('COM_COMMUNITY_INVALID_TOKEN'));



            if ($type == COMMUNITY_EVENT_STATUS_WONTATTEND) {
                $members = $event->getMembers(COMMUNITY_EVENT_STATUS_WONTATTEND, null);
            } else if ($type == COMMUNITY_EVENT_STATUS_MAYBE) {
                $members = $event->getMembers(COMMUNITY_EVENT_STATUS_MAYBE, null);
            }else{
                $members = $event->getMembers(COMMUNITY_EVENT_STATUS_ATTEND, null);
            }

            $errors = false;

            if (empty($message)) {
                $errors = true;
                $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_INBOX_MESSAGE_REQUIRED'), 'error');
            }

            if (empty($title)) {
                $errors = true;
                $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_TITLE_REQUIRED'), 'error');
            }

            if (!$errors) {
                // Add notification
                $emails = array();
                $total = 0;

                foreach ($members as $member) {
                    $user = CFactory::getUser($member->id);

                    // Do not sent email notification to self
                    if ($my->id != $user->id) {
                        $total += 1;
                        $emails[] = $user->id;
                    }
                }

                $params = new CParameter('');
                $params->set(
                    'url',
                    $handler->getFormattedLink(
                        'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                        false,
                        true
                    )
                );
                $params->set('title', $title);
                $params->set('event', $event->title);
                $params->set(
                    'event_url',
                    $handler->getFormattedLink(
                        'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                        false,
                        true
                    )
                );
                $params->set('message', $message);
                CNotificationLibrary::add(
                    'events_sendmail',
                    $my->id,
                    $emails,
                    Text::sprintf('COM_COMMUNITY_EVENT_SENDMAIL_SUBJECT'),
                    '',
                    'events.sendmail',
                    $params
                );

                $mainframe->enqueueMessage(Text::sprintf('COM_COMMUNITY_EVENTS_EMAIL_SENT', $total));
                $mainframe->redirect(
                    $handler->getFormattedLink(
                        'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                        false
                    )
                );
            }
        }

        echo $view->get(__FUNCTION__);
    }

    public function viewevent()
    {
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $jinput = Factory::getApplication()->input;
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);

        //this is for single activity view
        $activityId = $jinput->get->get('actid', 0, 'INT');
        if($activityId){
            $activity = Table::getInstance('Activity', 'CTable');
            $activity->load($activityId);
            $jinput->set('userid', $activity->actor);
            $userid = $activity->actor;
        }

        if($activityId) {
            // Load the group table.
            $eventid = $jinput->getInt('eventid', 0);
            $event = Table::getInstance('Event', 'CTable');
            $event->load($eventid);

            $activity->event = $event;
            echo $view->get('singleActivity',$activity);
        } else {
            echo $view->get(__FUNCTION__);
        }
    }

    public function viewguest()
    {
        $mainframe = Factory::getApplication();
        $jinput = $mainframe->input;
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);
        $my = CFactory::getUser();

        $eventId = $jinput->request->get('eventid', '', 'INT');
        $listype = $jinput->request->get('type', '', 'NONE');

        $model = $this->getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        $handler = CEventHelper::getHandler($event);

        // Restrict view of specific usertype to group admin only
        if (($listype == COMMUNITY_EVENT_STATUS_BLOCKED || $listype == COMMUNITY_EVENT_STATUS_REQUESTINVITE || $listype == COMMUNITY_EVENT_STATUS_IGNORE) && !$handler->manageable()
        ) {
            CSystemHelper::showErrorPage();
            return;
        }

        // If an event is a secret event, non-invited user should not be able
        // to view it (can only view admins)
        if (!$handler->isPublic()) {
            $myStatus = $event->getUserStatus($my->id);
            if ($listype != 'admins' && (!$handler->manageable() && ($myStatus != COMMUNITY_EVENT_STATUS_INVITED) && ($myStatus != COMMUNITY_EVENT_STATUS_ATTEND) && ($myStatus != COMMUNITY_EVENT_STATUS_WONTATTEND) && ($myStatus != COMMUNITY_EVENT_STATUS_MAYBE)
                )
            ) {
                $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_PRIVATE_EVENT_NOTICE'), 'error');
                $mainframe->redirect(
                    $handler->getFormattedLink(
                        'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                        false
                    )
                );
                return;
            }
        }

        echo $view->get(__FUNCTION__);
    }

    /**
     * Show Invite
     */
    public function invitefriends()
    {
        $mainframe = Factory::getApplication();
        $jinput = $mainframe->input;
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);
        $my = CFactory::getUser();

        $invited = $jinput->post->get('invite-list', '', 'NONE');
        $inviteMessage = $jinput->post->get('invite-message', '', 'STRING');
        $eventId = $jinput->request->get('eventid', 0, 'Int');

        $model = $this->getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        if ($my->id == 0) {
            return $this->blockUnregister();
        }

        $status = $event->getUserStatus($my->id);
        $allowed = array(
            COMMUNITY_EVENT_STATUS_INVITED,
            COMMUNITY_EVENT_STATUS_ATTEND,
            COMMUNITY_EVENT_STATUS_WONTATTEND,
            COMMUNITY_EVENT_STATUS_MAYBE
        );
        $accessAllowed = ((in_array($status, $allowed)) && $status != COMMUNITY_EVENT_STATUS_BLOCKED) ? true : false;
        $accessAllowed = COwnerHelper::isCommunityAdmin() ? true : $accessAllowed;

        if (!($accessAllowed && $event->allowinvite) && !$event->isAdmin($my->id)) {
            CSystemHelper::showErrorPage();
            return;
        }

        if ($jinput->getMethod() == 'POST') {
            // Check for request forgeries
            JSession::checkToken('post') or jexit(Text::_('COM_COMMUNITY_INVALID_TOKEN'));

            if (!empty($invited)) {
                $mainframe = Factory::getApplication();
                $invitedCount = 0;

                foreach ($invited as $invitedUserId) {
                    $date = JDate::getInstance();
                    $eventMember = Table::getInstance('EventMembers', 'CTable');
                    $eventMember->eventid = $event->id;
                    $eventMember->memberid = $invitedUserId;
                    $eventMember->status = COMMUNITY_EVENT_STATUS_INVITED;
                    $eventMember->invited_by = $my->id;
                    $eventMember->created = $date->toSql();
                    $eventMember->store();
                    $invitedCount++;
                }

                //now update the invited count in event
                $event->invitedcount = $event->invitedcount + $invitedCount;
                $event->store();

                // Send notification to the invited user.
                $params = new CParameter('');
                $params->set(
                    'url',
                    CRoute::getExternalURL(
                        'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id
                    )
                );
                $params->set('eventTitle', $event->title);
                $params->set('event', $event->title);
                $params->set(
                    'event_url',
                    'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id
                );
                $params->set('message', $inviteMessage);
                CNotificationLibrary::add(
                    'events_invite',
                    $my->id,
                    $invited,
                    Text::sprintf('COM_COMMUNITY_EVENTS_JOIN_INVITE'),
                    '',
                    'events.invite',
                    $params
                );

                $view->addInfo(Text::_('COM_COMMUNITY_EVENTS_INVITATION_SENT'));
            } else {
                $view->addWarning(Text::_('COM_COMMUNITY_INVITE_NEED_AT_LEAST_1_FRIEND'));
            }
        }
        echo $view->get(__FUNCTION__);
    }

    /**
     * Responsible to update a specific user's rsvp
     * */
    public function updatestatus()
    {
        $mainframe = Factory::getApplication();
        $jinput = $mainframe->input;
        $my = CFactory::getUser();

        $memberid = $jinput->post->get('memberid', 0, 'Int');
        $eventId = $jinput->request->get('eventid', 0, 'Int');
        $status = $jinput->request->get('status', 0, 'Int');
        $target = null;

        if ($my->id == 0) {
            $url = CRoute::_('index.php?option=com_community&view=events&task=viewevent&eventid=' . $eventId, false);
            return $this->blockUnregister($url);
        }

        // Check for request forgeries
        // This need to be below id test to make sure login is properly processe
        if ($jinput->getMethod() == 'POST') {
            JSession::checkToken('post') or jexit(Text::_('COM_COMMUNITY_INVALID_TOKEN') . 'EVENTS');
        } else {
            $mainframe->redirect(
                CRoute::_('index.php?option=com_community&view=events&task=viewevent&eventid=' . $eventId, false)
            );
            return;
        }

        $model = $this->getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        //CFactory::load( 'helpers' , 'event' );
        $handler = CEventHelper::getHandler($event);

        if (!$handler->isAllowed()) {
            CSystemHelper::showErrorPage();
            return;
        }

        // If a number of ticket is specified and adding one more person exceed
        // the ticket number, we have to decline them
        if (($event->ticket) && (($status == COMMUNITY_EVENT_STATUS_ATTEND) && ($event->confirmedcount + 1) > $event->ticket)) {
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_TICKET_FULL'));
            $mainframe->redirect(
                $handler->getFormattedLink(
                    'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                    false
                )
            );
            return;
        }

        $eventMember = Table::getInstance('EventMembers', 'CTable');
        $keys = array('eventId' => $eventId, 'memberId' => $memberid);
        $eventMember->load($keys);

        $date = JDate::getInstance();

        if ($eventMember->permission != 1 && $eventMember->permission != 2) {
            //always a member
            $eventMember->permission = '3';
        }

        $eventMember->created = $date->toSql();
        $eventMember->status = $status;
        $eventMember->store();

        $event->updateGuestStats();
        $event->store();

        //activities stream goes here.
        $url = $handler->getFormattedLink(
            'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
            false
        );
        $statustxt = Text::_('COM_COMMUNITY_EVENTS_NO');

        if ($status == COMMUNITY_EVENT_STATUS_ATTEND) {
            $statustxt = Text::_('COM_COMMUNITY_EVENTS_YES');
        }

        if ($status == COMMUNITY_EVENT_STATUS_MAYBE) {
            $statustxt = Text::_('COM_COMMUNITY_EVENTS_MAYBE');
        }

        $handler = CEventHelper::getHandler($event);

        // We update the activity only if a user attend an event and the event was set to public event
        if ($status == COMMUNITY_EVENT_STATUS_ATTEND && $handler->isPublic()) {
            $command = 'events.attendence.attend';
            $actor = $my->id;
            $target = 0;
            $content = '';
            $cid = $event->id;
            $app = 'events.attend';
            $act = $handler->getActivity($command, $actor, $target, $content, $cid, $app);
            $act->eventid = $event->id;

            $params = new CParameter('');
            $action_str = 'events.attendence.attend';
            $params->set('eventid', $event->id);
            $params->set('action', $action_str);
            $params->set(
                'event_url',
                $handler->getFormattedLink(
                    'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                    false,
                    true,
                    false
                )
            );

            // Add activity logging
            CActivityStream::addActor($act, $params->toString());
        }

        $appsLib = CAppPlugins::getInstance();
        $appsLib->loadApplications();

        $params = array();
        $params[] = $event;
        $params[] = $my->id;
        $params[] = $status;

        if (!is_null($target)) {
            $params[] = $target;
        }
        $this->cacheClean(array(COMMUNITY_CACHE_TAG_EVENTS, COMMUNITY_CACHE_TAG_ACTIVITIES));
        $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_RESPONSES_UPDATED'));
        $mainframe->redirect(
            $handler->getFormattedLink(
                'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                false
            )
        );
    }

    public function search()
    {
        $config = CFactory::getConfig();
        $mainframe = Factory::getApplication();
        $my = CFactory::getUser();

        if ($my->id == 0 && !$config->get('enableguestsearchevents')) {
            $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_RESTRICTED_ACCESS'), 'notice');
            return $this->blockUnregister();
        }

        $document = Factory::getDocument();
        $viewType = $document->getType();
        $jinput = $mainframe->input;
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);

        echo $view->get(__FUNCTION__);
    }

    public function uploadAvatar()
    {
        $mainframe = Factory::getApplication();
        $document = Factory::getDocument();
        $viewType = $document->getType();
        $jinput = $mainframe->input;
        $viewName = $jinput->get('view', $this->getName(), 'String');
        $view = $this->getView($viewName, '', $viewType);

        $eventid = $jinput->request->get('eventid', 0, 'Int');

        $model = $this->getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventid);

        $handler = CEventHelper::getHandler($event);

        if (!$handler->manageable()) {
            CSystemHelper::showErrorPage();
            return;
        }

        if ($jinput->getMethod() == 'POST') {
            JSession::checkToken() or jexit(Text::_('COM_COMMUNITY_INVALID_TOKEN'));

            //CFactory::load( 'libraries' , 'apps' );

            $my = CFactory::getUser();
            $config = CFactory::getConfig();
            $appsLib = CAppPlugins::getInstance();
            $saveSuccess = $appsLib->triggerEvent('onFormSave', array('jsform-events-uploadavatar'));

            if (empty($saveSuccess) || !in_array(false, $saveSuccess)) {
                //CFactory::load( 'helpers' , 'image' );

                $fileFilter = new JInput($jinput->files->getArray());
                $file = $fileFilter->get('filedata', '', 'array');

                if (!CImageHelper::isValidType($file['type'])) {
                    $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_IMAGE_FILE_NOT_SUPPORTED'), 'error');
                    $mainframe->redirect(
                        $handler->getFormattedLink(
                            'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id . '&task=uploadAvatar',
                            false
                        )
                    );
                }

                if (empty($file)) {
                    $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_NO_POST_DATA'), 'error');
                } else {

                    $uploadLimit = (double)$config->get('maxuploadsize');
                    $uploadLimit = ($uploadLimit * 1024 * 1024);

                    // @rule: Limit image size based on the maximum upload allowed.
                    if (filesize($file['tmp_name']) > $uploadLimit && $uploadLimit != 0) {
                        $mainframe->enqueueMessage(Text::sprintf('COM_COMMUNITY_VIDEOS_IMAGE_FILE_SIZE_EXCEEDED_MB',CFactory::getConfig()->get('maxuploadsize')), 'error');
                        $mainframe->redirect(
                            $handler->getFormattedLink(
                                'index.php?option=com_community&view=events&task=uploadavatar&eventid=' . $event->id,
                                false
                            )
                        );
                    }

                    if (!CImageHelper::isValid($file['tmp_name'])) {
                        $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_IMAGE_FILE_NOT_SUPPORTED'), 'error');
                        $mainframe->redirect(
                            $handler->getFormattedLink(
                                'index.php?option=com_community&view=events&task=uploadavatar&eventid=' . $event->id,
                                false
                            )
                        );
                    } else {

                        CImageHelper::autorotate($file['tmp_name']);
                        // @todo: configurable width?
                        $imageMaxWidth = 160;

                        // Get a hash for the file name.
                        $fileName = ApplicationHelper::getHash($file['tmp_name'] . time());
                        $hashFileName = CStringHelper::substr($fileName, 0, 24);

                        // @todo: configurable path for avatar storage?
                        $storage = JPATH_ROOT . '/' . $config->getString('imagefolder') . '/avatar/events';
                        $storageImage = $storage . '/' . $hashFileName . CImageHelper::getExtension($file['type']);
                        $image = $config->getString(
                                'imagefolder'
                            ) . '/avatar/events/' . $hashFileName . CImageHelper::getExtension($file['type']);

                        $storageThumbnail = $storage . '/thumb_' . $hashFileName . CImageHelper::getExtension(
                                $file['type']
                            );
                        $thumbnail = $config->getString(
                                'imagefolder'
                            ) . '/avatar/events/' . 'thumb_' . $hashFileName . CImageHelper::getExtension(
                                $file['type']
                            );

                        // Generate full image
                        if (!CImageHelper::resizeProportional(
                            $file['tmp_name'],
                            $storageImage,
                            $file['type'],
                            $imageMaxWidth
                        )
                        ) {
                            $mainframe->enqueueMessage(
                                Text::sprintf('COM_COMMUNITY_ERROR_MOVING_UPLOADED_FILE', $storageImage),
                                'error'
                            );
                            $mainframe->redirect(
                                CRoute::_(
                                    'index.php?option=com_community&view=events&task=uploadavatar&eventid=' . $event->id,
                                    false
                                )
                            );
                        }

                        // Generate thumbnail
                        if (!CImageHelper::createThumb($file['tmp_name'], $storageThumbnail, $file['type'])) {
                            $mainframe->enqueueMessage(
                                Text::sprintf('COM_COMMUNITY_ERROR_MOVING_UPLOADED_FILE', $storageImage),
                                'error'
                            );
                            $mainframe->redirect(
                                CRoute::_(
                                    'index.php?option=com_community&view=events&task=uploadavatar&eventid=' . $event->id,
                                    false
                                )
                            );
                        }

                        // Autorotate avatar based on EXIF orientation value
                        if ($file['type'] == 'image/jpeg') {
                            $orientation = CImageHelper::getOrientation($file['tmp_name']);
                            CImageHelper::autoRotate($storageImage, $orientation);
                            CImageHelper::autoRotate($storageThumbnail, $orientation);
                        }

                        // Update the event with the new image
                        $event->setImage($image, 'avatar');
                        $event->setImage($thumbnail, 'thumb');

                        $handler = CEventHelper::getHandler($event);

                        if ($handler->isPublic()) {
                            $actor = $my->id;
                            $target = 0;
                            $content = '<img class="event-thumb" src="' . Uri::root(true) . '/' . $image . '" style="border: 1px solid #eee;margin-right: 3px;" />';
                            $cid = $event->id;
                            $app = 'events';
                            $act = $handler->getActivity('events.avatar.upload', $actor, $target, $content, $cid, $app);
                            $act->eventid = $event->id;

                            $params = new CParameter('');
                            $params->set(
                                'event_url',
                                $handler->getFormattedLink(
                                    'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                                    false,
                                    true,
                                    false
                                )
                            );


                            CActivityStream::add($act, $params->toString());
                        }

                        //add user points
                        CUserPoints::assignPoint('event.avatar.upload');

                        $mainframe = Factory::getApplication();
                        $mainframe->enqueueMessage(Text::_('COM_COMMUNITY_EVENTS_AVATAR_UPLOADED'));
                        $mainframe->redirect(
                            $handler->getFormattedLink(
                                'index.php?option=com_community&view=events&task=viewevent&eventid=' . $eventid,
                                false
                            )
                        );
                        exit;
                    }
                }
            }
        }

        echo $view->get(__FUNCTION__);
    }

    /*
     * group event name
     * object array
     */

    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 save a new wall entry
     *
     * @param message    A message that is submitted by the user
     * @param uniqueId    The unique id for this group
     *
     * */
    public function ajaxSaveWall($message, $uniqueId)
    {
        $response = new JAXResponse();
        $my = CFactory::getUser();
        $filter = InputFilter::getInstance();
        $message = $filter->clean($message, 'string');
        $uniqueId = $filter->clean($uniqueId, 'int');
        $model = $this->getModel('events');

        $event = Table::getInstance('Event', 'CTable');
        $event->load($uniqueId);

        $message = strip_tags($message);

        // Only those who response YES/NO/MAYBE can write on wall
        $eventMembers = Table::getInstance('EventMembers', 'CTable');
        $keys = array('eventId' => $uniqueId, 'memberId' => $my->id);
        $eventMembers->load($keys);

        $allowedStatus = array(
            COMMUNITY_EVENT_STATUS_ATTEND,
            COMMUNITY_EVENT_STATUS_WONTATTEND,
            COMMUNITY_EVENT_STATUS_MAYBE
        );
        //CFactory::load( 'helpers' , 'owner' );
        $config = CFactory::getConfig();

        if ((!in_array($eventMembers->status, $allowedStatus) && !COwnerHelper::isCommunityAdmin() && $config->get(
                    'lockeventwalls'
                )) || $my->id == 0
        ) {
            // Should not even be here unless use try to manipulate ajax call
            Factory::getApplication()->enqueueMessage('PERMISSION DENIED', 'error');
        }

        // If the content is false, the message might be empty.
        if (empty($message)) {
            $response->addAlert(Text::_('COM_COMMUNITY_EMPTY_MESSAGE'));
        } else {
            $isAdmin = $event->isAdmin($my->id);

            // @rule: Spam checks
            if ($config->get('antispam_akismet_walls')) {
                //CFactory::load( 'libraries' , 'spamfilter' );

                $filter = CSpamFilter::getFilter();
                $filter->setAuthor($my->getDisplayName());
                $filter->setMessage($message);
                $filter->setEmail($my->email);
                $filter->setURL(
                    CRoute::_('index.php?option=com_community&view=events&task=viewevent&eventid=' . $uniqueId)
                );
                $filter->setType('message');
                $filter->setIP(CFactory::getClientIP());

                if ($filter->isSpam()) {
                    $response->addAlert(Text::_('COM_COMMUNITY_WALLS_MARKED_SPAM'));
                    return $response->sendResponse();
                }
            }

            // Save the wall content
            $wall = CWallLibrary::saveWall($uniqueId, $message, 'events', $my, $isAdmin, 'events,events');
            $event->addWallCount();


            //CFactory::load( 'helpers' , 'event' );
            $handler = CEventHelper::getHandler($event);

            if ($handler->isPublic()) {
                $actor = $my->id;
                $target = 0;
                $content = $message;
                $cid = $uniqueId;
                $app = 'events';
                $act = $handler->getActivity('events.wall.create', $actor, $target, $content, $cid, $app);
                $act->eventid = $event->id;

                $params = new CParameter('');
                $params->set(
                    'event_url',
                    $handler->getFormattedLink(
                        'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
                        false,
                        true,
                        false
                    )
                );
                $params->set('action', 'events.wall.create');
                $params->set('wallid', $wall->id);


                CActivityStream::add($act, $params->toString());
            }

            // @rule: Add user points
            //CFactory::load( 'libraries' , 'userpoints' );
            CUserPoints::assignPoint('events.wall.create');

            $response->addScriptCall('joms.walls.insert', $wall->content);
        }

        $this->cacheClean(array(COMMUNITY_CACHE_TAG_EVENTS, COMMUNITY_CACHE_TAG_ACTIVITIES));

        return $response->sendResponse();
    }

    public function ajaxRemoveWall($wallId)
    {
        $filter = InputFilter::getInstance();
        $wallId = $filter->clean($wallId, 'int');

        CError::assert($wallId, '', '!empty', __FILE__, __LINE__);

        $response = new JAXResponse();


        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        //@rule: Check if user is really allowed to remove the current wall
        $my = CFactory::getUser();
        $wallModel = $this->getModel('wall');
        $wall = $wallModel->get($wallId);

        $eventModel = $this->getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($wall->contentid);

        if (!COwnerHelper::isCommunityAdmin() && !$event->isAdmin($my->id)) {
            $response->addScriptCall('alert', Text::_('COM_COMMUNITY_NOT_ALLOWED_TO_REMOVE_WALL'));
        } else {
            if (!$wallModel->deletePost($wallId)) {
                $response->addAlert(Text::_('COM_COMMUNITY_GROUPS_REMOVE_WALL_ERROR'));
            } else {
                if ($wall->post_by != 0) {
                    //add user points
                    CUserPoints::assignPoint('wall.remove', $wall->post_by);
                }
            }

            // Substract the count
            $event->substractWallCount();
        }
        $this->cacheClean(array(COMMUNITY_CACHE_TAG_ACTIVITIES));
        return $response->sendResponse();
    }

    /*
     * Return all the events with the given month/year
     */

    public function ajaxGetCalendar($month, $year)
    {
        $response = new JAXResponse();
        $filter = InputFilter::getInstance();

        $year = $filter->clean($year, 'int');
        $month = $filter->clean($month, 'int');

        $calendar_html = CCalendar::generate_calendar($year, $month);

        $response->addScriptCall('joms.events.displayCalendar', $calendar_html);
        return $response->sendResponse();
    }

    public function ajaxGetEvents($day, $month, $year, $group_id, $page_id = 0)
    {
        $response = new JAXResponse();
        $filter = InputFilter::getInstance();
        $my = CFactory::getUser();

        $year = $filter->clean($year, 'int');
        $month = $filter->clean($month, 'int');
        $day = $filter->clean($day, 'int');
        $page_id = $filter->clean($page_id, 'int');
        $group_id = $filter->clean($group_id, 'int');

        //pass in date parameter
        $date = array();
        $date['date'] = $test = $day . '-' . $month . '-' . $year;

        $model = CFactory::getModel('events');
        //@since 2.6
        if ($group_id) {
            $events = $model->getEvents(0, null, null, null, true, false, null, $date, 'group', $group_id);
        } else if ($page_id) {
            $events = $model->getEvents(0, null, null, null, true, false, null, $date, 'page', $page_id);
        } else {
            // this will display every events that is available within groups/private groups that the user participated in
            $events = $model->getEvents(
                0,
                null,
                null,
                null,
                true,
                false,
                null,
                $date
            ); //non filtered events, change this part if anything goes wrong
            //group events
            $group_model = CFactory::getModel('groups');
            $groupids = $group_model->getGroupIds($my->id);

            $group_events = array();
            foreach ($groupids as $gid) {
                $group_events = array_merge(
                    $group_events,
                    $model->getEvents(0, null, null, null, true, false, null, $date, 'group', $gid)
                );
            }

            //page events
            $page_model = CFactory::getModel('pages');
            $pageids = $page_model->getPageIds($my->id);

            $page_events = array();
            foreach ($pageids as $pid) {
                $page_events = array_merge(
                    $page_events,
                    $model->getEvents(0, null, null, null, true, false, null, $date, 'page', $pid)
                );
            }

            $events = array_merge($events, $group_events);
            $events = array_merge($events, $page_events);
        }

        //only pass needed information
        $event_list = array();

        foreach ($events as $event) {
            $event_ref = Table::getInstance('Event', 'CTable');
            $event_ref->bind($event);
            $event_list[] = array(
                "title" => $event->title,
                "link" => $event_ref->getLink(),
                "start" => date('j', strtotime($event->startdate)),
                "end" => date('j', strtotime($event->enddate))
            );
        }

        $response->addScriptCall('joms.events.displayDayEvent', json_encode($event_list));
        return $response->sendResponse();
    }

    protected function _viewEnabled()
    {
        $config = CFactory::getConfig();
        return $config->get('enableevents');
    }

    public function ajaxUpdateStatus($eventId, $status)
    {
        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventId, 'int');
        $status = $filter->clean($status, 'int');
        $target = null;

        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $my = CFactory::getUser();
        $json = array();

        $memberId = $my->id;

        $modal = $this->getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        //CFactory::load( 'helpers' , 'event' );
        $handler = CEventHelper::getHandler($event);

        if (!$handler->isAllowed()) {
            $json['error'] = Text::_('COM_COMMUNITY_ACCESS_FORBIDDEN');
            die( json_encode( $json ) );
        }

        if (($event->ticket) && (($status == COMMUNITY_EVENT_STATUS_ATTEND) && (($event->confirmedcount + 1) > $event->ticket))) {
            $json['error'] = Text::_('COM_COMMUNITY_EVENTS_TICKET_FULL');
            die( json_encode( $json ) );
        }

        $eventMember = Table::getInstance('EventMembers', 'CTable');
        $keys = array('eventId' => $eventId, 'memberId' => $memberId);

        $eventMember->load($keys);

        if ($eventMember->permission != 1 && $eventMember->permission != 2) {
            $eventMember->permission = 3;
        }

        $date = JDate::getInstance();

        $eventMember->created = $date->toSql();
        $eventMember->status = $status;
        $eventMember->store();

        $event->updateGuestStats();
        $event->store();

        // trigger on event join.
        $this->triggerEvents('onEventJoin', $event);

        //activities stream goes here.
        $url = $handler->getFormattedLink(
            'index.php?option=com_community&view=events&task=viewevent&eventid=' . $event->id,
            false
        );

        // We update the activity only if a user attend an event and the event was set to public event
        if ($status == COMMUNITY_EVENT_STATUS_ATTEND && $handler->isPublic()) {
            $command = 'events.attendence.attend';
            $actor = $my->id;
            $target = 0;
            $content = '';
            $cid = $event->id;
            $app = 'events.attend';
            $act = $handler->getActivity($command, $actor, $target, $content, $cid, $app);
            $act->eventid = $event->id;

            $params = new CParameter('');
            $action_str = 'events.attendence.attend';
            $params->set('eventid', $event->id);
            $params->set('action', $action_str);
            $params->set('event_url', $url);

            // Add activity logging
            CActivityStream::addActor($act, $params->toString());

            CUserPoints::assignPoint('events.attend');
        }

        if ($status == COMMUNITY_EVENT_STATUS_WONTATTEND || $status == COMMUNITY_EVENT_STATUS_MAYBE) {
            $command = 'events.attendence.attend';
            $actor = $my->id;
            $target = 0;
            $content = '';
            $cid = $event->id;
            $app = 'events.attend';
            $act = $handler->getActivity($command, $actor, $target, $content, $cid, $app);
            $act->eventid = $event->id;

            $params = new CParameter('');
            $action_str = 'events.attendence.attend';
            $params->set('eventid', $event->id);
            $params->set('action', $action_str);
            $params->set('event_url', $url);
            CActivityStream::removeActor($act, $params->toString());

            if ($status == COMMUNITY_EVENT_STATUS_WONTATTEND) CUserPoints::assignPoint('events.wontattend');
        }

        //trigger goes here.

        $appsLib = CAppPlugins::getInstance();
        $appsLib->loadApplications();

        $params = array();
        $params[] = $event;
        $params[] = $my->id;
        $params[] = $status;

        if (!is_null($target)) {
            $params[] = $target;
        }

        $this->cacheClean(array(COMMUNITY_CACHE_TAG_EVENTS, COMMUNITY_CACHE_TAG_ACTIVITIES));

        $html = CEvents::getEventMemberHTML($event->id);

        if ($status == COMMUNITY_EVENT_STATUS_ATTEND) {
            $RSVPmessage = Text::_('COM_COMMUNITY_EVENTS_ATTENDING_EVENT_MESSAGE');
        } else if ($status == COMMUNITY_EVENT_STATUS_MAYBE) {
            $RSVPmessage = Text::_('COM_COMMUNITY_EVENTS_MAYBE_ATTENDING_EVENT_MESSAGE');
        } else {
            $RSVPmessage = Text::_('COM_COMMUNITY_EVENTS_NOT_ATTENDING_EVENT_MESSAGE');
        }

        $json['success'] = true;
        $json['html'] = $html;
        if ( isset( $RSVPmessage ) ) {
            $json['message'] = $RSVPmessage;
        }

        die( json_encode( $json ) );
    }

    public function ajaxShowMap()
    {
        $objResponse = new JAXResponse();
        $html = 'Maps Go here';
        $objResponse->addScriptCall('cWindowAddContent', $html);
        return $objResponse->sendResponse();
    }

    public function ajaxAddFeatured($eventId)
    {
        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventId, 'int');

        $json = array();

        if (COwnerHelper::isCommunityAdmin()) {
            $model = CFactory::getModel('Featured');

            if (!$model->isExists(FEATURED_EVENTS, $eventId)) {

                $featured = new CFeatured(FEATURED_EVENTS);
                $table = Table::getInstance('Event', 'CTable');
                $table->load($eventId);
                $config = CFactory::getConfig();
                $limit = $config->get('featured' . FEATURED_EVENTS . 'limit', 10);
                $my = CFactory::getUser();

                if ($featured->add($eventId, $my->id) === true) {
                    $json['success'] = true;
                    $json['html'] = Text::sprintf('COM_COMMUNITY_EVENT_IS_FEATURED', $table->title);
                } else {
                    $json['error'] = Text::sprintf('COM_COMMUNITY_EVENT_LIMIT_REACHED_FEATURED', $table->title, $limit);
                }
            } else {
                $json['error'] = Text::_('COM_COMMUNITY_EVENT_ALREADY_FEATURED');
            }
        } else {
            $json['error'] = Text::_('COM_COMMUNITY_NOT_ALLOWED_TO_ACCESS_SECTION');
        }

        //ClearCache in Featured List
        $this->cacheClean(array(COMMUNITY_CACHE_TAG_FEATURED, COMMUNITY_CACHE_TAG_EVENTS));

        die( json_encode($json) );
    }

    public function ajaxRemoveFeatured($eventId)
    {
        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventId, 'int');

        $json = array();

        if (COwnerHelper::isCommunityAdmin()) {
            $model = CFactory::getModel('Featured');

            //CFactory::load( 'libraries' , 'featured' );
            $featured = new CFeatured(FEATURED_EVENTS);
            $my = CFactory::getUser();

            if ($featured->delete($eventId)) {
                $json['success'] = true;
                $json['html'] = Text::_('COM_COMMUNITY_EVENT_REMOVED_FROM_FEATURED');
            } else {
                $json['error'] = Text::_('COM_COMMUNITY_REMOVING_EVENT_FROM_FEATURED_ERROR');
            }
        } else {
            $json['error'] = Text::_('COM_COMMUNITY_NOT_ALLOWED_TO_ACCESS_SECTION');
        }

        //ClearCache in Featured List
        $this->cacheClean(array(COMMUNITY_CACHE_TAG_FEATURED, COMMUNITY_CACHE_TAG_GROUPS));

        die( json_encode($json) );
    }

    public function ajaxShowRepeatOption()
    {
        //CFactory::load( 'libraries' , 'events' );

        $header = Text::_('COM_COMMUNITY_EVENTS_REPEAT');

        $message = CEvents::getEventRepeatSaveHTML();

        $selected = 'joms.jQuery(\'input:radio[name=repeattype]:checked\').val()';
        $action = '<button class="btn" onclick="joms.jQuery(\'#repeataction\').val(' . $selected . ');joms.jQuery(\'#createEvent\').submit()">' . Text::_(
                'COM_COMMUNITY_SAVE_BUTTON'
            ) . '</button><br>';

        $objResponse = new JAXResponse();
        $objResponse->addAssign('cwin_logo', 'innerHTML', $header);
        $objResponse->addScriptCall('cWindowAddContent', $message, $action);

        return $objResponse->sendResponse();
    }

    public function ajaxBanMember($memberId, $eventId){
        $this->updateMemberBan($memberId,$eventId);
    }

    public function ajaxUnbanMember($memberId, $eventId){
        $this->updateMemberBan($memberId,$eventId, false);
    }

    /**
     * @since 4.1 to update member from being banned or ban member
     * @param $memberId
     * @param $eventId
     * @param bool $doBan
     */
    private function updateMemberBan($memberId, $eventId, $doBan = true){
        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventId, 'int');
        $memberId = $filter->clean($memberId, 'int');

        if (!COwnerHelper::isRegisteredUser()) {
            return $this->ajaxBlockUnregister();
        }

        $json = array();
        $my = CFactory::getUser();

        $eventModel = CFactory::getModel('events');
        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        if (!$my->authorise('community.ban', 'events.member.' . $eventId, $event)) {
            $json['error'] = Text::_('COM_COMMUNITY_PERMISSION_DENIED_WARNING');
        } else {
            $member = Table::getInstance('EventMembers', 'CTable');
            $keys = array('eventId' => $event->id, 'memberId' => $memberId);
            $member->load($keys);

            //if user is unbanned, set the stat to non invited yet.
            $member->status = ($doBan) ? COMMUNITY_EVENT_STATUS_BANNED : COMMUNITY_EVENT_STATUS_NOTINVITED;

            $member->store();

            if ($doBan) { //if user is banned, display the appropriate response and color code
                //trigger for onEventBanned
                $this->triggerEvents('onEventBanned', $event, $memberId);
                $json['success'] = true;
                $json['message'] = Text::_('COM_COMMUNITY_EVENTS_MEMBER_BEEN_BANNED');
            } else {
                //trigger for onEventUnbanned
                $this->triggerEvents('onEventUnbanned', $event, $memberId);
                $json['success'] = true;
                $json['message'] = Text::_('COM_COMMUNITY_EVENTS_MEMBER_BEEN_UNBANNED');
            }
        }

        die( json_encode($json) );
    }
    private function _saveRepeatChild($event, $eventChild, $isNew = true, $postData = '')
    {
        $insertList = array();
        $updateList = array();
        $id = 0;

        if ($isNew) {
            $insertList = $eventChild;
        } else {
            // event edit
            $id = $event->id;
            if (isset($postData['repeataction']) && $postData['repeataction'] == 'future') {

                $newList = $eventChild;
                array_shift($newList);

                $model = CFactory::getModel('Events');
                $oldList = $model->getEventChilds($event->parent, array('id' => $event->id));

                // start update old records.
                $db = Factory::getDBO();
                $db->transactionStart();

                // Update existing event child.
                $published = $event->published;
                foreach ($oldList as $key => $value) {
                    if (isset($newList[$key])) {
                        $event->id = $value['id'];
                        $event->startdate = $newList[$key]['startdate'];
                        $event->enddate = $newList[$key]['enddate'];
                        $event->published = $value['published'] == 3 ? $value['published'] : $published;
                        $event->store();
                    } else {
                        break;
                    }
                }

                if (count($newList) > count($oldList)) {
                    // insert new event child
                    $insertList = array_slice($newList, count($oldList));
                } else {
                    if (count($oldList) > count($newList)) {
                        // delete
                        $deleteList = array_slice($oldList, count($newList));
                        $id = array();
                        foreach ($deleteList as $value) {
                            $id[] = $value['id'];
                        }
                        $model->deleteExpiredEvent($id);
                    }
                }

                $db->transactionCommit();
            }
        }

        // Insert new records.
        if (count($insertList) > 0) {
            $db = Factory::getDBO();
            $db->transactionStart();

            foreach ($insertList as $key => $value) {

                $event->id = 0;
                $event->startdate = $value['startdate'];
                $event->enddate = $value['enddate'];
                $event->store();

                $id = $key == 0 && ($id == 0) ? $event->id : $id;

                // Update event member.
                $this->_saveMember($event);

                // Increment the member count
                $event->updateGuestStats();
                $event->store();
            }
            $event->id = $id;

            $db->transactionCommit();
        }
    }

    private function _generateRepeatList($event, $postData = '')
    {
        $day = 0;
        $month = 0;

        $eventList = array();
        $limit = isset($postData['limit']) ? (int)$postData['limit'] : 0;
        $defaultLimit = 0;
        $count = 0;

        // Repeat option.
        switch ($event->repeat) {

            case 'daily':
                $day = 1;
                $defaultLimit = COMMUNITY_EVENT_RECURRING_LIMIT_DAILY;
                break;

            case 'weekly':
                $day = 7;
                $defaultLimit = COMMUNITY_EVENT_RECURRING_LIMIT_WEEKLY;
                break;

            case 'monthly':
                $month = 1;
                $defaultLimit = COMMUNITY_EVENT_RECURRING_LIMIT_MONTHLY;
                break;

            default :
                break;
        }

        $strstartdate = strtotime($event->startdate);
        $starttime = date('H', $strstartdate) . ':' . date('i', $strstartdate) . ':' . date('s', $strstartdate);
        $strenddate = strtotime($event->enddate);
        $endtime = date('H', $strenddate) . ':' . date('i', $strenddate) . ':' . date('s', $strenddate);

        $startdate = date('Y-m-d', $strstartdate);
        $enddate = date('Y-m-d', $strenddate);


        $start = strtotime($event->startdate);
        $end = strtotime($event->enddate);

        // if repeatend is empty, generate dummy date to make it valid.
        if ($event->repeatend == '') {
            $repeatend = $event->enddate;
            // if both repeat end and limit never been set, use default limit.
            $limit = $limit == 0 ? $defaultLimit : $limit;
        } else {
            $repeatend = $event->repeatend;
        }

        $addDay = 0;
        $addMonth = 0;

        // Generate list of event childs in given date.
        while ((CTimeHelper::timeIntervalDifference($repeatend, $enddate) >= 0) || ($count < $limit)) {

            // Add event child as new array item.
            $eventList[] = array('startdate' => $startdate . ' ' . $starttime, 'enddate' => $enddate . ' ' . $endtime);

            // Compute the next event child.
            $addDay += $day;
            $addMonth += $month;

            $startdate = date(
                'Y-m-d',
                mktime(0, 0, 0, date('m', $start) + $addMonth, date('d', $start) + $addDay, date('Y', $start))
            );
            $enddate = date(
                'Y-m-d',
                mktime(0, 0, 0, date('m', $end) + $addMonth, date('d', $end) + $addDay, date('Y', $end))
            );

            $count++;

            // To avoid unnecessary loop.
            if ($count > $defaultLimit) {
                break;
            }
        }
        // SET repeat end date for empty data from import page
        if ($event->repeatend == '') {
            $event->repeatend = $enddate;
        }
        return $eventList;
    }

    private function _saveMember($event)
    {

        // Since this is storing event, we also need to store the creator / admin
        // into the events members table
        $member = Table::getInstance('EventMembers', 'CTable');
        $member->eventid = $event->id;
        $member->memberid = $event->creator;
        $member->created = JDate::getInstance()->toSql();

        // Creator should always be 1 as approved as they are the creator.
        $member->status = COMMUNITY_EVENT_STATUS_ATTEND;

        // @todo: Setup required permissions in the future
        $member->permission = '1';

        $member->store();
    }

    // Add activity stream for new created event.
    private function _addActivityStream($event)
    {

        CEvents::addEventStream($event);
    }

    // send notification email to group's member for new created event.
    private function _addGroupNotification($event)
    {

        CEvents::addGroupNotification($event);
    }

    private function isPublished()
    {
        $my = CFactory::getUser();
        $config = CFactory::getConfig();

        if (!COwnerHelper::isCommunityAdmin()) {
            // set event published = 2 for new created
            return $config->get('event_moderation') ? 2 : 1;
        } else {
            return 1;
        }
    }

    /**
     * Ajax method to display HTML codes to unpublish event
     *
     * @params  string  event The event id that the user is in.
     * */
    public function ajaxShowUnpublishEvent($eventId) {
        JSession::checkToken('post') or jexit(Text::_('COM_COMMUNITY_INVALID_TOKEN'));
        $filter = InputFilter::getInstance();
        $eventId = $filter->clean($eventId, 'int');

        $response = new JAXResponse();

        $model = $this->getModel('events');
        $my = CFactory::getUser();

        $event = Table::getInstance('Event', 'CTable');
        $event->load($eventId);

        $html  = Text::_('COM_COMMUNITY_EVENTS_UNPUBLISH_CONFIRMATION') . ' <strong>' . $event->title . '</strong>?';
        $html .= '<form method="POST" action="' . CRoute::_('index.php?option=com_community&view=events&task=ajaxUnpublishEvent') . '" style="margin:0">';
        $html .= '<input type="hidden" value="' . $eventId . '" name="eventid">';
        $html .= '</form>';

        $json = array(
            'title'  => Text::_('COM_COMMUNITY_EVENTS_UNPUBLISH'),
            'html'   => $html,
            'btnYes' => Text::_('COM_COMMUNITY_YES_BUTTON'),
            'btnNo'  => Text::_('COM_COMMUNITY_NO_BUTTON'),
        );

        die( json_encode($json) );
    }

    public function ajaxUnpublishEvent($eventId=null) {
        JSession::checkToken('post') or jexit(Text::_('COM_COMMUNITY_INVALID_TOKEN'));
        if (!$eventId) {
            return;
        }

        $mainframe = Factory::getApplication();
        $response = new JAXResponse();

        CError::assert($eventId, '', '!empty', __FILE__, __LINE__);
        $json = array();
        if (!CFactory::getUser()->authorise('community.eventeditstate', 'com_community')) {
            $json['error'] = Text::_('COM_COMMUNITY_ACCESS_FORBIDDEN');
        } else {
            $event = Table::getInstance('Event', 'CTable');
            $event->load($eventId);

            if ($event->id == 0) {
                $json['error'] = Text::_('COM_COMMUNITY_EVENTS_ID_NOITEM');
            } else {
                $event->published = 0;

                if ($event->store()) {
                    $json['message'] = Text::_('COM_COMMUNITY_EVENTS_UNPUBLISH_SUCCESS');
                    $json['redirect'] = CRoute::_('index.php?option=com_community&view=events', false);
                    $json['btnDone'] = Text::_('COM_COMMUNITY_DONE_BUTTON');
                } else {
                    $json['error'] = Text::_('COM_COMMUNITY_GROUPS_SAVE_ERROR');
                }
            }
        }
        die(json_encode($json));
    }
}
