<?php
/*****************************************************************************
 *   MyPlaza Admin Plugin (/inc/myplaza/myplaza_admin_plugin.php)
 *     - MyPlaza for MyBB 1.4
 *    By ZiNgA BuRgA (Ported and Updated by Pirata Nervo), 2007-2008
 * 
 * This contains all the plugin functions for the AdminCP.  This is separated
 * from myplaza.php to reduce the size of the main plugin file.
 *****************************************************************************/
if(!defined('IN_MYBB'))
	die('This file cannot be accessed directly.');


if(!is_object($plugins))
	$plugins = &$GLOBALS['plugins'];

$plugins->add_hook('admin_index_navigation_end', 'myplaza_admin_nav', 10);
$plugins->add_hook('admin_adminoptions_adminpermissions_yesnocodes', 'myplaza_administrator_permissions', 10);
$plugins->add_hook('admin_adminoptions_do_updateperms', 'myplaza_do_admin_permissions', 10);

$plugins->add_hook('admin_settings_change', 'myplaza_admin_settings', 10);
$plugins->add_hook('admin_settings_do_change', 'myplaza_admin_change_decpoints', 10);

// helpdoc handling
/*$plugins->add_hook('admin_helpdocs_do_delete_doc', 'myplaza_admin_remove_helpdoc', 10);
$plugins->add_hook('admin_helpdocs_do_delete_section', 'myplaza_admin_remove_helpsect', 10);*/
$plugins->add_hook('admin_config_help_documents_delete_page_commit', 'myplaza_admin_remove_helpdoc', 10);
$plugins->add_hook('admin_config_help_documents_delete_section_commit', 'myplaza_admin_remove_helpsect', 10);

//delete caching
$plugins->add_hook('admin_moderate_do_threadsposts', 'myplaza_delete_cache_admin');

// commented since MyBB 1.4.x does not use these hooks and anymore and does not work this way
/*$plugins->add_hook('admin_users_do_add', 'myplaza_do_admin_user', 10);
$plugins->add_hook('admin_users_do_edit', 'myplaza_do_admin_user', 10);*/

//$plugins->add_hook('admin_users_do_do_merge', 'myplaza_do_admin_user_merge', 10);
$plugins->add_hook('admin_user_users_merge_commit', 'myplaza_do_admin_user_merge', 10);

//$plugins->add_hook('admin_users_do_delete', 'myplaza_do_admin_user_delete', 10);
$plugins->add_hook('admin_user_users_delete_commit', 'myplaza_do_admin_user_delete', 10);

/*$plugins->add_hook('admin_usergroups_do_add', 'myplaza_do_admin_usergroup', 10);
$plugins->add_hook('admin_usergroups_do_edit', 'myplaza_do_admin_usergroup', 10);*/

$plugins->add_hook("admin_user_groups_edit_commit", "myplaza_user_groups_edit_commit");

// some dirty emulations :P
if(!defined('NO_ADMINCP_REPLACEMENTS'))
{
	$plugins->add_hook('admin_user_users_add', 'myplaza_admin_users_add', 10);
	$plugins->add_hook('admin_user_users_edit', 'myplaza_admin_users_edit', 10);
	$plugins->add_hook('admin_user_groups_add', 'myplaza_admin_usergroup_add', 10);
	//$plugins->add_hook('admin_user_groups_edit', 'myplaza_admin_usergroup_edit', 10);
	
	$plugins->add_hook("admin_user_groups_edit", "myplaza_user_groups_edit_action", 10); // creates a global variable which contains the action as $mybb->input['action'] is 'deleted' before admin_user_groups_edit_graph/_tabs hook has been reached.
	$plugins->add_hook("admin_user_groups_edit_graph_tabs", "myplaza_user_groups_edit_graph_tabs", 10);
	$plugins->add_hook("admin_user_groups_edit_graph", "myplaza_user_groups_edit_graph", 10);
	
	$plugins->add_hook('admin_forum_management_add', 'myplaza_admin_forum_add', 10);
	$plugins->add_hook('admin_forum_management_edit', 'myplaza_admin_forum_edit', 10);
}

// include normal plugins file
include MYBB_ROOT.'inc/myplaza/myplaza_plugin.php';


// run passive hooks
if(is_array($passive_hooks = $cache->read('myplaza_admin_hooks')))
{
	foreach($passive_hooks as $file => $hooks)
		foreach($hooks as $hook)
			$plugins->add_hook($hook['hook'], $hook['func'], $hook['priority'], MYBB_ROOT.$file);
	unset($passive_hooks);
}


function myplaza_admin_nav()
{
	global $menu, $lang;
	$lang->load('myplaza');
	
	if(!$lang->plaza_cat_items)
	{
		// BAD Forum Warning System plugin!!! (either that, or language is not installed)
		//  (why I even bother fixing issues with _other_ peoples' code... I don't know...)
		global $mybb;
		if($mybb->user['language'])
			$lang_to_load = $mybb->user['language'];
		else
			$lang_to_load = $mybb->settings['cplanguage'];
		$lang->set_language($lang_to_load, 'admin');
		$lang->load('myplaza');
		
		// if still not set, we'll load Eng
		if(!$lang->plaza_cat_items)
		{
			$lang->set_language('english', 'admin');
			$lang->load('myplaza');
			$lang->set_language($lang_to_load, 'admin');
		}
	}
	
	$menu[] = array(
		'title' => $lang->myplaza,
		'items' => array(
			10 => array('title' => $lang->plaza_cat_items, 'url' => 'myplaza.php?action=categories&amp;show=visible&amp;visible=yes&amp;'.SID),
			20 => array('title' => $lang->plaza_modules, 'url' => 'myplaza.php?action=modules&amp;'.SID),
			30 => array('title' => $lang->plaza_am, 'url' => 'myplaza.php?action=am&amp;'.SID),
			40 => array('title' => $lang->plaza_log, 'url' => 'myplaza.php?action=log&amp;'.SID),
			50 => array('title' => $lang->plaza_maintanence, 'url' => 'myplaza.php?action=maintanence&amp;'.SID),
			60 => array('title' => $lang->plaza_updatemanager, 'url' => 'myplaza.php?action=updatemanager&amp;'.SID)
		)
	);
}


function myplaza_administrator_permissions()
{
	global $lang, $perms;
	
	$lang->load('myplaza');
	makeyesnocode($lang->can_manage_plaza, 'newperms[canmanageplaza]', $perms['canmanageplaza']);
}

function myplaza_do_admin_permissions()
{
	global $db, $newperms, $sqlarray;
	
	$sqlarray['canmanageplaza'] = $db->escape_string($newperms['canmanageplaza']);
}

function myplaza_do_admin_user_merge()
{
	global $source_user, $destination_user;
	db_update('users', array(MYPLAZA_MONEY_COLUMN => MYPLAZA_MONEY_COLUMN.'+'.$source_user[MYPLAZA_MONEY_COLUMN]),  'uid='.$destination_user['uid'], 1);
}

function myplaza_do_admin_user_delete()
{
	// delete log entries for this user as well
	global $db, $mybb;
	$db->delete_query(MY_TABLE_PREFIX.'plaza_buylog', 'uid = '.intval($mybb->input['uid']));
}

function myplaza_user_groups_edit_commit()
{
	global $updated_group, $mybb;
	
	$updated_group['myplaza_rate'] = floatval($mybb->input['myplaza_rate']);
}
// create a variable which contains the action. myplaza_user_groups_edit_graph() will need it later.
function myplaza_user_groups_edit_action()
{
	global $mybb, $mybb_action;
	
	if ($mybb->input['action'] == 'edit') $mybb_action = $mybb->input['action'];
}

function myplaza_user_groups_edit_graph_tabs($tabs)
{
	global $lang;
	
	$lang->load("myplaza");
	
	$tabs['myplaza'] = $lang->myplaza;
	
	return $tabs;
}

function myplaza_user_groups_edit_graph()
{
	global $lang, $form, $mybb, $plugins, $usergroup, $form_container, $mybb_action;
	
	if ($mybb_action == 'edit') $mybb->input['action'] = $mybb_action;

	echo "<div id=\"tab_myplaza\">";	
	$form_container = new FormContainer($lang->myplaza_settings);
	$form_container->output_row($lang->premium_rate." <em>*</em>", "", $form->generate_text_box('myplaza_rate', floatval($usergroup['myplaza_rate']), array('id' => 'myplaza_rate')), 'myplaza_rate');
	$form_container->end();
	
	$plugins->run_hooks("myplaza_admin_user_groups_edit");
	echo "</div>";
}

function myplaza_admin_users_add()
{
	global $mybb, $db, $page, $lang, $sub_tabs, $plugins, $form, $form_container, $user_info;
	
	if($mybb->request_method == "post")
	{
		// Determine the usergroup stuff
		if(is_array($mybb->input['additionalgroups']))
		{
			foreach($mybb->input['additionalgroups'] as $gid)
			{
				if($gid == $mybb->input['usergroup'])
				{
					unset($mybb->input['additionalgroups'][$gid]);
				}
			}
			$additionalgroups = implode(",", $mybb->input['additionalgroups']);
		}
		else
		{
			$additionalgroups = '';
		}

		// Set up user handler.
		require_once MYBB_ROOT."inc/datahandlers/user.php";
		$userhandler = new UserDataHandler('insert');

		// Set the data for the new user.
		$new_user = array(
			"uid" => $mybb->input['uid'],
			"username" => $mybb->input['username'],
			"password" => $mybb->input['password'],
			"password2" => $mybb->input['confirm_password'],
			"email" => $mybb->input['email'],
			"email2" => $mybb->input['email'],
			"usergroup" => $mybb->input['usergroup'],
			"additionalgroups" => $additionalgroups,
			"displaygroup" => $mybb->input['displaygroup'],
			"profile_fields" => $mybb->input['profile_fields'],
			"profile_fields_editable" => true,
			"money" => $mybb->input['money']
		);
		
		$plugins->run_hooks_by_ref("myplaza_admin_user_users_add_new_user", $new_user); // passes $new_user as argument for a function which uses this hook

		// Set the data of the user in the datahandler.
		$userhandler->set_data($new_user);
		$errors = '';

		// Validate the user and get any errors that might have occurred.
		if(!$userhandler->validate_user())
		{
			$errors = $userhandler->get_friendly_errors();
		}
		else
		{
			$user_info = $userhandler->insert_user();
			
			$plugins->run_hooks("admin_user_users_add_commit");
			
			// Log admin action
			log_admin_action($user_info['uid'], $user_info['username']);

			flash_message($lang->success_user_created, 'success');
			admin_redirect("index.php?module=user/users&action=edit&uid={$user_info['uid']}");
		}
	}

	// Fetch custom profile fields - only need required profile fields here
	$query = $db->simple_select("profilefields", "*", "required=1", array('order_by' => 'disporder'));
	while($profile_field = $db->fetch_array($query))
	{
		$profile_fields['required'][] = $profile_field;
	}

	$page->add_breadcrumb_item($lang->create_user);
	$page->output_header($lang->create_user);
		
	$form = new Form("index.php?module=user/users&amp;action=add", "post");

	$page->output_nav_tabs($sub_tabs, 'create_user');

	// If we have any error messages, show them
	if($errors)
	{
		$page->output_inline_error($errors);
	}
	else
	{
		$mybb->input = array(
			"usergroup" => 2
		);
	}

	$form_container = new FormContainer($lang->required_profile_info);
	$form_container->output_row($lang->username." <em>*</em>", "", $form->generate_text_box('username', $mybb->input['username'], array('id' => 'username')), 'username');
	$form_container->output_row($lang->password." <em>*</em>", "", $form->generate_password_box('password', $mybb->input['password'], array('id' => 'password')), 'password');
	$form_container->output_row($lang->confirm_password." <em>*</em>", "", $form->generate_password_box('confirm_password', $mybb->input['confirm_password'], array('id' => 'confirm_new_password')), 'confirm_new_password');
	$form_container->output_row($lang->email_address." <em>*</em>", "", $form->generate_text_box('email', $mybb->input['email'], array('id' => 'email')), 'email');
	
	$lang->load('myplaza');
	
	$form_container->output_row($lang->money, "", $form->generate_text_box('money', floatval($mybb->input['money']), array('id' => 'money')), 'money');

	$display_group_options[0] = $lang->use_primary_user_group;
	$query = $db->simple_select("usergroups", "gid, title", "gid != '1'", array('order_by' => 'title'));
	while($usergroup = $db->fetch_array($query))
	{
		$options[$usergroup['gid']] = $usergroup['title'];
		$display_group_options[$usergroup['gid']] = $usergroup['title'];
	}

	$form_container->output_row($lang->primary_user_group." <em>*</em>", "", $form->generate_select_box('usergroup', $options, $mybb->input['usergroup'], array('id' => 'usergroup')), 'usergroup');
	$form_container->output_row($lang->additional_user_groups, $lang->additional_user_groups_desc, $form->generate_select_box('additionalgroups[]', $options, $mybb->input['additionalgroups'], array('id' => 'additionalgroups', 'multiple' => true, 'size' => 5)), 'additionalgroups');
	$form_container->output_row($lang->display_user_group." <em>*</em>", "", $form->generate_select_box('displaygroup', $display_group_options, $mybb->input['displaygroup'], array('id' => 'displaygroup')), 'displaygroup');

	// Output custom profile fields - required
	output_custom_profile_fields($profile_fields['required'], $mybb->input['profile_fields'], $form_container, $form);
	
	//$lang->load('myplaza'); already loaded some lines above

	// less hooks, more speed
	//$plugins->run_hooks("myplaza_admin_user_users_add_share"); // same form container

	$form_container->end();
	
	$plugins->run_hooks("myplaza_admin_user_users_add");
	
	$buttons[] = $form->generate_submit_button($lang->save_user);
	$form->output_submit_wrapper($buttons);

	$form->end();
	
	$page->output_footer();
}

function myplaza_admin_users_edit()
{
	global $db, $lang, $mybb, $page, $plugins, $userhandler, $cache, $date_formats, $time_formats, $form, $form_container;
	
	global $user;
	
	$query = $db->simple_select("users", "*", "uid='".intval($mybb->input['uid'])."'");
	$user = $db->fetch_array($query);

	// Does the user not exist?
	if(!$user['uid'])
	{
		flash_message($lang->error_invalid_user, 'error');
		admin_redirect("index.php?module=user/users");
	}

	if($mybb->request_method == "post")
	{
		if(is_super_admin($mybb->input['uid']) && $mybb->user['uid'] != $mybb->input['uid'] && !is_super_admin($mybb->user['uid']))
		{
			flash_message($lang->error_no_perms_super_admin, 'error');
			admin_redirect("index.php?module=user/users");
		}

		// Determine the usergroup stuff
		if(is_array($mybb->input['additionalgroups']))
		{
			foreach($mybb->input['additionalgroups'] as $gid)
			{
				if($gid == $mybb->input['usergroup'])
				{
					unset($mybb->input['additionalgroups'][$gid]);
				}
			}
			$additionalgroups = implode(",", $mybb->input['additionalgroups']);
		}
		else
		{
			$additionalgroups = '';
		}

		// Set up user handler.
		require_once MYBB_ROOT."inc/datahandlers/user.php";
		$userhandler = new UserDataHandler('update');

		// Set the data for the new user.
		$updated_user = array(
			"uid" => $mybb->input['uid'],
			"username" => $mybb->input['username'],
			"email" => $mybb->input['email'],
			"email2" => $mybb->input['email'],
			"usergroup" => $mybb->input['usergroup'],
			"additionalgroups" => $additionalgroups,
			"displaygroup" => $mybb->input['displaygroup'],
			"postnum" => $mybb->input['postnum'],
			"usertitle" => $mybb->input['usertitle'],
			"timezone" => $mybb->input['timezone'],
			"language" => $mybb->input['language'],
			"profile_fields" => $mybb->input['profile_fields'],
			"profile_fields_editable" => true,
			"website" => $mybb->input['website'],
			"icq" => $mybb->input['icq'],
			"aim" => $mybb->input['aim'],
			"yahoo" => $mybb->input['yahoo'],
			"msn" => $mybb->input['msn'],
			"style" => $mybb->input['style'],
			"signature" => $mybb->input['signature'],
			"dateformat" => intval($mybb->input['dateformat']),
			"timeformat" => intval($mybb->input['timeformat']),
			"language" => $mybb->input['language'],
			"money" => $mybb->input['money']
		);

		if($user['usergroup'] == 5 && $mybb->input['usergroup'] != 5)
		{
			if($user['coppauser'] == 1)
			{
				$updated_user['coppa_user'] = 0;
			}
		}
		if($mybb->input['new_password'])
		{
			$updated_user['password'] = $mybb->input['new_password'];
			$updated_user['password2'] = $mybb->input['confirm_new_password'];
		}

		$updated_user['options'] = array(
			"allownotices" => $mybb->input['allownotices'],
			"hideemail" => $mybb->input['hideemail'],
			"subscriptionmethod" => $mybb->input['subscriptionmethod'],
			"invisible" => $mybb->input['invisible'],
			"dstcorrection" => $mybb->input['dstcorrection'],
			"threadmode" => $mybb->input['threadmode'],
			"showsigs" => $mybb->input['showsigs'],
			"showavatars" => $mybb->input['showavatars'],
			"showquickreply" => $mybb->input['showquickreply'],
			"remember" => $mybb->input['remember'],
			"receivepms" => $mybb->input['receivepms'],
			"pmnotice" => $mybb->input['pmnotice'],
			"daysprune" => $mybb->input['daysprune'],
			"showcodebuttons" => intval($mybb->input['showcodebuttons']),
			"pmnotify" => $mybb->input['pmnotify'],
			"showredirect" => $mybb->input['showredirect']
		);
		
		$plugins->run_hooks_by_ref("myplaza_admin_user_users_edit_updated_user", $updated_user); // passes $updated_user as argument for a function which uses this hook

		if($mybb->settings['usertppoptions'])
		{
			$updated_user['options']['tpp'] = intval($mybb->input['tpp']);
		}

		if($mybb->settings['userpppoptions'])
		{
			$updated_user['options']['ppp'] = intval($mybb->input['ppp']);
		}

		// Set the data of the user in the datahandler.
		$userhandler->set_data($updated_user);
		$errors = '';

		// Validate the user and get any errors that might have occurred.
		if(!$userhandler->validate_user())
		{
			$errors = $userhandler->get_friendly_errors();
		}
		else
		{
			// Are we removing an avatar from this user?
			if($mybb->input['remove_avatar'])
			{
				$extra_user_updates = array(
					"avatar" => "",
					"avatardimensions" => "",
					"avatartype" => ""
				);
				remove_avatars($user['uid']);
			}


			// Are we uploading a new avatar?
			if($_FILES['avatar_upload']['name'])
			{
				$avatar = upload_avatar($_FILES['avatar_upload'], $user['uid']);
				if($avatar['error'])
				{
					$errors = array($avatar['error']);
				}
				else
				{
					if($avatar['width'] > 0 && $avatar['height'] > 0)
					{
						$avatar_dimensions = $avatar['width']."|".$avatar['height'];
					}
					$extra_user_updates = array(
						"avatar" => $avatar['avatar'],
						"avatardimensions" => $avatar_dimensions,
						"avatartype" => "upload"
					);
				}
			}
			// Are we setting a new avatar from a URL?
			else if($mybb->input['avatar_url'] && $mybb->input['avatar_url'] != $user['avatar'])
			{
				$mybb->input['avatar_url'] = preg_replace("#script:#i", "", $mybb->input['avatar_url']);
				$mybb->input['avatar_url'] = htmlspecialchars($mybb->input['avatar_url']);
				$ext = get_extension($mybb->input['avatar_url']);

				// Copy the avatar to the local server (work around remote URL access disabled for getimagesize)
				$file = fetch_remote_file($mybb->input['avatar_url']);
				if(!$file)
				{
					$avatar_error = $lang->error_invalidavatarurl;
				}
				else
				{
					$tmp_name = "../".$mybb->settings['avataruploadpath']."/remote_".md5(uniqid(rand(), true));
					$fp = @fopen($tmp_name, "wb");
					if(!$fp)
					{
						$avatar_error = $lang->error_invalidavatarurl;
					}
					else
					{
						fwrite($fp, $file);
						fclose($fp);
						list($width, $height, $type) = @getimagesize($tmp_name);
						@unlink($tmp_name);
						echo $type;
						if(!$type)
						{
							$avatar_error = $lang->error_invalidavatarurl;
						}
					}
				}

				if(empty($avatar_error))
				{
					if($width && $height && $mybb->settings['maxavatardims'] != "")
					{
						list($maxwidth, $maxheight) = explode("x", my_strtolower($mybb->settings['maxavatardims']));
						if(($maxwidth && $width > $maxwidth) || ($maxheight && $height > $maxheight))
						{
							$lang->error_avatartoobig = $lang->sprintf($lang->error_avatartoobig, $maxwidth, $maxheight);
							$avatar_error = $lang->error_avatartoobig;
						}
					}
				}
				
				if(empty($avatar_error))
				{
					if($width > 0 && $height > 0)
					{
						$avatar_dimensions = intval($width)."|".intval($height);
					}
					$extra_user_updates = array(
						"avatar" => $db->escape_string($mybb->input['avatar_url']),
						"avatardimensions" => $avatar_dimensions,
						"avatartype" => "remote"
					);
					remove_avatars($user['uid']);
				}
				else
				{
					$errors = array($avatar_error);
				}
			}

			if(!$errors)
			{
				$user_info = $userhandler->update_user();
				$db->update_query("users", $extra_user_updates, "uid='{$user['uid']}'");
				
				// if we're updating the user's signature preferences, do so now
				if($mybb->input['update_posts'] == 'enable' || $mybb->input['update_posts'] == 'disable')
				{
					$update_signature = array(
						'includesig' => ($mybb->input['update_posts'] == 'enable' ? 1 : 0)
					);
					$db->update_query("posts", $update_signature, "uid='{$user['uid']}'");
				}
				
				$plugins->run_hooks("admin_user_users_edit_commit");

				// Log admin action
				log_admin_action($user['uid'], $mybb->input['username']);

				flash_message($lang->success_user_updated, 'success');
				admin_redirect("index.php?module=user/users");
			}
		}
	}

	if(!$errors)
	{
		$user['usertitle'] = htmlspecialchars_decode($user['usertitle']);
		$mybb->input = $user;

		// We need to fetch this users profile field values
		$query = $db->simple_select("userfields", "*", "ufid='{$user['uid']}'");
		$mybb->input['profile_fields'] = $db->fetch_array($query);
	}

	// Fetch custom profile fields
	$query = $db->simple_select("profilefields", "*", "", array('order_by' => 'disporder'));
	while($profile_field = $db->fetch_array($query))
	{
		if($profile_field['required'] == 1)
		{
			$profile_fields['required'][] = $profile_field;
		}
		else
		{
			$profile_fields['optional'][] = $profile_field;
		}
	}

	$page->add_breadcrumb_item($lang->edit_user.": ".htmlspecialchars_uni($user['username']));
	$page->output_header($lang->edit_user);
		
	$sub_tabs['edit_user'] = array(
		'title' => $lang->edit_user,
		'description' => $lang->edit_user_desc
	);

	$form = new Form("index.php?module=user/users&amp;action=edit&amp;uid={$user['uid']}", "post", "", 1);
	echo "<script type=\"text/javascript\">\n function submitUserForm() { $('tab_overview').up('FORM').submit(); }</script>\n";

	$page->output_nav_tabs($sub_tabs, 'edit_user');

	// If we have any error messages, show them
	if($errors)
	{
		$page->output_inline_error($errors);
	}
	
	// Is this user a COPPA user? We show a warning & activate link
	if($user['coppauser'])
	{
		echo $lang->sprintf($lang->warning_coppa_user, $user['uid']);
	}

	$tabs = array(
		"overview" => $lang->overview,
		"profile" => $lang->profile,
		"settings" => $lang->account_settings,
		"signature" => $lang->signature,
		"avatar" => $lang->avatar
	);
	$page->output_tab_control($tabs);

	//
	// OVERVIEW
	//
	echo "<div id=\"tab_overview\">\n";
	$table = new Table;
	$table->construct_header($lang->avatar, array('class' => 'align_center'));
	$table->construct_header($lang->general_account_stats, array('colspan' => '2', 'class' => 'align_center'));

	// Avatar
	$avatar_dimensions = explode("|", $user['avatardimensions']);
	if($user['avatar'])
	{
		if($user['avatardimensions'])
		{
			require_once MYBB_ROOT."inc/functions_image.php";
			list($width, $height) = explode("|", $user['avatardimensions']);
			$scaled_dimensions = scale_image($width, $height, 120, 120);
		}
		else
		{
			$scaled_dimensions = array(
				"width" => 120,
				"height" => 120
			);
		}
		if (!stristr($user['avatar'], 'http://'))
		{
			$user['avatar'] = "../{$user['avatar']}\n";
		}
	}
	else
	{
		$user['avatar'] = "styles/{$page->style}/images/default_avatar.gif";
		$scaled_dimensions = array(
			"width" => 120,
			"height" => 120
		);
	}
	$avatar_top = ceil((126-$scaled_dimensions['height'])/2);
	if($user['lastactive'])
	{
		$last_active = my_date($mybb->settings['dateformat'], $user['lastactive']).", ".my_date($mybb->settings['timeformat'], $user['lastactive']);
	}
	else
	{
		$last_active = $lang->never;
	}
	$reg_date = my_date($mybb->settings['dateformat'], $user['regdate']).", ".my_date($mybb->settings['timeformat'], $user['regdate']);
	if($user['dst'] == 1)
	{
		$timezone = $user['timezone']+1;
	}
	else
	{
		$timezone = $user['timezone'];
	}
	$local_time = gmdate($mybb->settings['dateformat'], TIME_NOW + ($timezone * 3600)).", ".gmdate($mybb->settings['timeformat'], TIME_NOW + ($timezone * 3600));
	$days_registered = (TIME_NOW - $user['regdate']) / (24*3600);
	$posts_per_day = 0;
	if($days_registered > 0)
	{
		$posts_per_day = round($user['postnum'] / $days_registered, 2);
		if($posts_per_day > $user['postnum'])
		{
			$posts_per_day = $user['postnum'];
		}
	}
	$stats = $cache->read("stats");
	$posts = $stats['numposts'];
	if($posts == 0)
	{
		$percent_posts = "0";
	}
	else
	{
		$percent_posts = round($memprofile['postnum']*100/$posts, 2);;
	}

	$user_permissions = user_permissions($user['uid']);

	// Fetch the reputation for this user
	if($user_permissions['usereputationsystem'] == 1 && $mybb->settings['enablereputation'] == 1)
	{
		$reputation = get_reputation($user['reputation']);
	}
	else
	{
		$reputation = "-";
	}

	if($mybb->settings['enablewarningsystem'] != 0 && $user_permissions['canreceivewarnings'] != 0)
	{
		$warning_level = round($user['warningpoints']/$mybb->settings['maxwarningpoints']*100);
		if($warning_level > 100)
		{
			$warning_level = 100;
		}
		$warning_level = get_colored_warning_level($warning_level);
	}


	if($user['birthday'])
	{
		$age = get_age($user['birthday']);
	}

	else
	{
		$age = '';
	}

	$table->construct_cell("<div style=\"width: 126px; height: 126px;\" class=\"user_avatar\"><img src=\"{$user['avatar']}\" style=\"margin-top: {$avatar_top}px\" width=\"{$scaled_dimensions['width']}\" height=\"{$scaled_dimensions['height']}\" alt=\"\" /></div>", array('rowspan' => 6, 'width' => 1));
	$table->construct_cell("<strong>{$lang->email_address}:</strong> <a href=\"mailto:".htmlspecialchars_uni($user['email'])."\">".htmlspecialchars_uni($user['email'])."</a>");
	$table->construct_cell("<strong>{$lang->last_active}:</strong> {$last_active}");
	$table->construct_row();
	$table->construct_cell("<strong>{$lang->registration_date}:</strong> {$reg_date}");
	$table->construct_cell("<strong>{$lang->local_time}:</strong> {$local_time}");
	$table->construct_row();
	$table->construct_cell("<strong>{$lang->posts}:</strong> {$user['postnum']}");
	$table->construct_cell("<strong>{$lang->age}:</strong> {$age}");
	$table->construct_row();
	$table->construct_cell("<strong>{$lang->posts_per_day}:</strong> {$posts_per_day}");
	$table->construct_cell("<strong>{$lang->reputation}:</strong> {$reputation}");
	$table->construct_row();
	$table->construct_cell("<strong>{$lang->percent_of_total_posts}:</strong> {$percent_posts}");
	$table->construct_cell("<strong>{$lang->warning_level}:</strong> {$warning_level}");
	$table->construct_row();
	$table->construct_cell("<strong>{$lang->registration_ip}:</strong> {$user['regip']}");
	$table->construct_cell("<strong>{$lang->last_known_ip}:</strong> {$user['lastip']}");
	$table->construct_row();
	
	$table->output("{$lang->user_overview}: {$user['username']}");
	echo "</div>\n";

	//
	// PROFILE
	//
	echo "<div id=\"tab_profile\">\n";

	$form_container = new FormContainer($lang->required_profile_info.": {$user['username']}");
	$form_container->output_row($lang->username." <em>*</em>", "", $form->generate_text_box('username', $mybb->input['username'], array('id' => 'username')), 'username');
	$form_container->output_row($lang->new_password, $lang->new_password_desc, $form->generate_password_box('new_password', $mybb->input['new_password'], array('id' => 'new_password')), 'new_password');
	$form_container->output_row($lang->confirm_new_password, $lang->new_password_desc, $form->generate_password_box('confirm_new_password', $mybb->input['confirm_new_password'], array('id' => 'confirm_new_password')), 'confirm_new_password');
	$form_container->output_row($lang->email_address." <em>*</em>", "", $form->generate_text_box('email', $mybb->input['email'], array('id' => 'email')), 'email');

	$display_group_options[0] = $lang->use_primary_user_group;
	$query = $db->simple_select("usergroups", "gid, title", "gid != '1'", array('order_by' => 'title'));
	while($usergroup = $db->fetch_array($query))
	{
		$options[$usergroup['gid']] = $usergroup['title'];
		$display_group_options[$usergroup['gid']] = $usergroup['title'];
	}
	
	if(!is_array($mybb->input['additionalgroups']))
	{
		$mybb->input['additionalgroups'] = explode(',', $mybb->input['additionalgroups']);
	}

	$form_container->output_row($lang->primary_user_group." <em>*</em>", "", $form->generate_select_box('usergroup', $options, $mybb->input['usergroup'], array('id' => 'usergroup')), 'usergroup');
	$form_container->output_row($lang->additional_user_groups, $lang->additional_user_groups_desc, $form->generate_select_box('additionalgroups[]', $options, $mybb->input['additionalgroups'], array('id' => 'additionalgroups', 'multiple' => true, 'size' => 5)), 'additionalgroups');
	$form_container->output_row($lang->display_user_group." <em>*</em>", "", $form->generate_select_box('displaygroup', $display_group_options, $mybb->input['displaygroup'], array('id' => 'displaygroup')), 'displaygroup');
	$form_container->output_row($lang->post_count." <em>*</em>", "", $form->generate_text_box('postnum', $mybb->input['postnum'], array('id' => 'postnum')), 'postnum');

	// Output custom profile fields - required
	output_custom_profile_fields($profile_fields['required'], $mybb->input['profile_fields'], $form_container, $form);

	$form_container->end();
	
	$form_container = new FormContainer($lang->optional_profile_info.": {$user['username']}");
	$form_container->output_row($lang->custom_user_title, $lang->custom_user_title_desc, $form->generate_text_box('usertitle', $mybb->input['usertitle'], array('id' => 'usertitle')), 'usertitle');
	$form_container->output_row($lang->website, "", $form->generate_text_box('website', $mybb->input['website'], array('id' => 'website')), 'website');
	$form_container->output_row($lang->icq_number, "", $form->generate_text_box('icq', $mybb->input['icq'], array('id' => 'icq')), 'icq');
	$form_container->output_row($lang->aim_handle, "", $form->generate_text_box('aim', $mybb->input['aim'], array('id' => 'aim')), 'aim');
	$form_container->output_row($lang->yahoo_messanger_handle, "", $form->generate_text_box('yahoo', $mybb->input['yahoo'], array('id' => 'yahoo')), 'yahoo');
	$form_container->output_row($lang->msn_messanger_handle, "", $form->generate_text_box('msn', $mybb->input['msn'], array('id' => 'msn')), 'msn');
	// Birthday

	// Output custom profile fields - optional
	output_custom_profile_fields($profile_fields['optional'], $mybb->input['profile_fields'], $form_container, $form);

	$lang->load('myplaza');
	
	$form_container->output_row($lang->money, "", $form->generate_text_box('money', round($user[MYPLAZA_MONEY_COLUMN], $mybb->settings['myplaza_money_decimals']), array('id' => 'money')), 'money');
	
	//$plugins->run_hooks("myplaza_admin_user_users_edit_share_profile"); // same form container

	$form_container->end();
	
	$plugins->run_hooks("myplaza_admin_user_users_edit_profile");
	
	echo "</div>\n";

	//
	// ACCOUNT SETTINGS
	//

	// Plugin hook note - we should add hooks in above each output_row for the below so users can add their own options to each group :>

	echo "<div id=\"tab_settings\">\n";
	$form_container = new FormContainer($lang->account_settings.": {$user['username']}");
	$login_options = array(
		$form->generate_check_box("invisible", 1, $lang->hide_from_whos_online, array("checked" => $mybb->input['invisible'])),
		$form->generate_check_box("remember", 1, $lang->remember_login_details, array("checked" => $mybb->input['remember']))
	);
	$form_container->output_row($lang->login_cookies_privacy, "", "<div class=\"user_settings_bit\">".implode("</div><div class=\"user_settings_bit\">", $login_options)."</div>");

	$messaging_options = array(
		$form->generate_check_box("allownotices", 1, $lang->recieve_admin_emails, array("checked" => $mybb->input['allownotices'])),
		$form->generate_check_box("hideemail", 1, $lang->hide_email_from_others, array("checked" => $mybb->input['hideemail'])),
		$form->generate_check_box("receivepms", 1, $lang->recieve_pms_from_others, array("checked" => $mybb->input['receivepms'])),
		$form->generate_check_box("pmnotice", 1, $lang->alert_new_pms, array("checked" => $mybb->input['pmnotice'])),
		$form->generate_check_box("pmnotify", 1, $lang->email_notify_new_pms, array("checked" => $mybb->input['pmnotify'])),
		"<label for=\"subscriptionmethod\">{$lang->default_thread_subscription_mode}:</label><br />".$form->generate_select_box("subscriptionmethod", array($lang->do_not_subscribe, $lang->no_email_notification, $lang->instant_email_notification), $mybb->input['subscriptionmethod'], array('id' => 'subscriptionmethod'))
	);
	$form_container->output_row($lang->messaging_and_notification, "", "<div class=\"user_settings_bit\">".implode("</div><div class=\"user_settings_bit\">", $messaging_options)."</div>");

	$date_format_options = array($lang->use_default);
	foreach($date_formats as $key => $format)
	{
		$date_format_options[$key] = my_date($format, TIME_NOW, "", 0);
	}

	$time_format_options = array($lang->use_default);
	foreach($time_formats as $key => $format)
	{
		$time_format_options[$key] = my_date($format, TIME_NOW, "", 0);
	}

	$date_options = array(
		"<label for=\"dateformat\">{$lang->date_format}:</label><br />".$form->generate_select_box("dateformat", $date_format_options, $mybb->input['dateformat'], array('id' => 'dateformat')),
		"<label for=\"dateformat\">{$lang->time_format}:</label><br />".$form->generate_select_box("timeformat", $time_format_options, $mybb->input['timeformat'], array('id' => 'timeformat')),
		"<label for=\"timezone\">{$lang->time_zone}:</label><br />".build_timezone_select("timezone", $mybb->input['timezone']),
		"<label for=\"dstcorrection\">{$lang->daylight_savings_time_correction}:</label><br />".$form->generate_select_box("dstcorrection", array(2 => $lang->automatically_detect, 1 => $lang->always_use_dst_correction, 0 => $lang->never_use_dst_correction), $mybb->input['dstcorrection'], array('id' => 'dstcorrection'))
	);
	$form_container->output_row($lang->date_and_time_options, "", "<div class=\"user_settings_bit\">".implode("</div><div class=\"user_settings_bit\">", $date_options)."</div>");


	$tpp_options = array($lang->use_default);
	if($mybb->settings['usertppoptions'])
	{
		$explodedtpp = explode(",", $mybb->settings['usertppoptions']);
		if(is_array($explodedtpp))
		{
			foreach($explodedtpp as $tpp)
			{
				if($tpp <= 0) continue;
				$tpp_options[$tpp] = $tpp;
			}
		}
	}

	$thread_age_options = array(
		0 => $lang->use_default,
		1 => $lang->show_threads_last_day,
		5 => $lang->show_threads_last_5_days,
		10 => $lang->show_threads_last_10_days,
		20 => $lang->show_threads_last_20_days,
		50 => $lang->show_threads_last_50_days,
		75 => $lang->show_threads_last_75_days,
		100 => $lang->show_threads_last_100_days,
		365 => $lang->show_threads_last_year,
		9999 => $lang->show_all_threads
	);

	$forum_options = array(
		"<label for=\"tpp\">{$lang->threads_per_page}:</label><br />".$form->generate_select_box("tpp", $tpp_options, $mybb->input['tpp'], array('id' => 'tpp')),
		"<label for=\"daysprune\">{$lang->default_thread_age_view}:</label><br />".$form->generate_select_box("daysprune", $thread_age_options, $mybb->input['daysprune'], array('id' => 'daysprune'))
	);
	$form_container->output_row($lang->forum_display_options, "", "<div class=\"user_settings_bit\">".implode("</div><div class=\"user_settings_bit\">", $forum_options)."</div>");

	$ppp_options = array($lang->use_default);
	if($mybb->settings['userpppoptions'])
	{
		$explodedppp = explode(",", $mybb->settings['userpppoptions']);
		if(is_array($explodedppp))
		{
			foreach($explodedppp as $ppp)
			{
				if($ppp <= 0) continue;
				$ppp_options[$ppp] = $ppp;
			}
		}
	}

	$thread_options = array(
		$form->generate_check_box("showsigs", 1, $lang->display_users_sigs, array("checked" => $mybb->input['showsigs'])),
		$form->generate_check_box("showavatars", 1, $lang->display_users_avatars, array("checked" => $mybb->input['showavatars'])),
		$form->generate_check_box("showquickreply", 1, $lang->show_quick_reply, array("checked" => $mybb->input['showquickreply'])),
		"<label for=\"ppp\">{$lang->posts_per_page}:</label><br />".$form->generate_select_box("ppp", $ppp_options, $mybb->input['ppp'], array('id' => 'ppp')),
		"<label for=\"threadmode\">{$lang->default_thread_view_mode}:</label><br />".$form->generate_select_box("threadmode", array("" => $lang->use_default, "linear" => $lang->linear_mode, "threaded" => $lang->threaded_mode), $mybb->input['threadmode'], array('id' => 'threadmode'))
	);
	$form_container->output_row($lang->thread_view_options, "", "<div class=\"user_settings_bit\">".implode("</div><div class=\"user_settings_bit\">", $thread_options)."</div>");

	$languages = array_merge(array('' => $lang->use_default), $lang->get_languages());

	$other_options = array(
		$form->generate_check_box("showredirect", 1, $lang->show_redirect, array("checked" => $mybb->input['showredirect'])),
		$form->generate_check_box("showcodebuttons", "1", $lang->show_code_buttons, array("checked" => $mybb->input['showcodebuttons'])),
		"<label for=\"style\">{$lang->theme}:</label><br />".build_theme_select("style", $mybb->input['style'], 0, "", 1),
		"<label for=\"language\">{$lang->board_language}:</label><br />".$form->generate_select_box("language", $languages, $mybb->input['language'], array('id' => 'language'))
	);
	$form_container->output_row($lang->other_options, "", "<div class=\"user_settings_bit\">".implode("</div><div class=\"user_settings_bit\">", $other_options)."</div>");
	
	//$plugins->run_hooks("myplaza_admin_user_users_edit_share_settings"); // same form container

	$form_container->end();
	
	$plugins->run_hooks("myplaza_admin_user_users_edit_settings");
	
	echo "</div>\n";

	//
	// SIGNATURE EDITOR
	//
	$signature_editor = $form->generate_text_area("signature", $mybb->input['signature'], array('id' => 'signature', 'rows' => 15, 'cols' => '70', 'style' => 'width: 95%'));
	$sig_smilies = $lang->off;
	if($mybb->settings['sigsmilies'] == 1)
	{
		$sig_smilies = $lang->on;
	}
	$sig_mycode = $lang->off;
	if($mybb->settings['sigmycode'] == 1)
	{
		$sig_mycode = $lang->on;
		$signature_editor .= build_mycode_inserter("signature");
	}
	$sig_html = $lang->off;
	if($mybb->settings['sightml'] == 1)
	{
		$sig_html = $lang->on;
	}
	$sig_imgcode = $lang->off;
	if($mybb->settings['sigimgcode'] == 1)
	{
		$sig_imgcode = $lang->on;
	}
	echo "<div id=\"tab_signature\">\n";
	$form_container = new FormContainer("{$lang->signature}: {$user['username']}");
	$form_container->output_row($lang->signature, $lang->sprintf($lang->signature_desc, $sig_mycode, $sig_smilies, $sig_imgcode, $sig_html), $signature_editor, 'signature');

	$signature_options = array(
		$form->generate_radio_button("update_posts", "enable", $lang->enable_sig_in_all_posts, array("checked" => 0)),
		$form->generate_radio_button("update_posts", "disable", $lang->disable_sig_in_all_posts, array("checked" => 0)),
		$form->generate_radio_button("update_posts", "no", $lang->do_nothing, array("checked" => 1))
	);

	$form_container->output_row($lang->singature_preferences, "", implode("<br />", $signature_options));

	//$plugins->run_hooks("myplaza_admin_user_users_edit_share_signature"); // same form container

	$form_container->end();
	
	$plugins->run_hooks("myplaza_admin_user_users_edit_signature");
	
	echo "</div>\n";

	//
	// AVATAR MANAGER
	//
	echo "<div id=\"tab_avatar\">\n";
	$table = new Table;
	$table->construct_header($lang->current_avatar, array('colspan' => 2));

	$table->construct_cell("<div style=\"width: 126px; height: 126px;\" class=\"user_avatar\"><img src=\"{$user['avatar']}\" width=\"{$scaled_dimensions['width']}\" style=\"margin-top: {$avatar_top}px\" height=\"{$scaled_dimensions['height']}\" alt=\"\" /></div>", array('width' => 1));

	if($user['avatartype'] == "upload" || stristr($user['avatar'], $mybb->settings['avataruploadpath']))
	{
		$current_avatar_msg = "<br /><strong>{$lang->user_current_using_uploaded_avatar}</strong>";
	}
	else if($user['avatartype'] == "gallery" || stristr($user['avatar'], $mybb->settings['avatardir']))
	{
		$current_avatar_msg = "<br /><strong>{$lang->user_current_using_gallery_avatar}</strong>";
	}
	elseif($user['avatartype'] == "remote" || my_strpos(my_strtolower($user['avatar']), "http://") !== false)
	{
		$current_avatar_msg = "<br /><strong>{$lang->user_current_using_remote_avatar}</strong>";
		$avatar_url = $user['avatar'];
	}

	if($errors)
	{
		$avatar_url = $mybb->input['avatar_url'];
	}

	if($mybb->settings['maxavatardims'] != "")
	{
		list($max_width, $max_height) = explode("x", my_strtolower($mybb->settings['maxavatardims']));
		$max_size = "<br />{$lang->max_dimensions_are} {$max_width}x{$max_height}";
	}

	if($mybb->settings['avatarsize'])
	{
		$maximum_size = get_friendly_size($mybb->settings['avatarsize']*1024);
		$max_size .= "<br />{$lang->avatar_max_size} {$maximum_size}";
	}

	if($user['avatar'])
	{
		$remove_avatar = "<br /><br />".$form->generate_check_box("remove_avatar", 1, "<strong>{$lang->remove_avatar}</strong>");
	}

	$table->construct_cell($lang->avatar_desc."{$remove_avatar}<br /><small>{$max_size}</small>");
	$table->construct_row();
	
	$table->output($lang->avatar.": {$user['username']}");

	// Custom avatar
	if($mybb->settings['avatarresizing'] == "auto")
	{
		$auto_resize = $lang->avatar_auto_resize;
	}
	else if($mybb->settings['avatarresizing'] == "user")
	{
		$auto_resize = "<input type=\"checkbox\" name=\"auto_resize\" value=\"1\" checked=\"checked\" id=\"auto_resize\" /> <label for=\"auto_resize\">{$lang->attempt_to_auto_resize}</label></span>";
	}
	$form_container = new FormContainer($lang->specify_custom_avatar);
	$form_container->output_row($lang->upload_avatar, $auto_resize, $form->generate_file_upload_box('avatar_upload', array('id' => 'avatar_upload')), 'avatar_upload');
	$form_container->output_row($lang->or_specify_avatar_url, "", $form->generate_text_box('avatar_url', $avatar_url, array('id' => 'avatar_url')), 'avatar_url');
	$form_container->end();

	// Select an image from the gallery
	echo "<div class=\"border_wrapper\">";
	echo "<div class=\"title\">.. {$lang->or_select_avatar_gallery}</div>";
	echo "<iframe src=\"index.php?module=user/users&amp;action=avatar_gallery&amp;uid={$user['uid']}\" width=\"100%\" height=\"350\" frameborder=\"0\"></iframe>";
	echo "</div>";
	
	//$plugins->run_hooks("myplaza_admin_user_users_edit_share_avatar"); // in case a module wants to add a setting  (it must use the SAME form)
	
	echo "</div>";

	$buttons[] = $form->generate_submit_button($lang->save_user);
	$form->output_submit_wrapper($buttons);

	$form->end();
	
	$plugins->run_hooks("myplaza_admin_user_users_edit"); // in case a module wants to add a setting (with its own form)
	
	$page->output_footer();
}

function myplaza_admin_usergroup_add()
{
	global $mybb, $lang, $plugins, $page, $cache, $db, $sub_tabs, $usergroup_permissions, $form, $form_container, $new_usergroup;
	
	if($mybb->request_method == "post")
	{
		if(!trim($mybb->input['title']))
		{
			$errors[] = $lang->error_missing_title;
		}
		
		if(my_strpos($mybb->input['namestyle'], "{username}") === false)
		{
			$errors[] = $lang->error_missing_namestyle_username;
		}

		if(!$errors)
		{
			if($mybb->input['stars'] < 1)
			{
				$mybb->input['stars'] = 0;
			}
			
			if(!$mybb->input['starimage'])
			{
				$mybb->input['starimage'] = "images/star.gif";
			}
			
			$new_usergroup = array(
				"type" => 2,
				"title" => $db->escape_string($mybb->input['title']),
				"description" => $db->escape_string($mybb->input['description']),
				"namestyle" => $db->escape_string($mybb->input['namestyle']),
				"usertitle" => $db->escape_string($mybb->input['usertitle']),
				"stars" => intval($mybb->input['stars']),
				"starimage" => $db->escape_string($mybb->input['starimage']),
				"myplaza_rate" => floatval($mybb->input['myplaza_rate'])
			);
			
			// Set default permissions
			if($mybb->input['copyfrom'] == 0)
			{
				$new_usergroup = array_merge($new_usergroup, $usergroup_permissions);
			}
			// Copying permissions from another group
			else
			{
				$query = $db->simple_select("usergroups", "*", "gid='".intval($mybb->input['copyfrom'])."'");
				$existing_usergroup = $db->fetch_array($query);
				foreach(array_keys($usergroup_permissions) as $field)
				{
					$new_usergroup[$field] = $existing_usergroup[$field];
				}
			}
			
			$plugins->run_hooks("admin_user_groups_add_commit");
			
			$gid = $db->insert_query("usergroups", $new_usergroup);
			
			// Are we copying permissions? If so, copy all forum permissions too
			if($mybb->input['copyfrom'] > 0)
			{
				$query = $db->simple_select("forumpermissions", "*", "gid='".intval($mybb->input['copyfrom'])."'");
				while($forum_permission = $db->fetch_array($query))
				{
					unset($forum_permission['pid']);
					$forum_permission['gid'] = $gid;
					$db->insert_query("forumpermissions", $forum_permission);
				}
			}

			// Update the caches
			$cache->update_usergroups();
			$cache->update_forumpermissions();

			// Log admin action
			log_admin_action($gid, $mybb->input['title']);
			
			flash_message($lang->success_group_created, 'success');
			admin_redirect("index.php?module=user/groups&action=edit&gid={$gid}");
		}
	}

	$page->add_breadcrumb_item($lang->add_user_group);
	$page->output_header($lang->add_user_group);
	
	$page->output_nav_tabs($sub_tabs, 'add_group');
	$form = new Form("index.php?module=user/groups&amp;action=add", "post");
	
	if($errors)
	{
		$page->output_inline_error($errors);
	}
	else
	{
		$mybb->input = array(
			"namestyle" => "{username}"
		);
	}

	$form_container = new FormContainer($lang->add_user_group);
	$form_container->output_row($lang->title." <em>*</em>", "", $form->generate_text_box('title', $mybb->input['title'], array('id' => 'title')), 'title');
	$form_container->output_row($lang->short_description, "", $form->generate_text_box('description', $mybb->input['description'], array('id' => 'description')), 'description');
	$form_container->output_row($lang->username_style, $lang->username_style_desc, $form->generate_text_box('namestyle', $mybb->input['namestyle'], array('id' => 'namestyle')), 'namestyle');
	$form_container->output_row($lang->user_title, $lang->user_title_desc, $form->generate_text_box('usertitle', $mybb->input['usertitle'], array('id' => 'usertitle')), 'usertitle');

	$options[0] = $lang->do_not_copy_permissions;
	$query = $db->simple_select("usergroups", "gid, title", "gid != '1'", array('order_by' => 'title'));
	while($usergroup = $db->fetch_array($query))
	{
		$options[$usergroup['gid']] = $usergroup['title'];
	}
	$form_container->output_row($lang->copy_permissions_from, $lang->copy_permissions_from_desc, $form->generate_select_box('copyfrom', $options, $mybb->input['copyfrom'], array('id' => 'copyfrom')), 'copyfrom');
	
	$lang->load('myplaza');
	
	$form_container->output_row($lang->premium_rate, "", $form->generate_text_box('myplaza_rate', '1', array('id' => 'myplaza_rate')), 'myplaza_rate');
	//less hooks, more speed
	//$plugins->run_hooks("myplaza_admin_user_groups_add_share"); // same form container

	$form_container->end();
	
	$plugins->run_hooks("myplaza_admin_user_groups_add");
	
	$buttons[] = $form->generate_submit_button($lang->save_user_group);
	$form->output_submit_wrapper($buttons);

	$form->end();
	
	$page->output_footer();
}

// since multiple included modules make use of this - it'll be included in MyPlaza as default
function myplaza_admin_forum_add()
{
	global $mybb, $plugins;
	if($mybb->request_method == 'post')
	{
		control_object($db, '
			function insert_query($table, $array)
			{
				static $done = false;
				if(!$done && $table == "forums")
				{
					$done = true;
					$GLOBALS["plugins"]->run_hooks_by_ref("admin_forum_management_edit_update_query", $array);
				}
				return parent::insert_query($table, $array);
			}
		');
	}
	
	$plugins->add_hook('admin_formcontainer_output_row', 'myplaza_admin_forum_row');
}

function myplaza_admin_forum_edit()
{
	global $mybb, $plugins;
	if($mybb->request_method == 'post')
	{
		control_object($GLOBALS['db'], '
			function update_query($table, $array, $where="", $limit="", $no_quote=false)
			{
				static $done = false;
				if(!$done && $table == "forums")
				{
					$done = true;
					$GLOBALS["plugins"]->run_hooks_by_ref("admin_forum_management_edit_update_query", $array);
				}
				return parent::update_query($table, $array, $where, $limit, $no_quote);
			}
		');
	}
	
	$plugins->add_hook('admin_formcontainer_output_row', 'myplaza_admin_forum_row');
}

function myplaza_admin_forum_row(&$args)
{
	global $lang, $plugins;
	if($args['title'] == $lang->misc_options && $args['description'] == '')
	{
		$plugins->add_hook('admin_formcontainer_end', 'myplaza_admin_forum_sharehook');
		$plugins->remove_hook('admin_formcontainer_output_row', 'myplaza_admin_forum_row');
	}
}
function myplaza_admin_forum_sharehook(&$args)
{
	global $plugins, $lang, $mybb;
	static $times = 0;
	//$plugins->remove_hook('admin_formcontainer_end', 'myplaza_admin_forum_sharehook');
	if($times == 0)
	{
		$lang->load('myplaza');
		// $mybb->input['action'] is guaranteed to be either 'add' or 'edit'
		$plugins->run_hooks("myplaza_admin_forum_management_{$mybb->input['action']}_share"); // same form container
	}
	elseif($times == 1)
	{
		control_object($GLOBALS['form'], '
			function generate_submit_button($value, $options=array())
			{
				static $done=false;
				if(!$done)
				{
					$done = true;
					$GLOBALS["plugins"]->run_hooks("myplaza_admin_forum_management_'.$mybb->input['action'].'");
				}
				return parent::generate_submit_button($value, $options);
			}
		');
		// for some odd reason, the author of MyPlaza Turho thought to run the myplaza_admin_forum_management_edit _twice_, but we won't do it (code commented)
		/*
			function end()
			{
				static $done=false;
				if(!$done)
				{
					$done = true;
					$r = parent::end();
					$GLOBALS["plugins"]->run_hooks("myplaza_admin_forum_management_edit");
					return $r;
				}
				return parent::end();
			}
		*/
	}
	++$times;
}



function myplaza_admin_settings()
{
	global $db, $mybb, $noheader, $lang;
	// check if GID is the right one
	$gid = intval($mybb->input['gid']);
	if($gid <= 0)
	{
		$lang->load('myplaza');
	}
	else
	{
		// since GID is an indexed field, it's faster than searching for the name :P
		$name = $db->fetch_field($db->simple_select(MY_TABLE_PREFIX.'settinggroups', 'name', 'gid = '.$gid), 'name');
		if($name != 'myplaza') return;
		
		// all good, stick our own code in :P
		$lang->load('myplaza');
		//require_once MYBB_ROOT.'inc/myplaza/myplaza_admin.php';
		if(!$noheader)
		{
			myplaza_cpheader();
		}
		startform('settings.php', '', 'do_change');
		
		starttable();
		tableheader($lang->myplaza, '', 2);
		tablesubheader($lang->plaza_main_settings);
		myplaza_generate_settings_code(array(
			'myplaza_enable',
			'myplaza_global_rate_items'
		));
		tablesubheader($lang->plaza_stats_settings);
		myplaza_generate_settings_code(array(
			'myplaza_stats_enable',
			'myplaza_stats_limit'
		));
		tablesubheader($lang->plaza_history_settings);
		myplaza_generate_settings_code(array(
			'myplaza_history_enable',
			'myplaza_history_logperpage'
		));
		tablesubheader($lang->plaza_money_settings);
		myplaza_generate_settings_code(array(
			'myplaza_money_name',
			'myplaza_money_prefix',
			'myplaza_money_suffix',
			'myplaza_money_decimals',
			'myplaza_money_default'
		));
		tablesubheader($lang->plaza_other_settings);
		myplaza_generate_settings_code(array(
			'myplaza_am_enable'
		));
		endtable();
		
		endform($lang->submit_changes, $lang->reset_button);
		myplaza_cpfooter();
		exit;
	}
}


function myplaza_admin_change_decpoints()
{
	global $mybb, $db, $lang, $plugins;
	$dec_sid = $db->fetch_field($db->simple_select(MY_TABLE_PREFIX.'settings', 'sid', 'name=\'myplaza_money_decimals\''), 'sid');
	if(!$dec_sid) return;
	if(!isset($mybb->input['upsetting'][$dec_sid])) return;
	$new_dec = $mybb->input['upsetting'][$dec_sid];
	
	$lang->load('myplaza');
	if(!$new_dec && $new_dec !== '0') cperror($lang->invalid_decimals);
	$new_dec = intval($new_dec);
	if($new_dec < 0 || $new_dec > 10) cperror($lang->invalid_decimals);
	
	$mybb->input['upsetting'][$dec_sid] = $new_dec;
	if($mybb->settings['myplaza_money_decimals'] == $new_dec) return;
	
	// all seems okay, so update the table fields
	require MYBB_ROOT.'inc/myplaza/myplaza_install.php';
	db_alter_column('plaza_items', 'cost', array('type' => 'decimal', 'size' => '16,'.$new_dec, 'not_null' => true, 'default' => 0));
	//$db->query('ALTER TABLE '.TABLE_PREFIX.'plaza_items CHANGE `cost` `cost` decimal(16,'.$new_dec.') NOT NULL default \'0\'');
	// $mybb->settings['myplaza_money_default'] isn't accurate, but meh
	$money_default = floatval($mybb->settings['myplaza_money_default']);
	db_alter_column('users', MYPLAZA_MONEY_COLUMN, array('type' => 'decimal', 'size' => '16,'.$new_dec, 'not_null' => true, 'default' => $money_default));
	//$db->query('ALTER TABLE '.TABLE_PREFIX.'users CHANGE `'.MYPLAZA_MONEY_COLUMN.'` `'.MYPLAZA_MONEY_COLUMN.'` decimal(16,'.$new_dec.') NOT NULL default \''.$money_default.'\'');
	
	$plugins->run_hooks('myplaza_change_decimals', $new_dec);
}


function myplaza_admin_remove_helpdoc()
{
	global $mybb, $cache;
	$hdoc_cache = $cache->read('myplaza_helpdocs');
	if(!is_array($hdoc_cache) || !$hdoc_cache['sid']) return;
	$hid = intval($mybb->input['hid']);
	if(!isset($hdoc_cache['docs'][$hid])) return;
	unset($hdoc_cache['docs'][$hid]);
	$cache->update('myplaza_helpdocs', $hdoc_cache);
}

function myplaza_admin_remove_helpsect()
{
	global $mybb, $cache;
	$hdoc_cache = $cache->read('myplaza_helpdocs');
	if(!is_array($hdoc_cache) || !$hdoc_cache['sid']) return;
	$sid = intval($mybb->input['sid']);
	if($hdoc_cache['sid'] != $sid) return;
	// so...  they deleted MyPlaza's help section? :(
	$cache->update('myplaza_helpdocs', array()); // clear helpdoc cache
}

/*
function myplaza_admin_edit_helpdoc()
{
	global $mybb, $cache, $lang;
	if($mybb->input['usetranslation'] != MY_NO) return;
	$hdoc_cache = $cache->read('myplaza_helpdocs');
	if(!is_array($hdoc_cache) || !$hdoc_cache['sid']) return;
	$hid = intval($mybb->input['hid']);
	if(!isset($hdoc_cache['docs'][$hid])) return;
	
	// show warning
	cperror($lang->myplaza_edit_help_error);
}

function myplaza_admin_edit_helpsect()
{
	global $mybb, $cache, $lang;
	if($mybb->input['usetranslation'] != MY_NO) return;
	$hdoc_cache = $cache->read('myplaza_helpdocs');
	if(!is_array($hdoc_cache) || !$hdoc_cache['sid']) return;
	$sid = intval($mybb->input['sid']);
	if($hdoc_cache['sid'] != $sid) return;
	
	// show warning
	cperror($lang->myplaza_edit_help_error);
}
*/


function myplaza_delete_cache_admin()
{
	global $post_cache, $mybb, $db;
	
	if(is_array($mybb->input['threadvalidate']) && $mybb->input['action'] != "do_posts")
	{
		$tids = array();
		foreach($mybb->input['threadvalidate'] as $tid => $val)
			$tids[] = intval($tid);
		
		myplaza_cache_thread_postdata($tids);
	}
	if(is_array($mybb->input['postvalidate']) && $mybb->input['action'] != "do_threads")
	{
		$pids = array();
		foreach($mybb->input['postvalidate'] as $pid => $val)
			$pids[] = intval($pid);
		
		$query = $db->simple_select(MY_TABLE_PREFIX.'posts', '*', 'pid IN ('.implode(',', $pids).')');
		while($p = $db->fetch_array($query))
			$post_cache[$p['pid']] = $p;
	}
}





/**********************************
 * MyBB PLUGIN FUNCTIONS
 ***********************************/
function myplaza_info()
{
	global $lang;
	$lang->load('myplaza');

	return array(
		"name"		=> $lang->myplaza.' (Public)',
		"description"	=> $lang->myplaza_description,
		"website"	=> 'http://forums.consoleworld.net/',
		"author"	=> 'Pirata Nervo',
		"authorsite"	=> 'http://consoleworld.net/',
		"version"	=> MYPLAZA_PLUGIN_VERSION,
		"guid" 		=> '56aac2a7a772f60cb99cc5380c177d39',
		"compatibility" => '14*'
	);
}

function myplaza_activate()
{
	//require MYBB_ROOT.'inc/myplaza/myplaza_install.php';
	if(!myplaza_check_installed()) myplaza_install_plugin();
	myplaza_activate_plugin();
}

function myplaza_deactivate()
{
	//require MYBB_ROOT.'inc/myplaza/myplaza_install.php';
	myplaza_deactivate_plugin();
	// if we're on MyBB 1.2.x, we'll have to uninstall the plugin as well
	global $mybb;
	if(substr(MYBB_VERCODE, 0, 2) == '12') myplaza_uninstall_plugin();
}

function myplaza_install()
{
	//require MYBB_ROOT.'inc/myplaza/myplaza_install.php';
	myplaza_install_plugin();
}

function myplaza_is_installed()
{
	require MYBB_ROOT.'inc/myplaza/myplaza_install.php';
	return myplaza_check_installed();
}

function myplaza_uninstall()
{
	//require MYBB_ROOT.'inc/myplaza/myplaza_install.php';
	return myplaza_uninstall_plugin();
}

if(!function_exists('control_object')) {
	function control_object(&$obj, $code) {
		static $cnt = 0;
		$newname = '_objcont_'.(++$cnt);
		$objserial = serialize($obj);
		$classname = get_class($obj);
		$checkstr = 'O:'.strlen($classname).':"'.$classname.'":';
		$checkstr_len = strlen($checkstr);
		if(substr($objserial, 0, $checkstr_len) == $checkstr) {
			$vars = array();
			// grab resources/object etc, stripping scope info from keys
			foreach((array)$obj as $k => $v) {
				if($p = strrpos($k, "\0"))
					$k = substr($k, $p+1);
				$vars[$k] = $v;
			}
			if(!empty($vars))
				$code .= '
					function ___setvars(&$a) {
						foreach($a as $k => &$v)
							$this->$k = $v;
					}
				';
			eval('class '.$newname.' extends '.$classname.' {'.$code.'}');
			$obj = unserialize('O:'.strlen($newname).':"'.$newname.'":'.substr($objserial, $checkstr_len));
			if(!empty($vars))
				$obj->___setvars($vars);
		}
		// else not a valid object or PHP serialize has changed
	}
}

?>
