<?php
/*
	Question2Answer by Gideon Greenspan and contributors
	http://www.question2answer.org/

	Description: Controller for register page


	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 . 'app/captcha.php';
require_once QA_INCLUDE_DIR . 'db/users.php';


if (qa_is_logged_in()) {
	qa_redirect('');
}

// Check we're not using single-sign on integration, that we're not logged in, and we're not blocked
if (QA_FINAL_EXTERNAL_USERS) {
	$request = qa_request();
	$topath = qa_get('to'); // lets user switch between login and register without losing destination page
	$userlinks = qa_get_login_links(qa_path_to_root(), isset($topath) ? $topath : qa_path($request, $_GET, ''));

	if (!empty($userlinks['register'])) {
		qa_redirect_raw($userlinks['register']);
	}
	qa_fatal_error('User registration should be handled by external code');
}


// Get information about possible additional fields

$show_terms = qa_opt('show_register_terms');

$userfields = qa_db_select_with_pending(
	qa_db_userfields_selectspec()
);

foreach ($userfields as $index => $userfield) {
	if (!($userfield['flags'] & QA_FIELD_FLAGS_ON_REGISTER))
		unset($userfields[$index]);
}


// Check we haven't suspended registration, and this IP isn't blocked

if (qa_opt('suspend_register_users')) {
	$qa_content = qa_content_prepare();
	$qa_content['error'] = qa_lang_html('users/register_suspended');
	return $qa_content;
}

if (qa_user_permit_error()) {
	$qa_content = qa_content_prepare();
	$qa_content['error'] = qa_lang_html('users/no_permission');
	return $qa_content;
}


// Process submitted form

if (qa_clicked('doregister')) {
	require_once QA_INCLUDE_DIR . 'app/limits.php';

	if (qa_user_limits_remaining(QA_LIMIT_REGISTRATIONS)) {
		require_once QA_INCLUDE_DIR . 'app/users-edit.php';

		$inemail = qa_post_text('email');
		$inpassword = qa_post_text('password');
		$inhandle = qa_post_text('handle');
		$interms = (int)qa_post_text('terms');

		$inprofile = array();
		foreach ($userfields as $userfield)
			$inprofile[$userfield['fieldid']] = qa_post_text('field_' . $userfield['fieldid']);

		if (!qa_check_form_security_code('register', qa_post_text('code'))) {
			$pageerror = qa_lang_html('misc/form_security_again');
		} else {
			// core validation
			$errors = array_merge(
				qa_handle_email_filter($inhandle, $inemail),
				qa_password_validate($inpassword)
			);

			// T&Cs validation
			if ($show_terms && !$interms)
				$errors['terms'] = qa_lang_html('users/terms_not_accepted');

			// filter module validation
			if (count($inprofile)) {
				$filtermodules = qa_load_modules_with('filter', 'filter_profile');
				foreach ($filtermodules as $filtermodule)
					$filtermodule->filter_profile($inprofile, $errors, null, null);
			}

			if (qa_opt('captcha_on_register'))
				qa_captcha_validate_post($errors);

			if (empty($errors)) {
				// register and redirect
				qa_limits_increment(null, QA_LIMIT_REGISTRATIONS);

				$userid = qa_create_new_user($inemail, $inpassword, $inhandle);

				foreach ($userfields as $userfield)
					qa_db_user_profile_set($userid, $userfield['title'], $inprofile[$userfield['fieldid']]);

				qa_set_logged_in_user($userid, $inhandle);

				$topath = qa_get('to');

				if (isset($topath))
					qa_redirect_raw(qa_path_to_root() . $topath); // path already provided as URL fragment
				else
					qa_redirect('');
			}
		}

	} else
		$pageerror = qa_lang('users/register_limit');
}


// Prepare content for theme

$qa_content = qa_content_prepare();

$qa_content['title'] = qa_lang_html('users/register_title');

$qa_content['error'] = @$pageerror;

$qa_content['form'] = array(
	'tags' => 'method="post" action="' . qa_self_html() . '"',

	'style' => 'tall',

	'fields' => array(
		'handle' => array(
			'label' => qa_lang_html('users/handle_label'),
			'tags' => 'name="handle" id="handle" dir="auto"',
			'value' => qa_html(@$inhandle),
			'error' => qa_html(@$errors['handle']),
		),

		'password' => array(
			'type' => 'password',
			'label' => qa_lang_html('users/password_label'),
			'tags' => 'name="password" id="password" dir="auto"',
			'value' => qa_html(@$inpassword),
			'error' => qa_html(@$errors['password']),
		),

		'email' => array(
			'label' => qa_lang_html('users/email_label'),
			'tags' => 'name="email" id="email" dir="auto"',
			'value' => qa_html(@$inemail),
			'note' => qa_opt('email_privacy'),
			'error' => qa_html(@$errors['email']),
		),
	),

	'buttons' => array(
		'register' => array(
			'tags' => 'onclick="qa_show_waiting_after(this, false);"',
			'label' => qa_lang_html('users/register_button'),
		),
	),

	'hidden' => array(
		'doregister' => '1',
		'code' => qa_get_form_security_code('register'),
	),
);

// prepend custom message
$custom = qa_opt('show_custom_register') ? trim(qa_opt('custom_register')) : '';
if (strlen($custom)) {
	array_unshift($qa_content['form']['fields'], array(
		'type' => 'custom',
		'note' => $custom,
	));
}

foreach ($userfields as $userfield) {
	$value = @$inprofile[$userfield['fieldid']];

	$label = trim(qa_user_userfield_label($userfield), ':');
	if (strlen($label))
		$label .= ':';

	$qa_content['form']['fields'][$userfield['title']] = array(
		'label' => qa_html($label),
		'tags' => 'name="field_' . $userfield['fieldid'] . '"',
		'value' => qa_html($value),
		'error' => qa_html(@$errors[$userfield['fieldid']]),
		'rows' => ($userfield['flags'] & QA_FIELD_FLAGS_MULTI_LINE) ? 8 : null,
	);
}

if (qa_opt('captcha_on_register'))
	qa_set_up_captcha_field($qa_content, $qa_content['form']['fields'], @$errors);

// show T&Cs checkbox
if ($show_terms) {
	$qa_content['form']['fields']['terms'] = array(
		'type' => 'checkbox',
		'label' => trim(qa_opt('register_terms')),
		'tags' => 'name="terms" id="terms"',
		'value' => qa_html(@$interms),
		'error' => qa_html(@$errors['terms']),
	);
}

$loginmodules = qa_load_modules_with('login', 'login_html');

foreach ($loginmodules as $module) {
	ob_start();
	$module->login_html(qa_opt('site_url') . qa_get('to'), 'register');
	$html = ob_get_clean();

	if (strlen($html))
		@$qa_content['custom'] .= '<br>' . $html . '<br>';
}

// prioritize 'handle' for keyboard focus
$qa_content['focusid'] = isset($errors['handle']) ? 'handle'
	: (isset($errors['password']) ? 'password'
		: (isset($errors['email']) ? 'email' : 'handle'));


return $qa_content;
