<?php

/*
	Question2Answer (c) Gideon Greenspan

	http://www.question2answer.org/


	File: qa-include/qa-page-admin-plugins.php
	Version: See define()s at top of qa-include/qa-base.php
	Description: Controller for admin page listing plugins and showing their options


	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	More about this license: http://www.question2answer.org/license.php
*/

	if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser
		header('Location: ../');
		exit;
	}

	require_once QA_INCLUDE_DIR.'qa-app-admin.php';


//	Check admin privileges

	if (!qa_admin_check_privileges($qa_content))
		return $qa_content;


//	Map modules with options to their containing plugins

	$pluginoptionmodules=array();

	$tables=qa_db_list_tables_lc();
	$moduletypes=qa_list_module_types();

	foreach ($moduletypes as $type) {
		$modules=qa_list_modules($type);

		foreach ($modules as $name) {
			$module=qa_load_module($type, $name);

			if (method_exists($module, 'admin_form')) {
				$info=qa_get_module_info($type, $name);
				$pluginoptionmodules[$info['directory']][]=array(
					'type' => $type,
					'name' => $name,
				);
			}
		}
	}


//	Prepare content for theme

	$qa_content=qa_content_prepare();

	$qa_content['title']=qa_lang_html('admin/admin_title').' - '.qa_lang_html('admin/plugins_title');

	$qa_content['error']=qa_admin_page_error();

	$qa_content['script_rel'][]='qa-content/qa-admin.js?'.QA_VERSION;

	$pluginfiles=glob(QA_PLUGIN_DIR.'*/qa-plugin.php');

	foreach ($moduletypes as $type) {
		$modules=qa_load_modules_with($type, 'init_queries');

		foreach ($modules as $name => $module) {
			$queries=$module->init_queries($tables);

			if (!empty($queries)) {
				if (qa_is_http_post())
					qa_redirect('install');

				else
					$qa_content['error']=strtr(qa_lang_html('admin/module_x_database_init'), array(
						'^1' => qa_html($name),
						'^2' => qa_html($type),
						'^3' => '<a href="'.qa_path_html('install').'">',
						'^4' => '</a>',
					));
			}
		}
	}

	if ( qa_is_http_post() && !qa_check_form_security_code('admin/plugins', qa_post_text('qa_form_security_code')) ) {
		$qa_content['error']=qa_lang_html('misc/form_security_reload');
		$showpluginforms=false;
	} else
		$showpluginforms=true;

	if (count($pluginfiles)) {
		foreach ($pluginfiles as $pluginindex => $pluginfile) {
			$plugindirectory=dirname($pluginfile).'/';
			$hash=qa_admin_plugin_directory_hash($plugindirectory);
			$showthisform=$showpluginforms && (qa_get('show')==$hash);

			$contents=file_get_contents($pluginfile);

			$metadata=qa_admin_addon_metadata($contents, array(
				'name' => 'Plugin Name',
				'uri' => 'Plugin URI',
				'description' => 'Plugin Description',
				'version' => 'Plugin Version',
				'date' => 'Plugin Date',
				'author' => 'Plugin Author',
				'author_uri' => 'Plugin Author URI',
				'license' => 'Plugin License',
				'min_q2a' => 'Plugin Minimum Question2Answer Version',
				'min_php' => 'Plugin Minimum PHP Version',
				'update' => 'Plugin Update Check URI',
			));

			if (strlen(@$metadata['name']))
				$namehtml=qa_html($metadata['name']);
			else
				$namehtml=qa_lang_html('admin/unnamed_plugin');

			if (strlen(@$metadata['uri']))
				$namehtml='<a href="'.qa_html($metadata['uri']).'">'.$namehtml.'</a>';

			$namehtml='<b>'.$namehtml.'</b>';

			if (strlen(@$metadata['version']))
				$namehtml.=' v'.qa_html($metadata['version']);

			if (strlen(@$metadata['author'])) {
				$authorhtml=qa_html($metadata['author']);

				if (strlen(@$metadata['author_uri']))
					$authorhtml='<a href="'.qa_html($metadata['author_uri']).'">'.$authorhtml.'</a>';

				$authorhtml=qa_lang_html_sub('main/by_x', $authorhtml);

			} else
				$authorhtml='';

			if (strlen(@$metadata['version']) && strlen(@$metadata['update'])) {
				$elementid='version_check_'.md5($plugindirectory);

				$updatehtml='(<span id="'.$elementid.'">...</span>)';

				$qa_content['script_onloads'][]=array(
					"qa_version_check(".qa_js($metadata['update']).", 'Plugin Version', ".qa_js($metadata['version'], true).", 'Plugin URI', ".qa_js($elementid).");"
				);

			} else
				$updatehtml='';

			if (strlen(@$metadata['description']))
				$deschtml=qa_html($metadata['description']);
			else
				$deschtml='';

			if (isset($pluginoptionmodules[$plugindirectory]) && !$showthisform)
				$deschtml.=(strlen($deschtml) ? ' - ' : '').'<a href="'.
					qa_admin_plugin_options_path($plugindirectory).'">'.qa_lang_html('admin/options').'</a>';

			$pluginhtml=$namehtml.' '.$authorhtml.' '.$updatehtml.'<br>'.$deschtml.(strlen($deschtml) ? '<br>' : '').
				'<small style="color:#666">'.qa_html($plugindirectory).'</small>';

			if (qa_qa_version_below(@$metadata['min_q2a']))
				$pluginhtml='<strike style="color:#999">'.$pluginhtml.'</strike><br><span style="color:#f00">'.
					qa_lang_html_sub('admin/requires_q2a_version', qa_html($metadata['min_q2a'])).'</span>';

			elseif (qa_php_version_below(@$metadata['min_php']))
				$pluginhtml='<strike style="color:#999">'.$pluginhtml.'</strike><br><span style="color:#f00">'.
					qa_lang_html_sub('admin/requires_php_version', qa_html($metadata['min_php'])).'</span>';

			$qa_content['form_plugin_'.$pluginindex]=array(
				'tags' => 'id="'.qa_html($hash).'"',
				'style' => 'tall',
				'fields' => array(
					array(
						'type' => 'custom',
						'html' => $pluginhtml,
					)
				),
			);

			if ($showthisform && isset($pluginoptionmodules[$plugindirectory]))
				foreach ($pluginoptionmodules[$plugindirectory] as $pluginoptionmodule) {
					$type=$pluginoptionmodule['type'];
					$name=$pluginoptionmodule['name'];

					$module=qa_load_module($type, $name);

					$form=$module->admin_form($qa_content);

					if (!isset($form['tags']))
						$form['tags']='method="post" action="'.qa_admin_plugin_options_path($plugindirectory).'"';

					if (!isset($form['style']))
						$form['style']='tall';

					$form['boxed']=true;

					$form['hidden']['qa_form_security_code']=qa_get_form_security_code('admin/plugins');

					$qa_content['form_plugin_options']=$form;
				}

		}
	}

	$qa_content['navigation']['sub']=qa_admin_sub_navigation();


	return $qa_content;


/*
	Omit PHP closing tag to help avoid accidental output
*/