<?php
/**
 * [PHPFOX_HEADER]
 */

defined('PHPFOX') or exit('NO DICE!');

/**
 * 
 * 
 * @copyright		[PHPFOX_COPYRIGHT]
 * @author  		Raymond_Benc
 * @package 		Phpfox_Service
 * @version 		$Id: pages.class.php 7234 2014-03-27 14:40:29Z Fern $
 */
abstract class Phpfox_Pages_Pages extends Phpfox_Service
{
	protected $_bIsInViewMode = false;

	protected $_aPage = null;
	
	protected $_aRow = array();
	
	protected $_bIsInPage = false;
	
	protected $_aWidgetMenus = array();
	protected $_aWidgetUrl = array();
	protected $_aWidgetBlocks = array();
	protected $_aWidgets = array();
	protected $_aWidgetEdit = array();
	
	/**
	 * Class constructor
	 */	
	public function __construct()
	{	
		$this->_sTable = Phpfox::getT('pages');
	}

	/**
	 * @return Phpfox_Pages_Facade
	 */
	abstract public function getFacade();

	public function isTimelinePage($iPageId)
	{
		return ((int) $this->database()->select('COUNT(*)')
			->from(Phpfox::getT('pages'))
			->where('page_id = ' . (int) $iPageId . ' AND use_timeline = 1')
			->execute('getSlaveField') ? true : false);	
	}
	
	public function setMode($bMode = true)
	{
		$this->_bIsInViewMode = $bMode;
	}
	
	public function isViewMode()
	{
		return (bool) $this->_bIsInViewMode;
	}
	
	public function setIsInPage()
	{
		$this->_bIsInPage = true;		
	}
	
	public function isInPage()
	{
		return $this->_bIsInPage;
	}
	
	public function buildWidgets($iId)
	{		
		if (!$this->getFacade()->getItems()->hasPerm($iId, $this->getFacade()->getItemType() . '.view_browse_widgets'))
		{
			return;
		}
		
		$aWidgets = $this->database()->select('pw.*, pwt.text_parsed AS text')
			->from(Phpfox::getT('pages_widget'), 'pw')
			->join(Phpfox::getT('pages_widget_text'), 'pwt', 'pwt.widget_id = pw.widget_id')
			->where('pw.page_id = ' . (int) $iId)
			->execute('getSlaveRows');

		foreach ($aWidgets as $aWidget)
		{
			$this->_aWidgetEdit[] = array(
				'widget_id' => $aWidget['widget_id'],
				'title' => $aWidget['title']
			);

			if (!$aWidget['is_block'])
            {
                $this->_aWidgetMenus[] = array(
                    'phrase' => $aWidget['menu_title'],
                    'url' => $this->getUrl($aWidget['page_id'], $this->_aRow['title'], $this->_aRow['vanity_url']) . $aWidget['url_title'] . '/',
                    'landing' => $aWidget['url_title'],
                    'icon_pass' => (empty($aWidget['image_path']) ? false : true),
                    'icon' => $aWidget['image_path'],
                    'icon_server' => $aWidget['image_server_id']
                );
            }
			
			$this->_aWidgetUrl[$aWidget['url_title']] = $aWidget['widget_id'];
			
			if ($aWidget['is_block'])
			{
				$this->_aWidgetBlocks[] = $aWidget;
			}
			else
			{
				$this->_aWidgets[$aWidget['url_title']] = $aWidget;
			}			
		}
	}	
	
	public function getForEditWidget($iId)
	{
		$aWidget = $this->database()->select('pw.*, pwt.text_parsed AS text')
			->from(Phpfox::getT('pages_widget'), 'pw')
			->join(Phpfox::getT('pages_widget_text'), 'pwt', 'pwt.widget_id = pw.widget_id')
			->where('pw.widget_id = ' . (int) $iId)
			->execute('getSlaveRow');	
		
		if (!isset($aWidget['widget_id']))
		{
			return false;
		}
		
		$aPage = $this->getPage($aWidget['page_id']);
		
		if (!isset($aPage['page_id']))
		{
			return false;
		}
		
		if (!$this->isAdmin($aPage))
		{
			if (!$this->getFacade()->getUserParam('can_moderate_pages'))
			{
				return false;
			}
		}

		$aWidget['text'] = str_replace(array('<br />', '<br>', '<br/>'), "\n", $aWidget['text']);
		
		return $aWidget;
	}
	
	public function getWidgetsForEdit()
	{
		return $this->_aWidgetEdit;
	}
	
	public function isWidget($sUrl)
	{
		return (isset($this->_aWidgetUrl[$sUrl]) ? true : false);
	}
	
	public function getWidget($sUrl)
	{
		return $this->_aWidgets[$sUrl];
	}
	
	public function getWidgetBlocks()
	{
		return $this->_aWidgetBlocks;
	}
	
	public function getForProfile($iUserId, $iLimit = 0, $bNoCount = false, $sConds = '')
	{
		if ($bNoCount == false)
      	{
            $iCnt = $this->database()->select('p.*, pu.vanity_url, u.server_id, ' . Phpfox::getUserField())
				->from(Phpfox::getT('like'), 'l')			
				->join(Phpfox::getT('pages'), 'p', 'p.page_id = l.item_id AND p.view_id = 0 AND p.item_type = ' . $this->getFacade()->getItemTypeId())
				->join(Phpfox::getT('user'), 'u', 'u.profile_page_id = p.page_id')
				->leftJoin(Phpfox::getT('pages_url'), 'pu', 'pu.page_id = p.page_id')
				->where('l.type_id = \'' . $this->getFacade()->getItemType() . '\' AND l.user_id = ' . (int) $iUserId . $sConds)
                ->group('p.page_id', true) // fixes displaying duplicate pages if there are duplicate likes
                ->order('l.time_stamp DESC')
				->execute('getSlaveRows');
            $iCnt = count($iCnt);
            
        }
		
		if ($iLimit) {
			$aPages = $this->database()->select('p.*, pu.vanity_url, u.server_id, ' . Phpfox::getUserField())
				->from(Phpfox::getT('like'), 'l')			
				->join(Phpfox::getT('pages'), 'p', 'p.page_id = l.item_id AND p.view_id = 0 AND p.item_type = ' . $this->getFacade()->getItemTypeId())
				->join(Phpfox::getT('user'), 'u', 'u.profile_page_id = p.page_id')
				->leftJoin(Phpfox::getT('pages_url'), 'pu', 'pu.page_id = p.page_id')
				->where('l.type_id = \'' . $this->getFacade()->getItemType() . '\' AND l.user_id = ' . (int) $iUserId . $sConds)
                ->group('p.page_id', true) // fixes displaying duplicate pages if there are duplicate likes
                ->order('l.time_stamp DESC')
				->limit($iLimit)
				->execute('getSlaveRows');
		}		
		else {
			$aPages = $this->database()->select('p.*, pu.vanity_url, u.server_id, ' . Phpfox::getUserField())
				->from(Phpfox::getT('like'), 'l')			
				->join(Phpfox::getT('pages'), 'p', 'p.page_id = l.item_id AND p.view_id = 0 AND p.item_type = ' . $this->getFacade()->getItemTypeId())
				->join(Phpfox::getT('user'), 'u', 'u.profile_page_id = p.page_id')
				->leftJoin(Phpfox::getT('pages_url'), 'pu', 'pu.page_id = p.page_id')
				->where('l.type_id = \'' . $this->getFacade()->getItemType() . '\' AND l.user_id = ' . (int) $iUserId . $sConds)
                ->group('p.page_id', true) // fixes displaying duplicate pages if there are duplicate likes
                ->order('l.time_stamp DESC')
				->execute('getSlaveRows');
		}		
	
		foreach ($aPages as $iKey => $aPage)
		{
			$aPages[$iKey]['is_app'] = false;

			$aPages[$iKey]['is_user_page'] = true;
			$aPages[$iKey]['user_image'] = $aPage['image_path'];
			$aPages[$iKey]['url'] = $this->getUrl($aPage['page_id'], $aPage['title'], $aPage['vanity_url']);
		}
		
		return array($iCnt, $aPages);
	}
	
	public function getForView($mId)
	{
		if ($this->_aPage !== null)
		{
			$mId = $this->_aPage['page_id'];
		}

		$pageUserId  = Phpfox::getUserId();
		
		if (Phpfox::isModule('friend'))
		{
			$this->database()->select('f.friend_id AS is_friend, ')->leftJoin(Phpfox::getT('friend'), 'f', "f.user_id = p.user_id AND f.friend_user_id = " . $pageUserId);
		}			
		
		if(Phpfox::isModule('like'))
		{
			$this->database()->select('l.like_id AS is_liked, ')
					->leftJoin(Phpfox::getT('like'), 'l', 'l.type_id = \'' . $this->getFacade()->getItemType() . '\' AND l.item_id = p.page_id AND l.user_id = ' . $pageUserId);
		}
		
		$this->_aRow = $this->database()->select('p.*, u.user_image as image_path, p.image_path as pages_image_path, u.user_id as page_user_id, p.use_timeline, pc.claim_id, pu.vanity_url, pg.name AS category_name, pg.page_type, pt.text_parsed AS text, u.full_name, ts.style_id AS designer_style_id, ts.folder AS designer_style_folder, t.folder AS designer_theme_folder, t.total_column, ts.l_width, ts.c_width, ts.r_width, t.parent_id AS theme_parent_id, p_type.name AS parent_category_name, ' . Phpfox::getUserField('u2', 'owner_'))
			->from($this->_sTable, 'p')
			->join(Phpfox::getT('pages_text'), 'pt', 'pt.page_id = p.page_id')
			->join(Phpfox::getT('user'), 'u', 'u.profile_page_id = p.page_id')
			->join(Phpfox::getT('user'), 'u2', 'u2.user_id = p.user_id')
			->leftJoin(Phpfox::getT('pages_url'), 'pu', 'pu.page_id = p.page_id')
			->leftJoin(Phpfox::getT('pages_category'), 'pg', 'pg.category_id = p.category_id')
			->leftJoin(Phpfox::getT('pages_type'), 'p_type', 'p_type.type_id = pg.type_id')
			->leftJoin(Phpfox::getT('theme_style'), 'ts', 'ts.style_id = p.designer_style_id')
			->leftJoin(Phpfox::getT('theme'), 't', 't.theme_id = ts.theme_id')				
			->leftJoin(Phpfox::getT('pages_claim'), 'pc','pc.page_id = p.page_id AND pc.user_id = ' . Phpfox::getUserId())
			->where('p.page_id = ' . (int) $mId . ' AND p.item_type = ' . $this->getFacade()->getItemTypeId())
			->execute('getSlaveRow');

		if (!isset($this->_aRow['page_id']))
		{
			return false;
		}

		$this->_aRow['is_page'] = true;
		$this->_aRow['is_admin'] = $this->isAdmin($this->_aRow);		
		$this->_aRow['link'] = $this->getFacade()->getItems()->getUrl($this->_aRow['page_id'], $this->_aRow['title'], $this->_aRow['vanity_url']);		
		
		if (($this->_aRow['page_type'] == '1' || $this->_aRow['item_type'] != '0') && $this->_aRow['reg_method'] == '1')
		{
			$this->_aRow['is_reg'] = (int) $this->database()->select('COUNT(*)')
				->from(Phpfox::getT('pages_signup'))
				->where('page_id = ' . (int) $this->_aRow['page_id'] . ' AND user_id = ' . Phpfox::getUserId())
				->execute('getSlaveField');
		}
		
		if ($this->_aRow['reg_method'] == '2' && Phpfox::isUser())
		{
			$this->_aRow['is_invited'] = (int) $this->database()->select('COUNT(*)')
				->from(Phpfox::getT('pages_invite'))
				->where('page_id = ' . (int) $this->_aRow['page_id'] . ' AND invited_user_id = ' . Phpfox::getUserId())
				->execute('getSlaveField');
			
			if (!$this->_aRow['is_invited'])
			{
				unset($this->_aRow['is_invited']);
			}
		}

		if (empty($this->_aRow['category_name']) && ($type = $this->getFacade()->getType()->getById($this->_aRow['type_id']))) {
			$this->_aRow['category_name'] = $type['name'];
		}

		if ($this->_aRow['page_id'] == Phpfox::getUserBy('profile_page_id'))
		{
			$this->_aRow['is_liked'] = true;
		}
		
		// Issue with like/join button
		// Still not defined
		if (!isset($this->_aRow['is_liked']))
		{
			// make it false: not liked or joined yet
			$this->_aRow['is_liked'] = false;
		}
		
		if ($this->_aRow['app_id'])
		{			
			if ($this->_aRow['aApp'] = Phpfox::getService('apps')->getForPage($this->_aRow['app_id']))
			{
				$this->_aRow['is_app'] = true;
				$this->_aRow['title'] = $this->_aRow['aApp']['app_title'];
				$this->_aRow['category_name'] = 'App';
			}
		}
		else
		{
			$this->_aRow['is_app'] = false;
		}		
		
		return $this->_aRow;
	}

	public function getActivePage() {
		return $this->_aRow;
	}
	
	public function isMember($iPage)
	{
		if (empty($this->_aRow))
		{
			$this->_aRow = $this->getForView($iPage);
		}
		if (!isset($this->_aRow['page_id']))
		{
			return false;
		}

		if ($this->_aRow['page_id'] == Phpfox::getUserBy('profile_page_id'))
		{
			return true;
		}		
		
		return ((isset($this->_aRow['is_liked']) && $this->_aRow['is_liked']) ? true : false);
	}
	
	public function getPageAdmins($iId = null)
	{
		if ($iId != null && empty($this->_aRow)) {
			$this->getForView($iId);
		}
		$aOwnerAdmin = array();
		foreach ($this->_aRow as $sKey => $mValue)
		{
			if (substr($sKey, 0, 6) == 'owner_')
			{
				$aOwnerAdmin[0][str_replace('owner_', '', $sKey)] = $mValue;
			}
		}
		
		$aPageAdmins = $this->database()->select(Phpfox::getUserField())
			->from(Phpfox::getT('pages_admin'), 'pa')
			->join(Phpfox::getT('user'), 'u', 'u.user_id = pa.user_id')
			->where('pa.page_id = ' . (int) $this->_aRow['page_id'])
			->execute('getSlaveRows');
		
		$aAdmins = array_merge($aOwnerAdmin, $aPageAdmins);	

		return $aAdmins;
	}
	
	public function isAdmin($aPage, $iUserId = null)
	{
        if (!isset($iUserId) || empty($iUserId)){
            $iUserId = Phpfox::getUserId();
        }
		if (!Phpfox::isUser() || empty($aPage))
		{
			return false;
		}
		
		if (is_numeric($aPage))
		{
			$aPage = $this->getPage($aPage);
		}

		if (empty($aPage))
		{
			$aPage = $this->getPage();
		}
		
        if (!isset($aPage['page_id']))
        {
            return false;
        }
        
		if (isset($aPage['page_id']) && $aPage['page_id'] == Phpfox::getUserBy('profile_page_id'))
		{
			return true;
		}

		if ($aPage['user_id'] == $iUserId)
		{
			return true;
		}

		if (User_Service_User::instance()->isAdminUser($iUserId, false))
		{
			return true;
		}

		$iAdmin = (int) $this->database()->select('COUNT(*)')
			->from(Phpfox::getT('pages_admin'))
			->where('page_id = ' . (int) $aPage['page_id'] . ' AND user_id = ' . (int) $iUserId)
			->execute('getSlaveField');
		
		if ($iAdmin)
		{
			return true;
		}
		
		return false;
	}
	
	public function getPage($iId = null)
	{
		static $aRow = null;
		
		if (is_array($aRow) && $iId === null)
		{
			return $aRow;
		}
		
		if(Phpfox::isModule('like'))
		{
			$this->database()->select('l.like_id AS is_liked, ')
					->leftJoin(Phpfox::getT('like'), 'l', 'l.type_id = \'' . $this->getFacade()->getItemType() . '\' AND l.item_id = p.page_id AND l.user_id = ' . Phpfox::getUserId());
		}
		
		$aRow = $this->database()->select('p.*, pu.vanity_url, pg.name AS category_name, pg.page_type')
			->from($this->_sTable, 'p')			
			->leftJoin(Phpfox::getT('pages_url'), 'pu', 'pu.page_id = p.page_id')
			->leftJoin(Phpfox::getT('pages_category'), 'pg', 'pg.category_id = p.category_id')		
			->where('p.page_id = ' . (int) $iId . ' AND p.item_type = ' . $this->getFacade()->getItemTypeId())
			->execute('getSlaveRow');
		
		if (empty($aRow) && $iId === null)
		{
			return false;
		}

		if (!isset($aRow['page_id']))
		{
			return Phpfox_Error::set($this->getFacade()->getPhrase('unable_to_find_the_page_you_are_looking_for'));
		}

		if (empty($aRow['category_name']) && ($type = $this->getFacade()->getType()->getById($aRow['type_id']))) {
			$aRow['category_name'] = $type['name'];
		}
		
		if (empty($this->_aRow))
		{
			$this->_aRow = $aRow;
		}
		
		if ($this->_aRow['page_id'] == Phpfox::getUserBy('profile_page_id'))
		{
			$this->_aRow['is_liked'] = true;
		}
		
		// Issue with like/join button
		// Still not defined
		if (!isset($this->_aRow['is_liked']))
		{
			// make it false: not liked or joined yet
			$this->_aRow['is_liked'] = false;
		}

		return $aRow;
	}
	
	public function getMyPages()
	{
		$aRows = $this->database()->select('p.*, pu.vanity_url, ' . Phpfox::getUserField())
			->from($this->_sTable, 'p')			
			->join(Phpfox::getT('user'), 'u', 'u.profile_page_id = p.page_id')
			->leftJoin(Phpfox::getT('pages_url'), 'pu', 'pu.page_id = p.page_id')
			->where('p.view_id = 0 AND p.user_id = ' . Phpfox::getUserId())			
			->order('p.time_stamp DESC')
			->execute('getSlaveRows');
		
		foreach ($aRows as $iKey => $aRow)
		{
			$aRows[$iKey]['link'] = $this->getFacade()->getItems()->getUrl($aRow['page_id'], $aRow['title'], $aRow['vanity_url']);
		}
		
		return $aRows;
	}
	
	public function getUrl($iPageId, $sTitle = null, $sVanityUrl = null, $bIsGroup = false)
	{
		if ($sTitle === null && $sVanityUrl === null)
		{
			$aPage = $this->getPage($iPageId);
			$sTitle = $aPage['title'];
			$sVanityUrl = $aPage['vanity_url'];
		}
		
		if (!empty($sVanityUrl))
		{
			return Phpfox_Url::instance()->makeUrl($sVanityUrl);
		}

		return Phpfox_Url::instance()->makeUrl($this->getFacade()->getItemType(), $iPageId);
	}
	
	public function isPage($sUrl)
	{
		$aPage = $this->database()->select('pu.*')
			->from(Phpfox::getT('pages_url'), 'pu')
			->join(':pages', 'p', 'p.page_id = pu.page_id')
			->where('pu.vanity_url = \'' . $this->database()->escape($sUrl) . '\' AND p.item_type = '. $this->getFacade()->getItemTypeId())
			->execute('getSlaveRow');
		
		if (!isset($aPage['page_id']))
		{
			return false;
		}
		
		$this->_aPage = $aPage;
		
		return true;
	}
	
	public function getMenu($aPage)
	{
		$aMenus = array();

		if ($this->isAdmin($aPage))
		{
			$iTotalPendingMembers = $this->database()->select('COUNT(*)')
				->from(Phpfox::getT('pages_signup'))
				->where('page_id = ' . (int) $aPage['page_id'])
				->execute('getSlaveField');
			
			if ($iTotalPendingMembers > 0)
			{
				Phpfox_Template::instance()->assign('aSubPagesMenus', [
					[
						'url' => $this->getFacade()->getItems()->getUrl($aPage['page_id'], $aPage['title'], $aPage['vanity_url']) . 'pending/',
						'title' => $this->getFacade()->getPhrase('pending_memberships') . '<span class="pending">&nbsp;(' . $iTotalPendingMembers . ')</span>'
					]
				]);
			}
		}
		
		$aMenus[] = array(
			'phrase' => $this->getFacade()->getPhrase('home'),
			'url' => $this->getFacade()->getItems()->getUrl($aPage['page_id'], $aPage['title'], $aPage['vanity_url']) . (empty($aPage['landing_page']) ? '' : 'wall/'),
			'icon' => 'misc/comment.png',
			'landing' => ''
		);

		$aMenus[] = array(
			'phrase' => $this->getFacade()->getPhrase('info'),
			'url' => $this->getFacade()->getItems()->getUrl($aPage['page_id'], $aPage['title'], $aPage['vanity_url']) . 'info/',
			'icon' => 'misc/comment.png',
			'landing' => 'info'
		);

		switch($this->getFacade()->getItemType()) {
			case 'pages':
				$aModuleCalls = Phpfox::massCallback('getPageMenu', $aPage);
				break;

			case 'groups':
				$aModuleCalls = Phpfox::massCallback('getGroupMenu', $aPage);
				break;

			default:
				$aModuleCalls = [];
				
		}
		
		foreach ($aModuleCalls as $sModule => $aModuleCall) {
			if (!is_array($aModuleCall))
			{
				continue;
			}
			$aMenus[] = $aModuleCall[0];
		}

		if (count($this->_aWidgetMenus))
		{
			$aMenus = array_merge($aMenus, $this->_aWidgetMenus);
		}

		if ($sPlugin = Phpfox_Plugin::get($this->getFacade()->getItemType() . '.service_pages_getmenu')){eval($sPlugin);}

		return $aMenus;	
	}	
	
	public function getForEdit($iId)
	{
		static $aRow = null;
		
		if (is_array($aRow))
		{
			return $aRow;
		}
		
		$aRow = $this->database()->select('p.*, pu.vanity_url, pt.text, pc.page_type, p_type.item_type')
			->from($this->_sTable, 'p')			
			->join(Phpfox::getT('pages_text'), 'pt', 'pt.page_id = p.page_id')
			->leftJoin(Phpfox::getT('pages_category'), 'pc', 'p.category_id = pc.category_id')
			->leftJoin(Phpfox::getT('pages_type'), 'p_type', 'p_type.type_id = pc.type_id')
			->leftJoin(Phpfox::getT('pages_url'), 'pu', 'pu.page_id = p.page_id')			
			->where('p.page_id = ' . (int) $iId)			
			->execute('getSlaveRow');

		if (!isset($aRow['page_id']))
		{
			return Phpfox_Error::set($this->getFacade()->getPhrase('unable_to_find_the_page_you_are_trying_to_edit'));
		}
		
		if (!$this->isAdmin($aRow))
		{
			if (!$this->getFacade()->getUserParam('can_moderate_pages'))
			{
				return Phpfox_Error::set($this->getFacade()->getPhrase('you_are_unable_to_edit_this_page'));
			}
		}
		
		$this->_aRow = $aRow;
		
		$this->getFacade()->getItems()->buildWidgets($aRow['page_id']);
		
		$aRow['admins'] = $this->database()->select(Phpfox::getUserField())
			->from(Phpfox::getT('pages_admin'), 'pa')
			->join(Phpfox::getT('user'), 'u', 'u.user_id = pa.user_id')
			->where('pa.page_id = ' . (int) $aRow['page_id'])
			->execute('getSlaveRows');
		
		$aMenus = $this->getMenu($aRow);		
		foreach ($aMenus as $iKey => $aMenu)
		{
			$aMenus[$iKey]['is_selected'] = false;
		}		
		if (!empty($aRow['landing_page']))
		{
			foreach ($aMenus as $iKey => $aMenu)
			{
				if ($aMenu['landing'] == $aRow['landing_page'])
				{
					$aMenus[$iKey]['is_selected'] = true;
				}
			}
		}

		$aRow['landing_pages'] = $aMenus;
		
		if ($aRow['app_id'])
		{			
			if ($aRow['aApp'] = Phpfox::getService('apps')->getForPage($aRow['app_id']))
			{
				$aRow['is_app'] = true;
				$aRow['title'] = $aRow['aApp']['app_title'];				
			}
		}
		else
		{
			$aRow['is_app'] = false;
		}			
		if ($sPlugin = Phpfox_Plugin::get($this->getFacade()->getItemType() . '.service_pages_getforedit_1')){eval($sPlugin);if (isset($mReturnFromPlugin)){return $mReturnFromPlugin;}}
		
		define('PHPFOX_PAGES_EDIT_ID', $aRow['page_id']);
		
		
		$aRow['location']['name'] = $aRow['location_name'];
		return $aRow;		
	}
	
	public function getCurrentInvites($iPageId)
	{
		$aRows = $this->database()->select('*')
			->from(Phpfox::getT('pages_invite'))
			->where('page_id = ' . (int) $iPageId . ' AND type_id = 0 AND user_id = ' . Phpfox::getUserId())
			->execute('getSlaveRows');
		
		$aInvites = array();
		foreach ($aRows as $aRow)
		{
			$aInvites[$aRow['invited_user_id']] = $aRow;
		}
		
		return $aInvites;
	}

    public function isInvited($iPageId){
        $iCnt = $this->database()->select('COUNT(*)')
            ->from(':pages_invite')
            ->where('page_id = ' . (int) $iPageId . ' AND type_id = 0 AND invited_user_id = ' . Phpfox::getUserId())
            ->execute('getSlaveField');
        return ($iCnt) ? true : false;
    }

	public function getMembers($iPage, $iLimit = null)
	{
		if (!Phpfox::isModule('like'))
		{
			return false;
		}
		return Like_Service_Like::instance()->getForMembers($this->getFacade()->getItemType(), $iPage, $iLimit);
	}
	
	public function getPerms($iPage)
	{
		switch($this->getFacade()->getItemType()) {
			case 'pages':
				$aCallbacks = Phpfox::massCallback('getPagePerms');
				break;

			case 'groups':
				$aCallbacks = Phpfox::massCallback('getGroupPerms');
				break;

			default:
				$aCallbacks = [];

		}
		$aPerms = array();
		$aUserPerms = $this->getPermsForPage($iPage);
		foreach ($aCallbacks as $aCallback)
		{
			foreach ($aCallback as $sId => $sPhrase)
			{
				$aPerms[] = array(
					'id' => $sId,
					'phrase' => $sPhrase,
					'is_active' => (isset($aUserPerms[$sId]) ? $aUserPerms[$sId] : '0')
				);	
			}			
		}	
		
		return $aPerms;
	}

	public function getPermsForPage($iPage)
	{
		static $aPerms = null;

		if (isset($aPerms[$iPage]) && is_array($aPerms[$iPage]))
		{
			return $aPerms[$iPage];
		}

		$aPerms[$iPage] = array();
		$aRows = $this->database()->select('*')
			->from(Phpfox::getT('pages_perm'))
			->where('page_id = ' . (int) $iPage)
			->execute('getSlaveRows');

		foreach ($aRows as $aRow)
		{
			$aPerms[$iPage][$aRow['var_name']] = (int) $aRow['var_value'];
		}

		return $aPerms[$iPage];
	}
	
	public function getPendingUsers($iPage)
	{
		$aUsers = $this->database()->select('ps.*, ' . Phpfox::getUserField())
			->from(Phpfox::getT('pages_signup'), 'ps')
			->join(Phpfox::getT('user'), 'u', 'u.user_id = ps.user_id')
			->where('ps.page_id = ' . (int) $iPage)
			->execute('getSlaveRows');

		return $aUsers;
	}

	public function hasPerm($iPage = null, $sPerm)
	{
        if (Phpfox::isAdmin()){
            return true;
        }
		if (defined('PHPFOX_IS_PAGES_VIEW') && Phpfox::getUserParam('core.can_view_private_items')) {
			return true;
		}

		if (defined('PHPFOX_POSTING_AS_PAGE')) {
			return true;
		}


		if ($iPage === null)
		{
			$iPage = $this->_aRow['page_id'];
		}
		$aPerms = $this->getPermsForPage($iPage);
		if (isset($aPerms[$sPerm]))
		{
			switch ((int) $aPerms[$sPerm])
			{
				case 1:
					if (!$this->isMember($iPage))
					{
						return false;
					}
					break;
				case 2:
					if (!$this->isAdmin($iPage))
					{
						return false;
					}
					break;
			}
		}
		return true;
	}
	
	public function getPendingTotal()
	{
		return (int) $this->database()->select('COUNT(*)')
			->from(Phpfox::getT('pages'))
			->where('app_id = 0 AND view_id = 1 AND item_type = ' . $this->getFacade()->getItemTypeId())
			->execute('getSlaveField');		
	}		
	
	public function getLastLogin()
	{
		static $aUser = null;
		
		if ($aUser !== null)
		{
			return $aUser;
		}
		
		$this->database()->join(Phpfox::getT('user'), 'u', 'u.user_id = pl.user_id');
		
		if (($sPlugin = Phpfox_Plugin::get($this->getFacade()->getItemType() . '.service_pages_getlastlogin')))
		{
			eval($sPlugin);
		}		
		
		$aUser = $this->database()->select(Phpfox::getUserField() . ', u.email, u.style_id, u.password')
			->from(Phpfox::getT('pages_login'), 'pl')			
			->where('pl.login_id = ' . (int) Phpfox::getCookie('page_login') . ' AND pl.page_id = ' . Phpfox::getUserBy('profile_page_id'))
			->execute('getSlaveRow');
		
		if (!isset($aUser['user_id']))
		{
			$aUser = false;
			
			return false;
		}
		
		return $aUser;
	}
	
	public function getMyAdminPages($iLimit = 0)
	{
		$sCacheId = $this->cache()->set(array($this->getFacade()->getItemType(), Phpfox::getUserId()));
        
		if (!($aRows = $this->cache()->get($sCacheId)))
		{
				$iCntAdmins = $this->database()->select('COUNT(*)')
					->from(Phpfox::getT('pages_admin'), 'pa')
					->leftJoin(Phpfox::getT('pages'), 'pages', 'pages.page_id = pa.page_id')
					->where('pa.user_id = ' . Phpfox::getUserId())
					->execute('getSlaveField');		
				
			
				$this->database()->select('pages.*')
					->from(Phpfox::getT('pages'), 'pages')				
					->where('pages.app_id = 0 AND pages.view_id = 0 AND pages.user_id = ' . Phpfox::getUserId())							
					->union();		
	
	            if ($iCntAdmins > 0)
	            {
	                $this->database()->select('pages.*')
						->from(Phpfox::getT('pages_admin'), 'pa')
						->leftJoin(Phpfox::getT('pages'), 'pages', 'pages.page_id = pa.page_id')				
						->where('pa.user_id = ' . Phpfox::getUserId())							
						->union();
	            }					
				
				if ($iLimit > 0)
				{
					$this->database()->limit($iLimit);
				}
	
				$aRows = $this->database()->select('pages.*, pu.vanity_url, ' . Phpfox::getUserField())
					->unionFrom('pages')
					->join(Phpfox::getT('user'), 'u', 'u.profile_page_id = pages.page_id')
					->leftJoin(Phpfox::getT('pages_url'), 'pu', 'pu.page_id = pages.page_id')	
					->group('pages.page_id', true)
					->execute('getSlaveRows');	
	
				foreach ($aRows as $iKey => $aRow)
				{
					$aRows[$iKey]['link'] = $this->getFacade()->getItems()->getUrl($aRow['page_id'], $aRow['title'], $aRow['vanity_url']);
				}

				$this->cache()->save($sCacheId, $aRows);
		}
		
		if (!is_array($aRows))
		{
			$aRows = array();
		}		
		
		return $aRows;
	}
	
	public function getMyLoginPages($iPage, $iPageSize)
	{
		$sCacheId = $this->cache()->set(array('login_pages', Phpfox::getUserId()));
		$from_cache = $this->cache()->get($sCacheId);
		if ($from_cache === false) {
			$iCntAdmins = $this->database()->select('COUNT(*)')
				->from(Phpfox::getT('pages_admin'), 'pa')
				->leftJoin(Phpfox::getT('pages'), 'pages', 'pages.page_id = pa.page_id')
				->where('pa.user_id = ' . Phpfox::getUserId())
				->execute('getSlaveField');

			$iCnt = $this->database()->select('COUNT(*)')
				->from(Phpfox::getT('pages'))
				->where('view_id = 0 AND app_id = 0 AND user_id = ' . Phpfox::getUserId())
				->execute('getSlaveField');

			$iCnt += $iCntAdmins;

			$this->database()->select('pages.*')
				->from(Phpfox::getT('pages'), 'pages')
				->where('pages.app_id = 0 AND pages.view_id = 0 AND pages.user_id = ' . Phpfox::getUserId())
				->union();

			if ($iCntAdmins > 0) {
				$this->database()->select('pages.*')
					->from(Phpfox::getT('pages_admin'), 'pa')
					->leftJoin(Phpfox::getT('pages'), 'pages', 'pages.page_id = pa.page_id')
					->where('pa.user_id = ' . Phpfox::getUserId())
					->union();
			}

			$this->database()->limit($iPage, $iPageSize, $iCnt);

			$aRows = $this->database()->select('pages.*, pu.vanity_url, ' . Phpfox::getUserField())
				->unionFrom('pages')
				->join(Phpfox::getT('user'), 'u', 'u.profile_page_id = pages.page_id')
				->leftJoin(Phpfox::getT('pages_url'), 'pu', 'pu.page_id = pages.page_id')
                ->group('pages.page_id', true)
				->order('pages.time_stamp DESC')
				->execute('getSlaveRows');

			foreach ($aRows as $iKey => $aRow) {
				$aRows[$iKey]['link'] = $this->getFacade()->getItems()->getUrl($aRow['page_id'], $aRow['title'], $aRow['vanity_url']);
			}

			$this->cache()->save($sCacheId, [$iCnt, $aRows]);

			list($iCnt, $aRows) = $this->cache()->get($sCacheId);
		} else {
			list($iCnt, $aRows) = $from_cache;
		}

		return array($iCnt, $aRows);
	}
	
	public function getClaims()
	{
		$aClaims = $this->database()->select('pc.*, u.full_name, u.user_name, p1.page_id, p1.title, curruser.user_id as curruser_user_id, curruser.full_name as curruser_full_name, curruser.user_name as curruser_user_name')
			->from(Phpfox::getT('pages_claim'), 'pc')
			->join(Phpfox::getT('user'), 'u', 'u.user_id = pc.user_id')			
			->join(Phpfox::getT('pages'), 'p1', 'p1.page_id = pc.page_id')
			->join(Phpfox::getT('user'), 'curruser', 'curruser.user_id = p1.user_id')
			->where('pc.status_id = 1')
			->order('pc.time_stamp')
			->execute('getSlaveRows');
		
		foreach ($aClaims as $iIndex => $aClaim)
		{
			$aClaims[$iIndex]['url'] = Phpfox::permalink($this->getFacade()->getItemType(), $aClaim['page_id'], $aClaim['title']);
		}
		return $aClaims;
	}
	
	public function getInfoForAction($aItem)
	{
		if (is_numeric($aItem))
		{
			$aItem = array('item_id' => $aItem);
		}
		$aRow = $this->database()->select('p.page_id, p.title, p.user_id, u.gender, u.full_name')	
			->from(Phpfox::getT('pages'), 'p')
			->join(Phpfox::getT('user'), 'u', 'u.user_id = p.user_id')
			->where('p.page_id = ' . (int) $aItem['item_id'])
			->execute('getSlaveRow');
        if (defined('PHPFOX_PAGES_ITEM_TYPE')){
            $sModule = PHPFOX_PAGES_ITEM_TYPE;
        } else {
            $sModule = 'pages';
        }
		$aRow['link'] = Phpfox_Url::instance()->permalink($sModule, $aRow['page_id'], $aRow['title']);
		return $aRow;
	}
	
	public function getPagesByLocation($fLat, $fLng)
	{
		$aPages = $this->database()->select('page_id, title, location_latitude, location_longitude, (3956 * 2 * ASIN(SQRT( POWER(SIN((' . $fLat . ' - location_latitude) *  pi()/180 / 2), 2) + COS(' . $fLat . ' * pi()/180) * COS(location_latitude * pi()/180) * POWER(SIN((' . $fLng . ' - location_longitude) * pi()/180 / 2), 2) ))) as distance')
		->from(Phpfox::getT('pages'))
		->having('distance < 1') // distance in kilometers
		->limit(10)
		->execute('getSlaveRows');
		
		return $aPages;
	}
	
	public function timelineEnabled($iId)
	{
	    return $this->database()->select('use_timeline')
		    ->from(Phpfox::getT('pages'))
		    ->where('page_id = ' . (int)$iId)
		    ->execute('getSlaveField');
	}
    
    /**
     * Gets the count of pages Without the pages created by apps. 
     * @param int $iUser
     * @return int
     */
    public function getPagesCount($iUser)
    {
		if ($iUser == Phpfox::getUserId())
		{
			return Phpfox::getUserBy('total_pages');
		}
		
        $iCount = $this->database()->select('count(*)')
                ->from(Phpfox::getT('pages'))
                ->where('app_id = 0 AND user_id = ' . (int)$iUser . ' AND item_type = '. $this->getFacade()->getItemTypeId())
                ->execute('getSlaveField');
        
        return $iCount;
    }
    
    /**
     * @param int $iPageId
     *
     * @return string
     */
    public function getTitle($iPageId){
        $aPage = $this->getPage($iPageId);
        $sTitle = $aPage['title'];
        return $sTitle;
    }

	/**
	 * If a call is made to an unknown method attempt to connect
	 * it to a specific plug-in with the same name thus allowing 
	 * plug-in developers the ability to extend classes.
	 *
	 * @param string $sMethod is the name of the method
	 * @param array $aArguments is the array of arguments of being passed
	 */
	public function __call($sMethod, $aArguments)
	{
		/**
		 * Check if such a plug-in exists and if it does call it.
		 */
		if ($sPlugin = Phpfox_Plugin::get($this->getFacade()->getItemType() . '.service_pages__call'))
		{
			eval($sPlugin);
			return;
		}
			
		/**
		 * No method or plug-in found we must throw a error.
		 */
		Phpfox_Error::trigger('Call to undefined method ' . __CLASS__ . '::' . $sMethod . '()', E_USER_ERROR);
	}
}
