<?php

namespace gp{

	defined('is_running') or die('Not an entry point...');


	/**
	 *	Objects of this class handle the display of standard CMS pages
	 *  The classes for admin pages and special pages extend the display class
	 *
	 */
	class Page extends Base{
		public $pagetype			= 'display';
		public $gp_index;
		public $requested;
		public $title;
		public $label;
		public $file;
		public $contentBuffer;
		public $TitleInfo;
		public $fileType			= '';
		public $ajaxReplace			= array('#gpx_content');
		public $admin_links			= array();
		public $visibility			= null;
		public $file_sections		= array();
		public $meta_data			= array();
		public $lang;
		public $language;

		public $file_stats			= array();
		public $fileModTime			= 0;

		//layout & theme
		public $theme_name			= false;
		public $theme_color			= false;
		public $get_theme_css		= true;
		public $theme_dir;
		public $theme_path;
		public $theme_rel;
		public $theme_addon_id		= false;
		public $menu_css_ordered	= true;
		public $menu_css_indexed	= true;
		public $gpLayout;


		//<head> content
		public $head				= '';
		public $head_js				= array();
		public $head_script			= '';
		public $jQueryCode			= false;
		public $admin_js			= false;
		public $head_force_inline	= false;
		public $meta_description	= '';
		public $meta_keywords		= array();

		//css arrays
		public $css_user			= array();
		public $css_admin			= array();



		/* @deprecated 3.5 */
		public $theme_is_addon		= false;


		public function __construct($title, $type){
			global $config, $languages;

			$this->requested	= $title;
			$this->title		= $title;
			$this->lang			= $config['language'];

			if( isset($languages[$this->lang]) ){
				$this->language		= $languages[$this->lang];
			}

			$this->head			.= '<link rel="canonical" href="'.\gp\tool::GetUrl($title).'" />'."\n";
		}


		/**
		 * Get page content or do redirect for non-existant titles
		 * see special_missing.php and /Admin/Settings/Missing
		 */
		public function Error_404(){
			ob_start();

			$args		= array('page'=>$this);
			$missing	= new \gp\special\Missing($args);
			$missing->RunScript();

			$this->contentBuffer = ob_get_clean();
		}

		public function SetVars(){
			global $gp_index, $gp_titles, $gp_menu;

			if( !isset($gp_index[$this->title]) ){
				$this->Error_404();
				return false;
			}

			$this->gp_index		= $gp_index[$this->title];
			$this->TitleInfo	=& $gp_titles[$this->gp_index]; //so changes made by rename are seen
			$this->label		= \gp\tool::GetLabel($this->title);
			$this->file			= \gp\tool\Files::PageFile($this->title);

			if( !$this->CheckVisibility() ){
				return false;
			}

			\gp\tool\Plugins::Action('PageSetVars');

			return true;
		}



		/**
		 * Check the page's visibility
		 *
		 */
		public function CheckVisibility(){
			global $gp_titles;

			if( isset($gp_titles[$this->gp_index]['vis']) ){
				$this->visibility = $gp_titles[$this->gp_index]['vis'];
			}
			if( !\gp\tool::LoggedIn() && $this->visibility ){
				$this->Error_404();
				return false;
			}

			return true;
		}


		public function RunScript(){

			if( !$this->SetVars() ){
				return;
			}

			//allow addons to effect page actions and how a page is displayed
			$cmd = \gp\tool::GetCommand();
			$cmd_after = \gp\tool\Plugins::Filter('PageRunScript',array($cmd));
			if( $cmd !== $cmd_after ){
				$cmd = $cmd_after;
				if( $cmd === 'return' ){
					return;
				}
			}

			$this->GetFile();

			$this->contentBuffer = \gp\tool\Output\Sections::Render($this->file_sections,$this->title,$this->file_stats);
		}

		/**
		 * Retreive the data file for the current title and update the data if necessary
		 *
		 */
		public function GetFile(){

			$this->file_sections	= \gp\tool\Files::Get($this->file,'file_sections');
			$this->meta_data		= \gp\tool\Files::$last_meta;
			$this->fileModTime		= \gp\tool\Files::$last_modified;
			$this->file_stats		= \gp\tool\Files::$last_stats;

			if( count($this->file_sections) == 0 ){
				$this->file_sections[0] = array(
					'type' => 'text',
					'content' => '<p>Oops, this page no longer has any content.</p>',
					);
			}
		}


		/**
		 * Set the page's theme name and path information according to the specified $layout
		 * If $layout is not found, use the installation's default theme
		 *
		 */
		public function SetTheme($layout=false){
			global $dataDir;

			if( $layout === false ){
				$layout = self::OrConfig($this->gp_index,'gpLayout');
			}

			$layout_info = \gp\tool::LayoutInfo($layout);


			if( !$layout_info ){
				$default_theme		= explode('/',gp_default_theme);
				$this->gpLayout		= false;
				$this->theme_name	= $default_theme[0];
				$this->theme_color	= $default_theme[1];
				$this->theme_rel	= '/themes/'.$this->theme_name.'/'.$this->theme_color;
				$this->theme_dir	= $dataDir.'/themes/'.$this->theme_name;

			}else{
				$this->gpLayout		= $layout;
				$this->theme_name	= $layout_info['theme_name'];
				$this->theme_color	= $layout_info['theme_color'];
				$this->theme_rel	= $layout_info['path'];
				$this->theme_dir	= $layout_info['dir'];

				if( isset($layout_info['addon_id']) ){
					$this->theme_addon_id = $layout_info['addon_id'];
				}
				$this->theme_is_addon = $layout_info['is_addon'];//if installed in /themes or /data/_themes

				//css preferences
				if( isset($layout_info['menu_css_ordered']) && !$layout_info['menu_css_ordered'] ){
					$this->menu_css_ordered = false;
				}
				if( isset($layout_info['menu_css_indexed']) && !$layout_info['menu_css_indexed'] ){
					$this->menu_css_indexed = false;
				}
			}

			$this->theme_path = \gp\tool::GetDir($this->theme_rel);

		}


		/**
		 * Return the most relevant configuration value for a configuration option ($var)
		 * Check configuration for a page ($id) first, then parent pages (determined by main menu), then the site $config
		 *
		 * @return mixed
		 *
		 */
		public static function OrConfig($id,$var){
			global $config, $gp_titles;

			if( $id ){
				if( !empty($gp_titles[$id][$var]) ){
					return $gp_titles[$id][$var];
				}

				if( self::ParentConfig($id,$var,$value) ){
					return $value;
				}
			}

			if( isset($config[$var]) ){
				return $config[$var];
			}

			return false;
		}

		/**
		 * Traverse the main menu upwards looking for a configuration setting for $var
		 * Start at the title represented by $checkId
		 * Set $value to the configuration setting if a parent page has the configuration setting
		 *
		 * @return bool
		 */
		public static function ParentConfig($checkId,$var,&$value){
			global $gp_titles,$gp_menu;

			$parents = \gp\tool::Parents($checkId,$gp_menu);
			foreach($parents as $parent_index){
				if( !empty($gp_titles[$parent_index][$var]) ){
					$value = $gp_titles[$parent_index][$var];
					return true;
				}
			}
			return false;
		}



		/*
		 * Get functions
		 *
		 * Missing:
		 *		$#sitemap#$
		 * 		different menu output
		 *
		 */

		public function GetSiteLabel(){
			global $config;
			echo $config['title'];
		}
		public function GetSiteLabelLink(){
			global $config;
			echo \gp\tool::Link('',$config['title']);
		}
		public function GetPageLabel(){
			echo $this->label;
		}

		public function GetContent(){

			$this->GetGpxContent();

			echo '<div id="gpAfterContent">';
			\gp\tool\Output::Get('AfterContent');
			\gp\tool\Plugins::Action('GetContent_After');
			echo '</div>';
		}

		public function GetGpxContent(){
			$class = '';
			if( isset($this->meta_data['file_number']) ){
				$class = 'filenum-'.$this->meta_data['file_number'];
			}

			if( $this->pagetype == 'display' ){
				$class .= ' gp_page_display';
			}

			echo '<div id="gpx_content" class="'.$class.' cf">';

			echo $this->contentBuffer;


			echo '</div>';
		}

		/* Deprecated functions
		 */
		public function GetHead(){
			trigger_error('deprecated functions');
			\gp\tool\Output::GetHead();
		}
		public function GetExtra($area,$info=array()){
			trigger_error('deprecated functions');
			echo \gp\tool\Output\Extra::GetExtra($area);
		}
		public function GetMenu(){
			trigger_error('deprecated functions');
			\gp\tool\Output::GetMenu();
		}
		public function GetFullMenu(){
			trigger_error('deprecated functions');
			\gp\tool\Output::GetFullMenu();
		}
		public function GetAllGadgets(){
			trigger_error('deprecated functions');
			\gp\tool\Output::GetAllGadgets();
		}
		public function GetAdminLink(){
			trigger_error('deprecated functions');
			\gp\tool\Output::GetAdminLink();
		}


	}
}

namespace{
	class display extends \gp\Page{}
}