<?php
/**
* Joomla/Mambo Community Builder
* @version $Id: controller.default.php 1812 2012-06-20 07:50:34Z beat $
* @package Community Builder
* @subpackage admin.comprofiler.php : default controller
* @author JoomlaJoe and Beat, database check function by Nick
* @copyright (C) JoomlaJoe and Beat, www.joomlapolis.com
* @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU/GPL version 2
*/

// ensure this file is being included by a parent file
if ( ! ( defined( '_VALID_CB' ) || defined( '_JEXEC' ) || defined( '_VALID_MOS' ) ) ) { die( 'Direct Access to this location is not allowed.' ); }

class CBController_default {
	// dummy for now
}	// class CBController_default

global $_CB_framework;
global $_CB_Admin_Done, $_CB_adminpath, $ueConfig, $mainframe;
$option				=	$_CB_framework->getRequestVar( 'option' );
$task				=	$_CB_framework->getRequestVar( 'task' );
$cid				=	cbGetParam( $_REQUEST, 'cid', array( 0 ) );
if ( ! is_array( $cid )) {
	$cid			=	array ( (int) $cid );
}
$taskPart1			=	strtok( $task, '.' );

if ( defined( 'JPATH_ADMINISTRATOR' ) ) {
	$_CB_adminpath		=	JPATH_ADMINISTRATOR . '/components/com_comprofiler';
	require_once $_CB_adminpath . '/admin.comprofiler.html.php';
} else {
	require_once $mainframe->getPath( 'admin_html' );
}

cbimport( 'cb.tabs' );
cbimport( 'cb.imgtoolbox' );

if ( class_exists( 'JFactory' ) ) {	// Joomla 1.5 : for string WARNREG_EMAIL_INUSE used in error js popup.
	$lang			=	JFactory::getLanguage();
	$lang->load( "com_users" );
}

// backend only:
cbimport( 'cb.adminfilesystem' );
cbimport( 'cb.installer' );
cbimport( 'cb.params' );
cbimport( 'cb.pagination' );

//$task				=	trim( cbGetParam( $_REQUEST, 'task', null ) );
$uid				=	cbGetParam( $_REQUEST, 'uid', array( 0 ) );


switch ( $taskPart1 ) {
	case "remove":
		cbSpoofCheck( 'user' );
		checkCanAdminPlugins( 'core.delete', null, 'com_users' );
		removeUsers( $cid, $option );
		break;

	case "block":
		cbSpoofCheck( 'user' );
		checkCanAdminPlugins( 'core.edit.state', null, 'com_users' );
		changeUserBlock( $cid, 1, $option );
		break;

	case "unblock":
		cbSpoofCheck( 'user' );
		checkCanAdminPlugins( 'core.edit.state', null, 'com_users' );
		changeUserBlock( $cid, 0, $option );
		break;

	case "approve":
		cbSpoofCheck( 'user' );
		checkCanAdminPlugins( 'core.edit.state', null, 'com_users' );
		approveUser( $cid, 1, $option );
        break;

	case "reject":
		cbSpoofCheck( 'user' );
		checkCanAdminPlugins( 'core.edit.state', null, 'com_users' );
		approveUser( $cid, 0, $option );
        break;

   	case "showconfig":
		checkCanAdminPlugins( 'core.admin' );
		showConfig( $option );
  		break;

   	case "saveconfig":
		cbSpoofCheck( 'config' );
		checkCanAdminPlugins( 'core.admin' );
		saveConfig( $option );
		break;

	case "removeTab":
		cbSpoofCheck( 'tab' );
		checkCanAdminPlugins( 'core.edit' );
		removeTabs( $cid, $option );
		break;

	case "showTab":
		checkCanAdminPlugins( 'core.edit' );
		showTab( $option );
		break;

	case "orderupTab":
	case "orderdownTab":
		cbSpoofCheck( 'tab' );
		checkCanAdminPlugins( 'core.edit.state' );
		orderTabs( $cid[0], ($task == 'orderupTab' ? -1 : 1), $option);
		break;

	case "removeField":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit' );
		removeField( $cid, $option );
		break;

	case "showField":
		checkCanAdminPlugins( 'core.edit' );
		showField( $option );
		break;

	case "orderupField":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		orderFields( $cid[0], -1, $option );
		break;

	case "orderdownField":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		orderFields( $cid[0], 1, $option );
		break;

	case "saveList":
		cbSpoofCheck( 'list' );
		checkCanAdminPlugins( 'core.edit' );
		saveList($option );
		break;

	case "editList":
		checkCanAdminPlugins( 'core.edit' );
		editList( $cid[0], 1, $option );
		break;
	case "newList":
		checkCanAdminPlugins( 'core.edit' );
		editList( 0, $option);
		break;

	case "showLists":
		checkCanAdminPlugins( 'core.edit' );
		showLists( $option );
		break;
	case "removeList":
		cbSpoofCheck( 'list' );
		checkCanAdminPlugins( 'core.edit' );
		removeList( $cid, $option );
		break;
	case "orderupList":
		cbSpoofCheck( 'list' );
		checkCanAdminPlugins( 'core.edit.state' );
		orderLists( $cid[0], -1, $option );
		break;

	case "orderdownList":
		cbSpoofCheck( 'list' );
		checkCanAdminPlugins( 'core.edit.state' );
		orderLists( $cid[0], 1, $option );
		break;

	case "fieldPublishedYes":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		publishField( $cid, 1, $option );
        break;

	case "fieldPublishedNo":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		publishField( $cid, 0, $option );
        break;

	case "fieldRequiredYes":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		requiredField( $cid, 1, $option );
        break;

	case "fieldRequiredNo":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		requiredField( $cid, 0, $option );
        break;

	case "fieldProfileYes1":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		profileField( $cid, 1, $option );
        break;

	case "fieldProfileYes2":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		profileField( $cid, 2, $option );
        break;

	case "fieldProfileNo":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		profileField( $cid, 0, $option );
        break;

	case "fieldRegistrationYes":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		registrationField( $cid, 1, $option );
        break;

	case "fieldRegistrationNo":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		registrationField( $cid, 0, $option );
        break;

	case "fieldSearchableYes":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		searchableField( $cid, 1, $option );
        break;

	case "fieldSearchableNo":
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		searchableField( $cid, 0, $option );
        break;

	case "listPublishedYes":
		cbSpoofCheck( 'list' );
		checkCanAdminPlugins( 'core.edit.state' );
		listPublishedField( $cid, 1, $option );
        break;

	case "listPublishedNo":
		cbSpoofCheck( 'list' );
		checkCanAdminPlugins( 'core.edit.state' );
		listPublishedField( $cid, 0, $option );
        break;

	case "listDefaultYes":
		cbSpoofCheck( 'list' );
		checkCanAdminPlugins( 'core.edit.state' );
		listDefaultField( $cid, 1, $option );
        break;

	case "listDefaultNo":
		cbSpoofCheck( 'list' );
		checkCanAdminPlugins( 'core.edit.state' );
		listDefaultField( $cid, 0, $option );
        break;

	case "tabPublishedYes":
		cbSpoofCheck( 'tab' );
		checkCanAdminPlugins( 'core.edit.state' );
		tabPublishedField( $cid, 1, $option );
        break;

	case "tabPublishedNo":
		cbSpoofCheck( 'tab' );
		checkCanAdminPlugins( 'core.edit.state' );
		tabPublishedField( $cid, 0, $option );
        break;

	case "tools":
		checkCanAdminPlugins( array( 'core.admin', 'core.edit' ) );
		loadTools();
		break;

	case "loadSampleData":
		cbSpoofCheck( 'cbtools', 'GET' );
		checkCanAdminPlugins( array( 'core.admin' ) );
		loadSampleData();
        break;

	case "syncUsers":
		cbSpoofCheck( 'cbtools', 'GET' );
		checkCanAdminPlugins( array( 'core.admin', 'core.edit' ) );
		syncUsers();
        break;

	case "checkcbdb":
		cbSpoofCheck( 'cbtools', 'GET' );
		checkCanAdminPlugins( array( 'core.admin', 'core.edit' ) );
		checkcbdb( (int) cbGetParam( $_GET, 'databaseid', 0 ) );
		break;

	case "fixcbdb":
		cbSpoofCheck( 'cbtools', 'GET' );
		checkCanAdminPlugins( array( 'core.admin', 'core.edit' ) );
		fixcbdb( (int) cbGetParam( $_GET, 'dryrun', 1 ), (int) cbGetParam( $_GET, 'databaseid', 0 ) );
		break;

	case "fixacldb":
		cbSpoofCheck( 'cbtools', 'GET' );
		checkCanAdminPlugins( array( 'core.admin', 'core.edit' ) );
		fixacldb();
		break;

	case "fixcbmiscdb":
		cbSpoofCheck( 'cbtools', 'GET' );
		checkCanAdminPlugins( array( 'core.admin', 'core.edit' ) );
		fixcbmiscdb();
		break;

	case 'savetaborder':
		cbSpoofCheck( 'tab' );
		checkCanAdminPlugins( 'core.edit.state' );
		saveTabOrder( $cid );
		break;

	case 'savefieldorder':
		cbSpoofCheck( 'field' );
		checkCanAdminPlugins( 'core.edit.state' );
		saveFieldOrder( $cid );
		break;

	case 'savelistorder':
		cbSpoofCheck( 'list' );
		checkCanAdminPlugins( 'core.edit.state' );
		saveListOrder( $cid );
		break;

	case 'deletePlugin':
		cbSpoofCheck( 'plugin' );
		checkCanAdminPlugins( 'core.admin', $cid );
		removePlugin( $cid, $option );
		break;

	case 'cancelPlugin':
		checkCanAdminPlugins( 'core.edit' );
		cancelPlugin( $option );
		break;

	case 'cancelPluginAction':
		checkCanAdminPlugins( 'core.edit' );
		cancelPluginAction( $option );
		break;

	case 'publishPlugin':
	case 'unpublishPlugin':
		cbSpoofCheck( 'plugin' );
		checkCanAdminPlugins( 'core.edit.state', $cid );
		publishPlugin( $cid, ($task == 'publishPlugin'), $option );
		break;

	case 'orderupPlugin':
	case 'orderdownPlugin':
		cbSpoofCheck( 'plugin' );
		checkCanAdminPlugins( 'core.edit.state', $cid[0] );
		orderPlugin( $cid[0], ($task == 'orderupPlugin' ? -1 : 1), $option);
		break;

	case 'accesspublic':
	case 'accessregistered':
	case 'accessspecial':
		cbSpoofCheck( 'plugin' );
		checkCanAdminPlugins( 'core.edit', $cid[0] );
		accessMenu( $cid[0], $task, $option );
		break;

	case 'savepluginorder':
		cbSpoofCheck( 'plugin' );
		checkCanAdminPlugins( 'core.edit.state', $cid );
		savePluginOrder( $cid, $option );
		break;

	case 'showPlugins':
		checkCanAdminPlugins( array( 'core.admin', 'core.edit', 'core.edit.state' ), $cid );
		viewPlugins( $option);
		break;

	case 'installPluginUpload':
		cbSpoofCheck( 'plugin' );
		checkCanAdminPlugins( 'core.admin' );
		installPluginUpload();
		break;

	case 'installPluginDir':
		cbSpoofCheck( 'plugin' );
		checkCanAdminPlugins( 'core.admin' );
		installPluginDir();
		break;

	case 'installPluginURL':
		cbSpoofCheck( 'plugin' );
		checkCanAdminPlugins( 'core.admin' );
		installPluginURL();
		break;

	case 'latestVersion':
		latestVersion();
		break;

	case "fieldclass":
	case "tabclass":
	case "pluginclass":
		tabClass( $option, $task, cbGetParam( $_REQUEST, 'user', 0 ) );
		break;

	case "finishinstallation":
		finishInstallation( $option );
		break;

	default:
		teamCredits(2);
		break;
}

function saveList( $option ) {
	global $_CB_framework, $_CB_database, $_POST;

	$oldrow		=	new moscomprofilerLists( $_CB_database );
	if ( isset( $_POST['listid'] ) && $_POST['listid'] ) {
		$oldrow->load( (int) $_POST['listid'] );
		// Check if user is a super user:
		if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
			// Check if user belongs to useraccessgroupid:
			if ( ! in_array( $oldrow->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
				echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
				exit;
			}
			// Check if user belongs to viewaccesslevel:
			if ( ! in_array( $oldrow->viewaccesslevel, CBuser::getMyInstance()->getAuthorisedViewLevelsIds( false ) ) ) {
				echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
				exit;
			}
		}
	}

	$row = new moscomprofilerLists( $_CB_database );

 	$_POST['params']	=	cbParamsEditorController::getRawParamsMagicgpcEscaped( $_POST['params'] );

	if (!$row->bind( $_POST )) {
		echo "<script type=\"text/javascript\"> alert('".$row->getError()."'); window.history.go(-1); </script>\n";
		exit();
	}
	// Set defaults if nothing is found
	// Also check if oldrow value to use its current value or default otherwise
	// This prevents a tab from storing to database with null values when some inputs are set disabled:
	if ( $row->published == '' ) {
		$row->published				=	( $oldrow->published != '' ? $oldrow->published : 1 );
	}
	if ( $row->default == '' ) {
		$row->default				=	( $oldrow->default != '' ? $oldrow->default : 0 );
	}
	if ( $row->useraccessgroupid == '' ) {
		$row->useraccessgroupid		=	( $oldrow->useraccessgroupid != '' ? $oldrow->useraccessgroupid : -2 );
	}
	if ( $row->viewaccesslevel == '' ) {
		$row->viewaccesslevel		=	( $oldrow->viewaccesslevel != '' ? $oldrow->viewaccesslevel : 1 );
	}
	if ( $row->ordering == '' ) {
		$row->ordering				=	( $oldrow->ordering != '' ? $oldrow->ordering : 999 );
	}
	if ( $row->usergroupids == '' ) {
		$row->usergroupids			=	( $oldrow->usergroupids != '' ? $oldrow->usergroupids : implode( ', ', $_CB_framework->acl->get_groups_below_me( null, true ) ) );
	}

	$row->description	=	cleanEditorsTranslationJunk( trim( $row->description ) );

	// Check if user is a super user:
	if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
		$failed					=	false;
		$canEditState			=	CBuser::getMyInstance()->authoriseAction( 'core.edit.state' );
		// Check if user belongs to useraccessgroupid
		if ( ( $row->useraccessgroupid != '' ) && ( ! in_array( $row->useraccessgroupid != '', $_CB_framework->acl->get_groups_below_me( null, true ) ) ) ) {
			$failed					=	true;
		}
		// Check if user belongs to viewaccesslevel
		if ( ( $row->viewaccesslevel != '' ) && ( ! in_array( $row->viewaccesslevel, CBuser::getMyInstance()->getAuthorisedViewLevelsIds( false ) ) ) ) {
			$failed					=	true;
		}
		// Check if user can edit status:
		if ( ! $canEditState ) {
			// Check if row exists and if publish is different from existing row
			// Check if row doesn't exist and if publish is different from default
			if ( ( $oldrow->listid && ( ( $row->published != '' ) && ( $oldrow->published != $row->published ) ) )
			|| ( ( ! $oldrow->listid ) && ( ( $row->published != '' ) && ( $row->published != 1 ) ) ) )
			{
				$failed					=	true;
			}
			// Check if row exists and if publish is different from existing row
			// Check if row doesn't exist and if publish is different from default
			if ( ( $oldrow->listid && ( ( $row->default != '' ) && ( $oldrow->default != $row->default ) ) )
			|| ( ( ! $oldrow->listid ) && ( ( $row->default != '' ) && ( $row->default != 1 ) ) ) )
			{
				$failed					=	true;
			}
			// Check if row exists and if useraccessgroupid is different from existing row
			// Check if row doesn't exist and if useraccessgroupid is different from default
			if ( ( $oldrow->listid && ( ( $row->useraccessgroupid != '' ) && ( $oldrow->useraccessgroupid != $row->useraccessgroupid ) ) )
			|| ( ( ! $oldrow->listid ) && ( ( $row->useraccessgroupid != '' ) && ( $row->useraccessgroupid != -2 ) ) ) )
			{
				$failed					=	true;
			}
			// Check if row exists and if viewaccesslevel is different from existing row
			// Check if row doesn't exist and if viewaccesslevel is different from default
			if ( ( $oldrow->listid && ( ( $row->viewaccesslevel != '' ) && ( $oldrow->viewaccesslevel != $row->viewaccesslevel ) ) )
			|| ( ( ! $oldrow->listid ) && ( ( $row->viewaccesslevel != '' ) && ( $row->viewaccesslevel != 1 ) ) ) )
			{
				$failed					=	true;
			}
			// Check if row exists and if ordering is different from existing row
			// Check if row doesn't exist and if ordering is different from default
			if ( ( $oldrow->listid && ( ( $row->ordering != '' ) && ( $oldrow->ordering != $row->ordering ) ) )
			|| ( ( ! $oldrow->listid ) && ( ( $row->ordering != '' ) && ( $row->ordering != 999 ) ) ) )
			{
				$failed					=	true;
			}
		}
		if ( $failed ) {
			echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
			exit;
		}
	}

	if(isset($_POST['col1'])) { $row->col1fields = implode("|*|",$_POST['col1']); } else { $row->col1fields = null; } ;
	if(isset($_POST['col2'])) { $row->col2fields = implode("|*|",$_POST['col2']); } else { $row->col2fields = null; } ;
	if(isset($_POST['col3'])) { $row->col3fields = implode("|*|",$_POST['col3']); } else { $row->col3fields = null; } ;
	if(isset($_POST['col4'])) { $row->col4fields = implode("|*|",$_POST['col4']); } else { $row->col4fields = null; } ;

	if ($row->col1enabled != 1) $row->col1enabled=0;
	if ($row->col2enabled != 1) $row->col2enabled=0;
	if ($row->col3enabled != 1) $row->col3enabled=0;
	if ($row->col4enabled != 1) $row->col4enabled=0;
	if ($row->col1captions != 1) $row->col1captions=0;
	if ($row->col2captions != 1) $row->col2captions=0;
	if ($row->col3captions != 1) $row->col3captions=0;
	if ($row->col4captions != 1) $row->col4captions=0;
	if (!$row->store( (int) $_POST['listid'],true)) {
		echo "<script type=\"text/javascript\"> alert('".$row->getError()."'); window.history.go(-2); </script>\n";
		exit();
	}

	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showLists" ), sprintf(CBTxt::T('Successfully Saved List: %s'), $row->title) );
}

function showLists( $option ) {
	global $_CB_database, $_CB_framework;

	$limit			=	(int) $_CB_framework->getCfg( 'list_limit' );
	if ( $limit == 0 ) {
		$limit = 10;
	}
	$limit			=	$_CB_framework->getUserStateFromRequest( "viewlistlimit", 'limit', $limit );
	$lastCBlist = $_CB_framework->getUserState( "view{$option}lastCBlist", null );
	if($lastCBlist=='showlists') {
		$limitstart	= $_CB_framework->getUserStateFromRequest( "view{$option}limitstart", 'limitstart', 0 );
		$lastSearch = $_CB_framework->getUserState( "search{$option}", null );
		$search		= $_CB_framework->getUserStateFromRequest( "search{$option}", 'search', '' );
		if ($lastSearch != $search) {
			$limitstart = 0;
			$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
		}
		$search = trim( strtolower( $search ) );
	} else {
		clearSearchBox();
		$search="";
		$limitstart = 0;
		$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
		$_CB_framework->setUserState( "view{$option}lastCBlist", "showlists" );
	}

	$where = array();
	if (isset( $search ) && $search!= "") {
		$search = cbEscapeSQLsearch( trim( strtolower( cbGetEscaped($search))));
		$where[] = "(a.title LIKE '%$search%' OR a.description LIKE '%$search%')";
	}

	if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
		$viewAccessLevelsInts		=	CBuser::getMyInstance()->getAuthorisedViewLevelsIds( false );
		$where[]					=	'a.viewaccesslevel IN ('. implode( ',', $viewAccessLevelsInts ) . ')';

		$where[]	 =	"a.useraccessgroupid IN (" . implode( ',', $_CB_framework->acl->get_groups_below_me( null, true ) ) . ")";
	}

	$_CB_database->setQuery( "SELECT COUNT(*)"
		. "\n FROM #__comprofiler_lists AS a"
		. (count( $where ) ? "\nWHERE " . implode( ' AND ', $where ) : "")
	);
	$total = $_CB_database->loadResult();
	echo $_CB_database->getErrorMsg();
	if ($total <= $limitstart) $limitstart = 0;

	cbimport( 'cb.pagination' );
	$pageNav = new cbPageNav( $total, $limitstart, $limit  );

	if ( checkJversion() == 2 ) {
		$title = 'title';
	} else {
		$title = 'name';
	}

	$query	=	"SELECT a.listid, a.title, a.description, a.published, a.`default`, a.ordering, a.viewaccesslevel, al.$title AS viewaccesslevelname, a.useraccessgroupid"
			.	"\nFROM #__comprofiler_lists a";
	
	if ( checkJversion() == 2 ) {
		$query .=	"\n LEFT JOIN #__viewlevels AS al ON al.id = a.viewaccesslevel";
	} else {
		$query .=	"\n LEFT JOIN #__groups AS al ON al.id + 1 = a.viewaccesslevel"; 		// fix J1.5-'s wrong access levels, same as g.id = IF( m.access = 0, 1, IF( m.access = 1, 2, IF( m.access = 2, 3, m.access ) ) )
	}

	$query	.=	(count( $where ) ? "\nWHERE " . implode( ' AND ', $where ) : "")
			.	"\n ORDER BY ordering";
	$_CB_database->setQuery( $query, (int) $pageNav->limitstart, (int) $pageNav->limit );

	$rows = $_CB_database->loadObjectList();
	if ($_CB_database->getErrorNum()) {
		echo $_CB_database->stderr();
		return false;
	}

	$canEdit		=	CBuser::getMyInstance()->authoriseAction( 'core.edit' );
	$canEditState			=	CBuser::getMyInstance()->authoriseAction( 'core.edit.state' );
	$showUserAccessGroupId	=	isStillUsingGroupsForViewAccess( '#__comprofiler_lists' );

	HTML_comprofiler::showLists( $rows, $pageNav, $search, $option, $canEdit, $canEditState, $showUserAccessGroupId );
	return true;
}

function editList( $fid='0', $option='com_comprofiler', $task = 'editList') {
	global $_CB_database, $_CB_framework, $ueConfig;

	$canEditState			=	CBuser::getMyInstance()->authoriseAction( 'core.edit.state' );

	$row					=	new moscomprofilerLists( $_CB_database );

	if ( $fid ) {
		// load the row from the db table
		$row->load( (int) $fid );
		// Check if user is a super user:
		if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
			// Check if user belongs to useraccessgroupid:
			if ( ! in_array( $row->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
				echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
				exit;
			}
			// Check if user belongs to viewaccesslevel:
			if ( ! in_array( $row->viewaccesslevel, CBuser::getMyInstance()->getAuthorisedViewLevelsIds( false ) ) ) {
				echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
				exit;
			}
		}
	} else {
		$row->published		= 1;
		$row->default		= 0;
		$row->col1enabled	=	'1';
		$row->viewaccesslevel		= 1;
		$row->useraccessgroupid		= -2;
		$row->ordering 				= 999;
	}

	$lists['published']		=	moscomprofilerHTML::yesnoSelectList( 'published', 'class="inputbox" size="1"' . ( $canEditState ? '' : ' disabled="disabled"' ), $row->published );
	$lists['default']		=	moscomprofilerHTML::yesnoSelectList( 'default', 'class="inputbox" size="1"' . ( $canEditState ? '' : ' disabled="disabled"' ), $row->default );

	$gtree2					=	array();
	if ( ( ! $_CB_framework->acl->amIaSuperAdmin() ) && in_array( (int) $row->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
    	// This should always be the case:
		// ensure user can't add group higher than themselves:
		$gtree2 = array_merge( $gtree2, $_CB_framework->acl->get_groups_below_me() );		// vs $_CB_framework->acl->get_groups_below_me( null, true )  in tab lists
    } else {
    	// Just in case we missed one, and as super-admin we should see everything:
		$gtree2 = array_merge( $gtree2, $_CB_framework->acl->get_group_children_tree( null, 'USERS', false ));
    }

	if ( ! $fid ) {
		$row->usergroupids		= implode( ', ', $_CB_framework->acl->get_groups_below_me( null, true ) );
	}

	$usergids				=	explode( ', ', $row->usergroupids );
	$ugids					=	array();
	foreach($usergids as $usergid) {
		$ugids[]			=	$usergid;
	}

	// build the html select list for the view level access (filtered by View Access Levels visible by the admin if not super user:
	$accessTree				=	$_CB_framework->acl->get_access_children_tree( true, false, ( ! $_CB_framework->acl->amIaSuperAdmin() ) );
	$lists['viewaccesslevel']	=	moscomprofilerHTML::selectList( $accessTree, 'viewaccesslevel', 'class="inputbox"' . ( $canEditState ? '' : ' disabled="disabled"' ), 'value', 'text', intval( $row->viewaccesslevel ), 2 );

	$lists['usergroups']	=	moscomprofilerHTML::selectList( $gtree2, 'usergroups', 'size="4" MULTIPLE onblur="loadUGIDs(this);" mosReq=1 mosLabel="' . htmlspecialchars( CBTxt::T('User Groups to Include in List') ) . '"' . ( $canEditState ? '' : ' disabled="disabled"' ), 'value', 'text', $ugids, 1, false );

	// We want to use View Access Levels in Joomla 1.6, and hide old method if unused:
	if ( isStillUsingGroupsForViewAccess( $row->_tbl ) ) {
		$gtree3					=	array();
	    $gtree3[]				=	moscomprofilerHTML::makeOption( -2 , '- ' . CBtxt::T('Everybody') . ' -' );
	    $gtree3[]				=	moscomprofilerHTML::makeOption( -1 , '- ' . CBtxt::T('All Registered Users') . ' -' );
		if ( ( ! $_CB_framework->acl->amIaSuperAdmin() ) && in_array( (int) $row->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
	    	// This should always be the case:
			// ensure user can't add group higher than themselves:
			$gtree3 = array_merge( $gtree3, $_CB_framework->acl->get_groups_below_me() );		// vs $_CB_framework->acl->get_groups_below_me( null, true )  in tab lists
	    } else {
	    	// Just in case we missed one, and as super-admin we should see everything:
			$gtree3 = array_merge( $gtree3, $_CB_framework->acl->get_group_children_tree( null, 'USERS', false ));
	    }
		$lists['useraccessgroup']	=	moscomprofilerHTML::selectList( $gtree3, 'useraccessgroupid', 'size="4" mosReq=1 mosLabel="' . htmlspecialchars( CBTxt::T('User Group to allow access to') ) . '"' . ( $canEditState ? '' : ' disabled="disabled"' ), 'value', 'text', $row->useraccessgroupid, 2, false, false );
	} else {
		$lists['useraccessgroup']	=	null;
	}


	$_CB_database->setQuery( "SELECT f.fieldid, f.title"
		. "\n FROM #__comprofiler_fields AS f"
		. "\n INNER JOIN #__comprofiler_plugin AS p ON (f.pluginid = p.id)"
		. "\n WHERE ( ( f.published = 1"
		. "\n           AND f.profile > 0 ) OR ( f.name = 'username' ) " . ( in_array( $ueConfig['name_format'], array( 1, 2, 4 ) ) ? "OR ( f.name = 'name' ) " : '' ) . ")"
		. "\n  AND p.published = 1"
		. "\n ORDER BY f.ordering"
	);
	$field								=	$_CB_database->loadObjectList();
	$fields								=	array();
	for ( $i = 0, $n = count( $field ) ; $i < $n ; $i++ ) {
		$fieldvalue						=&	$field[$i];
		$fields[$fieldvalue->fieldid]	=	$fieldvalue->title;
	}
	//print_r(array_values($fields));

	// params:
	$paramsEditorHtml			=	array();
	$options					=	array( 'option' => $option, 'task' => $task, 'cid' => $row->listid );

	// list-specific own parameters:
	cbimport( 'cb.xml.simplexml' );
	$listXml					=	new CBSimpleXMLElement( file_get_contents( $_CB_framework->getCfg( 'absolute_path' ) . '/administrator/components/com_comprofiler/xmlcb/cb.lists.xml' ) );
	$null						=	null;
	$params						=	new cbParamsEditorController( $row->params, $listXml, $listXml, $null, null, 'cbxml', 'version', '1' );
	$params->setOptions( $options );
	$listParamsEditHtml			=	$params->draw( null, 'views', 'view', 'name', 'editlist' );
	$paramsEditorHtml[]			=	array( 'title' => CBTxt::T('List parameters'), 'content' => $listParamsEditHtml );
/*

	// params:
	$paramsEditorHtml			=	array();
	$options					=	array( 'option' => $option, 'task' => $task, 'cid' => $row->fieldid );

	// field-specific own parameters:
	$fieldHandler				=	new cbFieldHandler();
	$fieldOwnParamsEditHtml		=	$fieldHandler->drawParamsEditor( $row, $options );
	if ( $fieldOwnParamsEditHtml ) {
		$paramsEditorHtml[]		=	array( 'title' => CBTxt::T('Field-specific Parameters'), 'content' => $fieldOwnParamsEditHtml );
	}

	// additional non-specific other parameters:
	$fieldsParamsPlugins		=	$_PLUGINS->getUserFieldParamsPluginIds();
	foreach ($fieldsParamsPlugins as $pluginId => $fieldParamHandlerClassName ) {
		$fieldParamHandler		=	new $fieldParamHandlerClassName( $pluginId, $row );			// cbFieldParamsHandler();
		$addParamsHtml			=	$fieldParamHandler->drawParamsEditor( $options );
		if ( $addParamsHtml ) {
			$addParamsTitle		=	$fieldParamHandler->getFieldsParamsLabel();
			$paramsEditorHtml[]	=	array( 'title' => $addParamsTitle, 'content' => $addParamsHtml );
		}
	}
*/
	HTML_comprofiler::editList( $row, $lists,$fields, $option, $fid, $paramsEditorHtml );
}

function removeList( $cid, $option ) {
	global $_CB_framework, $_CB_database;

	if (!is_array( $cid ) || count( $cid ) < 1) {
		echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Select an item to delete') ) . "'); window.history.go(-1);</script>\n";
		exit;
	}
	$msg = '';
	if (count( $cid )) {
		$obj = new moscomprofilerLists( $_CB_database );
		foreach ($cid as $id) {
				$obj->delete( $id );
			}
		}

	//if($msg!='') echo "<script type=\"text/javascript\"> alert('".$msg."'); window.history.go(-1);</script>\n";
	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showLists" ), $msg );
}

function orderLists( $lid, $inc, $option ) {
	global $_CB_framework, $_CB_database;
	$row = new moscomprofilerLists( $_CB_database );
	$row->load( (int) $lid );
	$row->move( $inc );
	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showLists" ) );
}

function showField( $option ) {
	global $_CB_database, $_CB_framework;

	_upgradeCbFieldsTableOldFields();

	$limit			=	(int) $_CB_framework->getCfg( 'list_limit' );
	if ( $limit == 0 ) {
		$limit = 10;
	}
	$limit			=	$_CB_framework->getUserStateFromRequest( "viewlistlimit", 'limit', $limit );
	$lastCBlist = $_CB_framework->getUserState( "view{$option}lastCBlist", null );
	if($lastCBlist=='showfields') {
		$limitstart	= $_CB_framework->getUserStateFromRequest( "view{$option}limitstart", 'limitstart', 0 );
		$lastSearch = $_CB_framework->getUserState( "search{$option}", null );
		$search		= $_CB_framework->getUserStateFromRequest( "search{$option}", 'search', '' );
		if ($lastSearch != $search) {
			$limitstart = 0;
			$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
		}
		$search = trim( strtolower( $search ) );
	} else {
		clearSearchBox();
		$search="";
		$limitstart = 0;
		$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
		$_CB_framework->setUserState( "view{$option}lastCBlist", "showfields" );
	}

	$where = array();
//	$where[] = "(f.sys = 0)";
	if (isset( $search ) && $search!= "") {
		$search = cbEscapeSQLsearch( trim( strtolower( cbGetEscaped($search))));
		$where[] = "(f.name LIKE '%$search%' OR f.type LIKE '%$search%')";
	}
	if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
		$where[]	 =	"t.useraccessgroupid IN (" . implode( ',', $_CB_framework->acl->get_groups_below_me( null, true ) ) . ")";
	}

	$_CB_database->setQuery( "SELECT COUNT(*)"
		. "\n FROM #__comprofiler_fields AS f, #__comprofiler_tabs AS t"
		. "\n WHERE (f.tabid = t.tabid) AND (t.fields = 1)" . ( count( $where ) ? ( " AND " . implode( ' AND ', $where ) ) : "" )
	);
	$total = $_CB_database->loadResult();
	echo $_CB_database->getErrorMsg();
	if ($total <= $limitstart) $limitstart = 0;

	cbimport( 'cb.pagination' );
	$pageNav = new cbPageNav( $total, $limitstart, $limit );
	$_CB_database->setQuery( "SELECT f.fieldid, f.title, f.name, f.description, f.type, f.required, f.published, "
		. "f.profile, f.ordering, f.registration, f.searchable, f.pluginid, f.sys, f.tablecolumns, "
		. "t.title AS 'tab', t.enabled AS 'tabenabled', t.pluginid AS 'tabpluginid', "
		. "p.name AS pluginname, p.published AS pluginpublished, "
		. "pf.name AS fieldpluginname, pf.published AS fieldpluginpublished "
		. "\n FROM #__comprofiler_fields AS f"
		. "\n INNER JOIN #__comprofiler_tabs AS t ON ( (f.tabid = t.tabid) AND (t.fields = 1) ) "
		. "\n LEFT JOIN #__comprofiler_plugin AS p ON p.id = t.pluginid"
		. "\n LEFT JOIN #__comprofiler_plugin AS pf ON pf.id = f.pluginid"
		. (count( $where ) ? "\n WHERE " . implode( ' AND ', $where ) : "")
		. "\n ORDER BY t.ordering, f.ordering",
		(int) $pageNav->limitstart, (int) $pageNav->limit
	);

	$rows = $_CB_database->loadObjectList();
	if ($_CB_database->getErrorNum()) {
		echo $_CB_database->stderr();
		return false;
	}

	$canEdit		=	CBuser::getMyInstance()->authoriseAction( 'core.edit' );
	$canEditState	=	CBuser::getMyInstance()->authoriseAction( 'core.edit.state' );

	HTML_comprofiler::showFields( $rows, $pageNav, $search, $option, $canEdit, $canEditState );	return true;
}

function _upgradeCbFieldsTableOldFields( ) {
	global $_CB_database;

	// Upgrade old-fashioned fields (and the ones created by Fireboard !)
	$query						=	'UPDATE #__comprofiler_fields SET tablecolumns = name, pluginid = 1 WHERE pluginid = 0';
	$_CB_database->setQuery( $query );
	$_CB_database->query();
}


function removeField( $cid, $option ) {
	global $_CB_database, $_CB_framework;

	if (!is_array( $cid ) || count( $cid ) < 1) {
		echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Select an item to delete') ) . "'); window.history.go(-1);</script>\n";
		exit;
	}
	$msg = '';
	if (count( $cid )) {
		$obj = new moscomprofilerFields( $_CB_database );

		$deletedOkNames		=	array();

		foreach ($cid as $id) {
			$id = (int) $id;
			$obj->load( $id );

			$fieldTab = new moscomprofilerTabs( $_CB_database );
			$fieldTab->load( (int) $obj->tabid );
			if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
				if ( ! in_array( $fieldTab->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
					echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) ."'); window.history.go(-1);</script>\n";
					exit;
				}
			}

			$noDelete = 0;
			$_CB_database->setQuery("SELECT COUNT(*) FROM #__comprofiler_lists".
					" WHERE col1fields like '%|*|$id' OR col1fields like '$id|*|%' OR col1fields like '%|*|$id|*|%' OR col1fields='$id'".
					" OR col2fields like '%|*|$id' OR col2fields like '$id|*|%' OR col2fields like '%|*|$id|*|%' OR col2fields='$id'".
					" OR col3fields like '%|*|$id' OR col3fields like '$id|*|%' OR col3fields like '%|*|$id|*|%' OR col3fields='$id'".
					" OR col4fields like '%|*|$id' OR col4fields like '$id|*|%' OR col4fields like '%|*|$id|*|%' OR col4fields='$id'");
			$onList = $_CB_database->loadResult();
			if ($onList > 0) {
				$msg .= sprintf(CBTxt::T('%s cannot be deleted because it is on a List.') . "\n", getLangDefinition($obj->title));
				$noDelete = 1;
			}
			if ($obj->sys==1) {
				$msg .= sprintf(CBTxt::T('%s cannot be deleted because it is a system field.') . "\n", getLangDefinition($obj->title));
				$noDelete = 1;
			}
			if ($noDelete != 1) {
				if ( $obj->deleteDataDescr( $id ) ) {
					$sql="UPDATE #__comprofiler_fields SET ordering = ordering-1 WHERE ordering > ".(int) $obj->ordering." AND tabid = ".(int) $obj->tabid;
					$_CB_database->setQuery($sql);
					$_CB_database->query();
					$deletedOkNames[]	=	$obj->title;
				}
			}
		}
	}

	if ( ! $msg ) {
		$msg = CBTxt::T('Successfully Deleted Fields') . ': '. implode( ', ', $deletedOkNames );
	}
	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ), $msg );
}


function orderFields( $fid, $inc, $option ) {
	global $_CB_database, $_CB_framework;
	$row = new moscomprofilerFields( $_CB_database );
	$row->load( (int) $fid );

	$fieldTab = new moscomprofilerTabs( $_CB_database );
	$fieldTab->load( (int) $row->tabid );
	if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
		if ( ! in_array( $fieldTab->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
			echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
			exit;
		}
	}

	$row->move( $inc , "tabid='$row->tabid'");
	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ) );
}


function showTab( $option ) {
	global $_CB_database, $_CB_framework;

	$limit			=	(int) $_CB_framework->getCfg( 'list_limit' );
	if ( $limit == 0 ) {
		$limit = 10;
	}
	$limit			=	$_CB_framework->getUserStateFromRequest( "viewlistlimit", 'limit', $limit );
	$lastCBlist = $_CB_framework->getUserState( "view{$option}lastCBlist", null );
	if($lastCBlist=='showtab') {
		$limitstart	= $_CB_framework->getUserStateFromRequest( "view{$option}limitstart", 'limitstart', 0 );
		$lastSearch = $_CB_framework->getUserState( "search{$option}", null );
		$search		= $_CB_framework->getUserStateFromRequest( "search{$option}", 'search', '' );
		if ($lastSearch != $search) {
			$limitstart = 0;
			$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
		}
		$search = trim( strtolower( $search ) );
	} else {
		clearSearchBox();
		$search="";
		$limitstart = 0;
		$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
		$_CB_framework->setUserState( "view{$option}lastCBlist", "showtab" );
	}

	$where = array();
	if (isset( $search ) && $search!= "") {
		$search  =	cbEscapeSQLsearch( trim( strtolower( cbGetEscaped($search))));
		$where[] =	"(a.title LIKE '%$search%')";
	}

	if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
		$viewAccessLevelsInts		=	CBuser::getMyInstance()->getAuthorisedViewLevelsIds( false );
		$where[]					=	'a.viewaccesslevel IN ('. implode( ',', $viewAccessLevelsInts ) . ')';

		$where[]	 =	"a.useraccessgroupid IN (" . implode( ',', $_CB_framework->acl->get_groups_below_me( null, true ) ) . ")";
	}

	$_CB_database->setQuery( "SELECT COUNT(*)"
		. "\nFROM #__comprofiler_tabs AS a"
		. (count( $where ) ? "\nWHERE " . implode( ' AND ', $where ) : "")
	);
	$total = $_CB_database->loadResult();
	echo $_CB_database->getErrorMsg();
	if ($total <= $limitstart) $limitstart = 0;

	cbimport( 'cb.pagination' );
	$pageNav = new cbPageNav( $total, $limitstart, $limit  );

	if ( checkJversion() == 2 ) {
		$title = 'title';
	} else {
		$title = 'name';
	}

	$query		=	"SELECT a.*, p.name AS pluginname, p.published AS pluginpublished, al.$title AS viewaccesslevelname"
				.	"\n FROM #__comprofiler_tabs AS a"
				.	"\n LEFT JOIN #__comprofiler_plugin AS p ON p.id = a.pluginid";

	if ( checkJversion() == 2 ) {
		$query .=	"\n LEFT JOIN #__viewlevels AS al ON al.id = a.viewaccesslevel";
	} else {
		$query .=	"\n LEFT JOIN #__groups AS al ON al.id + 1 = a.viewaccesslevel"; 		// fix J1.5-'s wrong access levels, same as g.id = IF( m.access = 0, 1, IF( m.access = 1, 2, IF( m.access = 2, 3, m.access ) ) )
	}

	$query		.=	(count( $where ) ? "\nWHERE " . implode( ' AND ', $where ) : "")
				.	"\n ORDER BY position, ordering";

	$_CB_database->setQuery( $query, (int) $pageNav->limitstart, (int) $pageNav->limit );
	$rows = $_CB_database->loadObjectList();
	if ($_CB_database->getErrorNum()) {
		echo $_CB_database->stderr();
		return false;
	}

	$canEdit				=	CBuser::getMyInstance()->authoriseAction( 'core.edit' );
	$canEditState			=	CBuser::getMyInstance()->authoriseAction( 'core.edit.state' );
	$showUserAccessGroupId	=	isStillUsingGroupsForViewAccess( '#__comprofiler_tabs' );

	HTML_comprofiler::showTabs( $rows, $pageNav, $search, $option, $canEdit, $canEditState, $showUserAccessGroupId );
	return true;
}

function removeTabs( $cid, $option ) {
	global $_CB_database, $_CB_framework;

	if (!is_array( $cid ) || count( $cid ) < 1) {
		echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Select an item to delete') ) . "'); window.history.go(-1);</script>\n";
		exit;
	}
	$msg = '';
	if (count( $cid )) {
		$obj = new moscomprofilerTabs( $_CB_database );
		foreach ($cid as $id) {
			$noDelete = 0;
			$obj->load( (int) $id );
			if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
				if ( ! in_array( $obj->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
					echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
					exit;
				}
			}

			$_CB_database->setQuery( "SELECT COUNT(*) FROM #__comprofiler_fields WHERE tabid=" . (int) $id );
			$onField = $_CB_database->loadResult();
			if( $obj->sys > 0 ) {
				$msg .= sprintf(CBTxt::T('%s cannot be deleted because it is a system tab.'),getLangDefinition($obj->title)) . " \n";
				$noDelete = 1;
			}
			if( $obj->pluginid ) {
				$plugin	=	new moscomprofilerPlugin( $_CB_database );
				if ( $plugin->load( $obj->pluginid ) ) {
					$msg .= sprintf(CBTxt::T('%s cannot be deleted because it is a tab belonging to an installed plugin.'),getLangDefinition($obj->title)) . " \n";
					$noDelete = 1;
				}
			}
			if( $onField > 0 ) {
				$msg .= sprintf(CBTxt::T('%s is being referenced by an existing field and cannot be deleted!'),getLangDefinition($obj->title));
				$noDelete = 1;
			}
			if( $noDelete == 0 ) {
				$obj->delete( $id );
				$msg .= $obj->getError();
			}
		}
	}
	if ( $msg ) {
		echo "<script type=\"text/javascript\"> alert('" . str_replace( "\n", '\\n', addslashes( $msg ) ) . "'); window.history.go(-1);</script>\n";
		exit;
	}
	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showTab" ) );
}


function orderTabs( $tid, $inc, $option ) {
	global $_CB_database, $_CB_framework;

	$row = new moscomprofilerTabs( $_CB_database );
	$row->load( (int) $tid );

	if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
		if ( ! in_array( $row->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
			echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
			exit;
		}
	}

	$row->move( $inc, "position='$row->position' AND ordering > -10000 AND ordering < 10000 "  );
	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showTab" ) );
}


function deleteUsers( $cid, $inComprofilerOnly = false ) {
	global $_CB_framework, $_CB_database;

	$msg = checkCBpermissions( $cid, "delete", false );

	if (!$msg && is_array( $cid ) && count( $cid )) {
		new cbTabs( 0, 2, null, false );		// loads plugins
		foreach ($cid as $id) {
			$obj		=&	$_CB_framework->_getCmsUserObject( (int) $id );
			if ( ( $obj !== null ) || $inComprofilerOnly ) {
				$count = 2;
				if ( checkJversion() == 2 ) {
					$cms_super_admin	=	8;		//TODO in CB 2.0 we will do this better
				} else {
					$cms_super_admin	=	25;
				}
				if ( ( $obj !== null ) && ( $obj->gid == $cms_super_admin ) ) {
					// count number of active super admins
					if ( checkJversion() == 2 ) {
						$query			=	'SELECT COUNT( a.id )'
										.	"\n FROM #__users AS a"
										.	"\n INNER JOIN #__user_usergroup_map AS b"
										.	' ON b.user_id = a.id'
										.	"\n WHERE b.group_id = " . (int) $cms_super_admin
										.	"\n AND a.block = 0"
					;
					} else {
						$query			=	'SELECT COUNT( id )'
										.	"\n FROM #__users"
										.	"\n WHERE gid = " . (int) $cms_super_admin
										.	"\n AND block = 0"
										;
					}
					$_CB_database->setQuery( $query );
					$count = $_CB_database->loadResult();
				}

				if ( $count <= 1 && $obj->gid == $cms_super_admin ) {
				// cannot delete Super Admin where it is the only one that exists
					$msg .= CBTxt::T('You cannot delete this Super Administrator as it is the only active Super Administrator for your site');
				} else {
					// delete user
					$result = cbDeleteUser( $id, null, $inComprofilerOnly );
					if ( $result === null ) {
						$msg .= CBTxt::T('User not found');
					} elseif (is_string( $result ) && ( $result != "" ) ) {
						$msg .= $result;
					}
				}
			} else {
				$msg .= CBTxt::T('User not found');
			}
		}
	}
	return $msg;
}

function removeUsers( $cid, $option ) {
	global $_CB_framework;

	if (!is_array( $cid ) || count( $cid ) < 1) {
		echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Select an item to delete') ) . "'); window.history.go(-1);</script>\n";
		exit;
	}

	$msg = deleteUsers($cid);
	if ($msg) {
		echo "<script type=\"text/javascript\"> alert('".$msg."'); window.history.go(-1);</script>\n";
		exit;
	}

	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showusers" ), $msg );
}

/**
* Blocks or Unblocks one or more user records
* @param array An array of unique category id numbers
* @param integer 0 if unblock, 1 if blocking
* @param string The current url option
*/
function changeUserBlock( $cid=null, $block=1, $option ) {
	$action = $block ? 'block' : 'unblock';
	changeUsersStatus( $cid, $action, $block, $option );
}
/**
* Approves or Rejects one or more user records
* @param array An array of unique category id numbers
* @param integer 0 if reject, 1 if approve
* @param string The current url option
*/
function approveUser( $cid=null, $approved=1, $option ) {
	$action = $approved ? 'Approve' : 'Reject';
	changeUsersStatus( $cid, $action, $approved, $option );
}

/**
 * Change users status
 *
 * @param array of int $cid
 * @param string       $action   ( Approve, Reject, block, unblock )
 * @param int          $actionValue
 * @param string       $option
 */
function changeUsersStatus( $cid=null, $action, $actionValue, $option ) {
    global $_CB_framework, $_CB_database, $ueConfig, $_PLUGINS;

    if (count( $cid ) < 1) {
    	echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
    	exit;
    }
	$msg = checkCBpermissions( $cid, $action, false );
	if ($msg) {
		echo "<script type=\"text/javascript\"> alert('".$msg."'); window.history.go(-1);</script>\n";
		exit;
	}

	cbArrayToInts($cid);
	$cids = implode( ',', $cid );

    $_PLUGINS->loadPluginGroup('user');
	$query = "SELECT * FROM #__comprofiler c, #__users u WHERE c.id=u.id AND c.id IN ( " . $cids . " )";
	$_CB_database->setQuery($query);
	$users = $_CB_database->loadObjectList( null, 'moscomprofilerUser', array( & $_CB_database ) );

	foreach ( $users as $row ) {
		switch ( $action ) {
			case 'Approve':
			case 'Reject':
				if ($actionValue == 0) {
					$approved = 2;		// "rejected"
				} else {
					$approved = $actionValue;
				}
				$_PLUGINS->trigger( 'onBeforeUserApproval', array( $row, $approved ) );
				$_CB_database->setQuery( "UPDATE #__comprofiler SET approved=" . (int) $approved . " WHERE id = " . (int) $row->id );
				if ($_CB_database->query()) {
					if($approved==1) {
						if( isset( $ueConfig['emailpass'] ) && ( $ueConfig['emailpass'] == "1" ) && ( $row->approved == 0 ) ) {
							// if we need to generate a random password to be emailed with confirmation, set new random password only at first approval:
							$row->setRandomPassword();
							$row->storePassword( false );
						}
						if ($row->approved == 0 && $approved == 1 && $row->confirmed == 1 ) {
							$row->approved = 1;
							activateUser($row, 2, "UserApproval", false);
						}
					}
					$_PLUGINS->trigger( 'onAfterUserApproval', array( $row, $approved, true ) );
				}
				break;

			case 'block':
			case 'unblock':
				$_PLUGINS->trigger( 'onBeforeUserBlocking', array( $row, $actionValue ) );
				$row->block		=	(int) $actionValue;	
				if ( $row->storeBlock( false ) ) {
					// if action is to block a user, delete user acounts active sessions
					if ( $actionValue == 1 ) {
						$query = "DELETE FROM #__session"
					 	. "\n WHERE userid = " . (int) $row->id;
						$_CB_database->setQuery( $query );
						$_CB_database->query();
					}
				}
				break;

			default:
				echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('unknown action %s') ), $action ) . "'); window.history.go(-1);</script>\n";
				exit;
				break;
		}
	}
    cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showusers" ) );
}

function cbIsEmail($email){
	$rBool=false;

	if(preg_match("/[\\w\\.\\-]+@\\w+[\\w\\.\\-]*?\\.\\w{1,4}/", $email)){
		$rBool=true;
	}
	return $rBool;
}
function showConfig( $option ) {
	global $_CB_framework, $_CB_database,$ueConfig;
	global $_CB_adminpath;

	cbimport( 'cb.adminfilesystem' );
	$adminFS			=&	cbAdminFileSystem::getInstance();

	$configfile			=	$_CB_adminpath."/ue_config.php";

	//Add code to check if config file is writeable.
	if ( $adminFS->isUsingStandardPHP() && ! is_writable($configfile)) {
		@chmod ($configfile, 0766);
		$permission = is_writable($configfile);
		if (!$permission) {
			echo "<center><h1><font color=red>" . _UE_WARNING . "...</font></h1><BR>";
			echo "<b>" . _UE_YOUR_CONFIG_FILE . ": $configfile <font color=red>" . _UE_IS_NOT_WRITABLE . "</font></b><br />";
			echo "<b>" . _UE_NEED_TO_CHMOD_CONFIG . "</b></center><br /><br />";
		}
	}

	$lists = array();
	// make a standard yes/no list
	$yesno = array();
	$yesno[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
	$yesno[] = moscomprofilerHTML::makeOption( '1', _UE_YES );

	$admin_allowcbregistration = array();
	$admin_allowcbregistration[] = moscomprofilerHTML::makeOption( '0', _UE_REG_ALLOWREG_SAME_AS_GLOBAL );
	$admin_allowcbregistration[] = moscomprofilerHTML::makeOption( '1', _UE_REG_ALLOWREG_YES );

	$conNotifyTypes=array();
	$conNotifyTypes[] = moscomprofilerHTML::makeOption( '0', _UE_NONE );
	$conNotifyTypes[] = moscomprofilerHTML::makeOption( '1', CBTxt::T('Email') );
	$conNotifyTypes[] = moscomprofilerHTML::makeOption( '2', CBTxt::T('PMS') );
	$conNotifyTypes[] = moscomprofilerHTML::makeOption( '3', CBTxt::T('PMS+Email') );

	$dateformats = array();
	$dateformats[] = moscomprofilerHTML::makeOption('Y/m/d',CBTxt::T('yyyy/mm/dd'));
	$dateformats[] = moscomprofilerHTML::makeOption('d/m/y',CBTxt::T('dd/mm/yy'));
	$dateformats[] = moscomprofilerHTML::makeOption('y/m/d',CBTxt::T('yy/mm/dd'));
	$dateformats[] = moscomprofilerHTML::makeOption('d/m/Y',CBTxt::T('dd/mm/yyyy'));
	$dateformats[] = moscomprofilerHTML::makeOption('m/d/y',CBTxt::T('mm/dd/yy'));
	$dateformats[] = moscomprofilerHTML::makeOption('m/d/Y',CBTxt::T('mm/dd/yyyy'));
	$dateformats[] = moscomprofilerHTML::makeOption('Y-m-d',CBTxt::T('yyyy-mm-dd'));
	$dateformats[] = moscomprofilerHTML::makeOption('d-m-y',CBTxt::T('dd-mm-yy'));
	$dateformats[] = moscomprofilerHTML::makeOption('y-m-d',CBTxt::T('yy-mm-dd'));
	$dateformats[] = moscomprofilerHTML::makeOption('d-m-Y',CBTxt::T('dd-mm-yyyy'));
	$dateformats[] = moscomprofilerHTML::makeOption('m-d-y',CBTxt::T('mm-dd-yy'));
	$dateformats[] = moscomprofilerHTML::makeOption('m-d-Y',CBTxt::T('mm-dd-yyyy'));
	$dateformats[] = moscomprofilerHTML::makeOption('Y.m.d',CBTxt::T('yyyy.mm.dd'));
	$dateformats[] = moscomprofilerHTML::makeOption('d.m.y',CBTxt::T('dd.mm.yy'));
	$dateformats[] = moscomprofilerHTML::makeOption('y.m.d',CBTxt::T('yy.mm.dd'));
	$dateformats[] = moscomprofilerHTML::makeOption('d.m.Y',CBTxt::T('dd.mm.yyyy'));
	$dateformats[] = moscomprofilerHTML::makeOption('m.d.y',CBTxt::T('mm.dd.yy'));
	$dateformats[] = moscomprofilerHTML::makeOption('m.d.Y',CBTxt::T('mm.dd.yyyy'));

	$calendartypes = array();
	$calendartypes[] = moscomprofilerHTML::makeOption('2', _UE_CALENDAR_TYPE_DROPDOWN_POPUP );
	$calendartypes[] = moscomprofilerHTML::makeOption('1', _UE_CALENDAR_TYPE_POPUP );

	$nameformats = array();
	$nameformats[] = moscomprofilerHTML::makeOption('1', _UE_REG_NAMEFORMAT_NAME_ONLY );
	$nameformats[] = moscomprofilerHTML::makeOption('2', _UE_REG_NAMEFORMAT_NAME_USERNAME );
	$nameformats[] = moscomprofilerHTML::makeOption('3', _UE_REG_NAMEFORMAT_USERNAME_ONLY );
	$nameformats[] = moscomprofilerHTML::makeOption('4', _UE_REG_NAMEFORMAT_USERNAME_NAME );

	$imgToolBox 				=	new imgToolBox();
	$imgToolBox->_IM_path		=	$ueConfig['im_path'];
	$imgToolBox->_NETPBM_path	=	$ueConfig['netpbm_path'];
	$imageLibs					=	$imgToolBox->getImageLibs();
	$conversiontype				=	array();
	if(array_key_exists('imagemagick',$imageLibs)|| ($ueConfig['conversiontype']=='1')) $conversiontype[] = moscomprofilerHTML::makeOption('1',CBTxt::T('ImageMagick'));
	if(array_key_exists('netpbm',$imageLibs)	 || ($ueConfig['conversiontype']=='2')) $conversiontype[] = moscomprofilerHTML::makeOption('2',CBTxt::T('NetPBM'));
	if(array_key_exists('gd1',$imageLibs['gd'])	 || ($ueConfig['conversiontype']=='3')) $conversiontype[] = moscomprofilerHTML::makeOption('3',CBTxt::T('GD1 library'));
	if(array_key_exists('gd2',$imageLibs['gd'])	 || ($ueConfig['conversiontype']=='4')) $conversiontype[] = moscomprofilerHTML::makeOption('4',CBTxt::T('GD2 library'));

	$namestyles = array();
	$namestyles[] = moscomprofilerHTML::makeOption('1', _UE_REG_NAMEFORMAT_SINGLE_FIELD );
	$namestyles[] = moscomprofilerHTML::makeOption('2', _UE_REG_NAMEFORMAT_TWO_FIELDS );
	$namestyles[] = moscomprofilerHTML::makeOption('3', _UE_REG_NAMEFORMAT_THREE_FIELDS );

	$emailhandling = array();
	$emailhandling[] = moscomprofilerHTML::makeOption('1', _UE_REG_EMAILDISPLAY_EMAIL_ONLY );
	$emailhandling[] = moscomprofilerHTML::makeOption('2', _UE_REG_EMAILDISPLAY_EMAIL_W_MAILTO );
	$emailhandling[] = moscomprofilerHTML::makeOption('3', _UE_REG_EMAILDISPLAY_EMAIL_W_FORM );
	$emailhandling[] = moscomprofilerHTML::makeOption('4', _UE_REG_EMAILDISPLAY_EMAIL_NO );

	$emailreplyto = array();
	$emailreplyto[] = moscomprofilerHTML::makeOption('1',_UE_A_FROM_USER );
	$emailreplyto[] = moscomprofilerHTML::makeOption('2',_UE_A_FROM_ADMIN );

	$email_checker = array();
	$email_checker[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
	$email_checker[] = moscomprofilerHTML::makeOption( '1', _UE_REG_EMAILCHECKER_VALID_EMAIL_ONLY );
	$email_checker[] = moscomprofilerHTML::makeOption( '2', _UE_REG_EMAILCHECKER_NOT_REGISTERED_AND_VALID_EMAIL );

	$connectionDisplay = array();
	$connectionDisplay[] = moscomprofilerHTML::makeOption( '0', _UE_PUBLIC );
	$connectionDisplay[] = moscomprofilerHTML::makeOption( '1', _UE_PRIVATE );

	$enableSpoofCheck = array();
	$enableSpoofCheck[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
	$enableSpoofCheck[] = moscomprofilerHTML::makeOption( '1', _UE_YES );

	$noVersionCheck = array();
	$noVersionCheck[] = moscomprofilerHTML::makeOption( '0', _UE_AUTOMATIC );
	$noVersionCheck[] = moscomprofilerHTML::makeOption( '1', _UE_MANUAL );

	$userprofileEdits = array();
	$userprofileEdits[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
	$userprofileEdits[] = moscomprofilerHTML::makeOption( '1', _UE_MODERATORS_AND_ABOVE );		//FIXME in CB 2.0: this conflicts with J1.6 ' registered group 
	$userprofileEdits[] = moscomprofilerHTML::makeOption( $_CB_framework->acl->mapGroupNamesToValues( 'Administrator' ), _UE_ADMINS_AND_SUPERADMINS_ONLY );
	$userprofileEdits[] = moscomprofilerHTML::makeOption( $_CB_framework->acl->mapGroupNamesToValues( 'Superadministrator' ), _UE_SUPERADMINS_ONLY );

	$reg_show_icons_explain = array();
	$reg_show_icons_explain[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
	$reg_show_icons_explain[] = moscomprofilerHTML::makeOption( '1', _UE_TOP );
	$reg_show_icons_explain[] = moscomprofilerHTML::makeOption( '2', _UE_BOTTOM );
	$reg_show_icons_explain[] = moscomprofilerHTML::makeOption( '3', _UE_TOP_AND_BOTTOM );

	$icons_display = array();
	$icons_display[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
	$icons_display[] = moscomprofilerHTML::makeOption( '1', _UE_REQUIRED_ONLY );
	$icons_display[] = moscomprofilerHTML::makeOption( '2', _UE_PROFILE_ONLY );
	$icons_display[] = moscomprofilerHTML::makeOption( '3', _UE_REQUIRED_AND_PROFILE_ONLY );
	$icons_display[] = moscomprofilerHTML::makeOption( '4', _UE_INFO_ONLY );
	$icons_display[] = moscomprofilerHTML::makeOption( '5', _UE_REQUIRED_AND_INFO_ONLY );
	$icons_display[] = moscomprofilerHTML::makeOption( '6', _UE_PROFILE_AND_INFO_ONLY );
	$icons_display[] = moscomprofilerHTML::makeOption( '7', _UE_REQUIRED_PROFILE_AND_INFO );

	//TBD NEXT 9 LINES: CB 1.2 RC 2+4 + CB 1.2 specific : remove after !
	if ( ! defined( '_UE_USERNAME_OR_EMAIL' ) ) {
		DEFINE('_UE_USERNAME_OR_EMAIL','Username or email');
	}
	if ( ! defined( '_UE_USERNAME_OR_AUTH' ) ) {
		DEFINE('_UE_USERNAME_OR_AUTH','Username, email or enabled CMS authentication plugins');
	}
	if ( ! defined( '_UE_LOGIN_TYPE' ) ) {
		DEFINE('_UE_LOGIN_TYPE','Login field type');
	}
	if ( ! defined( '_UE_LOGIN_TYPE_DESC' ) ) {
		DEFINE('_UE_LOGIN_TYPE_DESC','Login can be by username + password, username or email + password, or email + password. The CB login module also adapts accordingly.');
	}
	$login_type = array();
	$login_type[] = moscomprofilerHTML::makeOption( '0', _UE_USERNAME );
	$login_type[] = moscomprofilerHTML::makeOption( '1', _UE_USERNAME_OR_EMAIL );
	$login_type[] = moscomprofilerHTML::makeOption( '2', _UE_EMAIL );
	$login_type[] = moscomprofilerHTML::makeOption( '3', _UE_USERNAME_OR_AUTH );

	$translation_debug = array();
	$translation_debug[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
	$translation_debug[] = moscomprofilerHTML::makeOption( '1', CBTxt::T("Display text markers") );
	$translation_debug[] = moscomprofilerHTML::makeOption( '2', CBTxt::T("Display html and text markers") );
	$translation_debug[] = moscomprofilerHTML::makeOption( '3', CBTxt::T("Display markers and list untranslated strings") );
	$translation_debug[] = moscomprofilerHTML::makeOption( '4', CBTxt::T("Display markers and list all strings") );

	$usedivs = array();
	$usedivs[] = moscomprofilerHTML::makeOption( '0', CBTxt::T("Use tables") );
	$usedivs[] = moscomprofilerHTML::makeOption( '1', CBTxt::T("Use divs (table-less output)") );

	// ensure user can't add group higher than themselves
	$gtree = $_CB_framework->acl->get_groups_below_me();

	$gtree2=array();
        $gtree2[] = moscomprofilerHTML::makeOption( -2 , '- ' ._UE_GROUPS_EVERYBODY . ' -' );				// '- Everybody -'
        $gtree2[] = moscomprofilerHTML::makeOption( -1, '- ' . _UE_GROUPS_ALL_REG_USERS . ' -' );			// '- All Registered Users -'
	$gtree2 = array_merge( $gtree2, $_CB_framework->acl->get_group_children_tree( null, 'USERS', false ));

	// Fix initial configuration of gid 0:
	$mygrps				=	array();
	if ( $gtree ) foreach ( $gtree as $treegrp ) {
		$mygrps[]		=	$treegrp->value;
	}

	if ( ( ! isset( $ueConfig['imageApproverGid'] ) ) || ( $ueConfig['imageApproverGid'] == '0' ) || ! in_array( $ueConfig['imageApproverGid'], $mygrps ) ) {
		$image_approval	=	$_CB_framework->acl->mapGroupNamesToValues( 'Administrator' );		// Joomla 1.6 super-admin to fix the default ueConfig for 1.6.
	} else {
		$image_approval	=	$ueConfig['imageApproverGid'];
	}

	$mygtree2				=	array();
	foreach ( $gtree2 as $treegrp ) {
		$mygtree2[]		=	$treegrp->value;
	}

	if ( ( ! isset( $ueConfig['allow_profileviewbyGID'] ) ) || ( $ueConfig['allow_profileviewbyGID'] == '0' ) || ! in_array( $ueConfig['allow_profileviewbyGID'], $mygtree2 ) ) {
		$allow_profileviewbyGID	=	$_CB_framework->acl->mapGroupNamesToValues( 'Administrator' );		// Joomla 1.6 super-admin to fix the default ueConfig for 1.6.
	} else {
		$allow_profileviewbyGID	=	$ueConfig['allow_profileviewbyGID'];
	}

   	$lists['imageApproverGid'] = moscomprofilerHTML::selectList( $gtree, 'cfg_imageApproverGid', '', 'value', 'text', $image_approval, 2, false, false );
	$lists['allow_profileviewbyGID']=moscomprofilerHTML::selectList( $gtree2, 'cfg_allow_profileviewbyGID', '', 'value', 'text', $allow_profileviewbyGID, 2, false, false );
	//$lists['allow_listviewbyGID']=moscomprofilerHTML::selectList( $gtree2, 'cfg_allow_listviewbyGID', 'size="4"', 'value', 'text', $ueConfig['allow_listviewbyGID'], 2 );
   // registered users only
  	$tempdir		=	array();
	$_CB_database->setQuery("SELECT `name`,`folder` FROM `#__comprofiler_plugin` WHERE `type`='templates' AND `published`=1 ORDER BY ordering");
	//echo $_CB_database->getQuery();
	$templates		=	$_CB_database->loadObjectList();
	foreach ( $templates AS $template ) {
		$tempdir[]	=	moscomprofilerHTML::makeOption( $template->folder , $template->name );
	}
	/*
	require($_CB_framework->getCfg('absolute_path').'/components/com_comprofiler/plugin/user/plug_yancintegration/yanc.php');
	$getNewslettersTab= new getNewslettersTab();
	$newslettersList = $getNewslettersTab->getNewslettersList();
	$newslettersRegList = array();
	if ($newslettersList !== false) {
		foreach ($newslettersList AS $nl) {
			$newslettersRegList[] = moscomprofilerHTML::makeOption( $nl->id, $nl->list_name);
		}
	}
	*/
	$cbFielfs						=	new cbFields();
	$badHtmlFilter					=&	$cbFielfs->getInputFilter( array (), array (), 1, 1 );
	$lists['_filteredbydefault']	=	implode( ' ', $badHtmlFilter->tagBlacklist );
	if ( ! isset( $ueConfig['html_filter_allowed_tags'] ) ) {
		$ueConfig['html_filter_allowed_tags']	=	'';
	}

	$lists['allow_email_display'] = moscomprofilerHTML::selectList( $emailhandling, 'cfg_allow_email_display', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allow_email_display'], 2 );

	$lists['allow_email_replyto'] = moscomprofilerHTML::selectList( $emailreplyto, 'cfg_allow_email_replyto', 'class="inputbox" size="1"', 'value', 'text', (isset($ueConfig['allow_email_replyto']) ? $ueConfig['allow_email_replyto'] : '1'), 2 );

	$lists['name_format'] = moscomprofilerHTML::selectList($nameformats, 'cfg_name_format','class="inputbox" size="1"', 'value', 'text', $ueConfig['name_format'], 2 );

	$lists['name_style'] = moscomprofilerHTML::selectList($namestyles, 'cfg_name_style','class="inputbox" size="1"', 'value', 'text', $ueConfig['name_style'], 2 );

	$lists['date_format'] = moscomprofilerHTML::selectList($dateformats, 'cfg_date_format','class="inputbox" size="1"', 'value', 'text', $ueConfig['date_format'], 2 );
	$lists['calendar_type'] = moscomprofilerHTML::selectList($calendartypes, 'cfg_calendar_type','class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['calendar_type'] ) ? $ueConfig['calendar_type'] : '2' ), 2 );

	$lists['usernameedit'] = moscomprofilerHTML::selectList( $yesno, 'cfg_usernameedit', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['usernameedit'], 2 );

	$lists['allow_profilelink'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allow_profilelink', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allow_profilelink'], 2 );

	$lists['allow_email'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allow_email', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allow_email'], 2 );
	$lists['allow_onlinestatus'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allow_onlinestatus', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allow_onlinestatus'], 2 );
	$lists['allow_website'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allow_website', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allow_website'], 2 );
	$lists['icons_display'] = moscomprofilerHTML::selectList( $icons_display, 'cfg_icons_display', 'class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['icons_display'] ) ? $ueConfig['icons_display'] : '7' ), 2 );
	$lists['login_type'] = moscomprofilerHTML::selectList( $login_type, 'cfg_login_type', 'class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['login_type'] ) ? $ueConfig['login_type'] : '0' ), 2 );

	$lists['reg_enable_toc'] = moscomprofilerHTML::selectList( $yesno, 'cfg_reg_enable_toc', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['reg_enable_toc'], 2 );

	$lists['admin_allowcbregistration'] = moscomprofilerHTML::selectList( $admin_allowcbregistration, 'cfg_reg_admin_allowcbregistration', 'class="inputbox" size="1"', 'value', 'text', (isset($ueConfig['reg_admin_allowcbregistration']) ? $ueConfig['reg_admin_allowcbregistration'] : '0' ), 2 );
	$lists['emailpass'] = moscomprofilerHTML::selectList( $yesno, 'cfg_emailpass', 'class="inputbox" size="1"', 'value', 'text', (isset($ueConfig['emailpass']) ? $ueConfig['emailpass'] : '0' ), 2 );

	$lists['admin_approval'] = moscomprofilerHTML::selectList( $yesno, 'cfg_reg_admin_approval', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['reg_admin_approval'], 2 );

	$lists['confirmation'] = moscomprofilerHTML::selectList( $yesno, 'cfg_reg_confirmation', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['reg_confirmation'], 2 );

	$lists['reg_username_checker'] = moscomprofilerHTML::selectList( $yesno, 'cfg_reg_username_checker', 'class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['reg_username_checker'] ) ? $ueConfig['reg_username_checker'] : '0' ), 2 );
	$lists['reg_email_checker'] = moscomprofilerHTML::selectList( $email_checker, 'cfg_reg_email_checker', 'class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['reg_email_checker'] ) ? $ueConfig['reg_email_checker'] : '0' ), 2 );

	$lists['reg_show_login_on_page'] = moscomprofilerHTML::selectList( $yesno, 'cfg_reg_show_login_on_page', 'class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['reg_show_login_on_page'] ) ? $ueConfig['reg_show_login_on_page'] : '0' ), 2 );

	$lists['reg_show_icons_explain'] = moscomprofilerHTML::selectList( $reg_show_icons_explain, 'cfg_reg_show_icons_explain', 'class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['reg_show_icons_explain'] ) ? $ueConfig['reg_show_icons_explain'] : '3' ), 2 );

	$lists['allowAvatar'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowAvatar', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowAvatar'], 2 );

	$lists['allowAvatarUpload'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowAvatarUpload', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowAvatarUpload'], 2 );
	$lists['avatarResizeAlways'] = moscomprofilerHTML::selectList( $yesno, 'cfg_avatarResizeAlways', 'class="inputbox" size="1"', 'value', 'text', isset( $ueConfig['avatarResizeAlways'] ) ? $ueConfig['avatarResizeAlways'] : '1', 2 );

	$lists['allowAvatarGallery'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowAvatarGallery', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowAvatarGallery'], 2 );

	$lists['avatarUploadApproval'] = moscomprofilerHTML::selectList( $yesno, 'cfg_avatarUploadApproval', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['avatarUploadApproval'], 2 );

	$lists['allowUserReports'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowUserReports', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowUserReports'], 2 );
	$lists['allowModeratorsUserEdit'] = moscomprofilerHTML::selectList( $userprofileEdits, 'cfg_allowModeratorsUserEdit', 'class="inputbox" size="1"', 'value', 'text', isset($ueConfig['allowModeratorsUserEdit']) ? $ueConfig['allowModeratorsUserEdit'] : '0', 2 );
	$lists['allowUserBanning'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowUserBanning', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowUserBanning'], 2 );
	$lists['adminrequiredfields'] = moscomprofilerHTML::selectList( $yesno, 'cfg_adminrequiredfields', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['adminrequiredfields'], 2 );
	$lists['moderatorEmail'] = moscomprofilerHTML::selectList( $yesno, 'cfg_moderatorEmail', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['moderatorEmail'], 2 );
	$lists['allowModUserApproval'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowModUserApproval', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowModUserApproval'], 2 );
	$lists['templatedir'] = moscomprofilerHTML::selectList( $tempdir, 'cfg_templatedir', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['templatedir'], 2 );
	$lists['showEmptyTabs'] = moscomprofilerHTML::selectList( $yesno, 'cfg_showEmptyTabs', 'class="inputbox" size="1"', 'value', 'text', isset( $ueConfig['showEmptyTabs'] ) ? $ueConfig['showEmptyTabs'] : 0, 2 );
	$lists['showEmptyFields'] = moscomprofilerHTML::selectList( $yesno, 'cfg_showEmptyFields', 'class="inputbox" size="1"', 'value', 'text', isset( $ueConfig['showEmptyFields'] ) ? $ueConfig['showEmptyFields'] : 0, 2 );
	$lists['nesttabs'] = moscomprofilerHTML::selectList( $yesno, 'cfg_nesttabs', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['nesttabs'], 2 );
	$lists['xhtmlComply'] = moscomprofilerHTML::selectList( $yesno, 'cfg_xhtmlComply', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['xhtmlComply'], 2 );
	$lists['frontend_userparams'] = moscomprofilerHTML::selectList( $yesno, 'cfg_frontend_userparams', 'class="inputbox" size="1"', 'value', 'text', isset( $ueConfig['frontend_userparams'] ) ? $ueConfig['frontend_userparams'] : ( in_array( $_CB_framework->getCfg( "frontend_userparams" ), array( '1', null) ) ? '1' : '0' ), 2 );
	$lists['use_divs'] = moscomprofilerHTML::selectList( $usedivs, 'cfg_use_divs', 'class="inputbox" size="1"', 'value', 'text', isset( $ueConfig['use_divs'] ) ? $ueConfig['use_divs'] : 0, 2 );
	$lists['conversiontype'] = moscomprofilerHTML::selectList( $conversiontype, 'cfg_conversiontype', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['conversiontype'], 2 );
	$lists['allowConnections'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowConnections', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowConnections'], 2 );
	$lists['useMutualConnections'] = moscomprofilerHTML::selectList( $yesno, 'cfg_useMutualConnections', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['useMutualConnections'], 2 );
	$lists['autoAddConnections'] = moscomprofilerHTML::selectList( $yesno, 'cfg_autoAddConnections', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['autoAddConnections'], 2 );
	$lists['conNotifyTypes'] = moscomprofilerHTML::selectList( $conNotifyTypes, 'cfg_conNotifyType', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['conNotifyType'], 2 );
	$lists['connectionDisplay'] = moscomprofilerHTML::selectList( $connectionDisplay, 'cfg_connectionDisplay', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['connectionDisplay'], 2 );
	$lists['connectionPath'] = moscomprofilerHTML::selectList( $yesno, 'cfg_connectionPath', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['connectionPath'], 2 );
	$lists['enableSpoofCheck'] = moscomprofilerHTML::selectList( $enableSpoofCheck, 'cfg_enableSpoofCheck', 'class="inputbox" size="1"', 'value', 'text', isset($ueConfig['enableSpoofCheck']) ? $ueConfig['enableSpoofCheck'] : '1', 2 );
	$lists['noVersionCheck'] = moscomprofilerHTML::selectList( $noVersionCheck, 'cfg_noVersionCheck', 'class="inputbox" size="1"', 'value', 'text', isset($ueConfig['noVersionCheck']) ? $ueConfig['noVersionCheck'] : '0', 2 );
	$lists['translations_debug'] = moscomprofilerHTML::selectList( $translation_debug, 'cfg_translations_debug', 'class="inputbox" size="1"', 'value', 'text', isset($ueConfig['translations_debug']) ? $ueConfig['translations_debug'] : '0', 2 );

	HTML_comprofiler::showConfig( $ueConfig, $lists, $option );
}

function saveConfig ( $option ) {
	global $_CB_framework, $_CB_adminpath, $_POST;

	cbimport( 'cb.adminfilesystem' );
	$adminFS			=&	cbAdminFileSystem::getInstance();

	$configfile			=	$_CB_adminpath."/ue_config.php";

	//Add code to check if config file is writeable.
	if ( $adminFS->isUsingStandardPHP() && ! is_writable($configfile)) {
		@chmod ($configfile, 0766);
		if (!is_writable($configfile)) {
			cbRedirect($_CB_framework->backendUrl( "index.php?option=$option" ), CBTxt::T('FATAL ERROR: Config File Not writeable') );
		}
	}

	// safely evaluate post:

	$newConfig		=	array();
	foreach ( $_POST as $k => $v ) {
		$newVal		=	cbGetParam( $_POST, $k, '', _CB_ALLOWRAW | _CB_NOTRIM );
		//TBD later when moving to DB storage:
		// $newVal	=	stripslashes( $newVal );
		// then check for stripslashes all over the place incl. in configuration display and email of welcome messages
		if ( is_array( $newVal ) ) {
			$newVal	=	implode( '|*|', $newVal );
		}
		if ( strpos( $k, 'cfg_' ) === 0 ) {
			$newK	=	addslashes( substr( $k, 4 ) );
			$newConfig[$newK]	=	$newVal;
		}
	}

	// compose PHP ueconfig.php file:

	$txt = "<?php\n";
	foreach ( $newConfig as $k => $v ) {
			$txt .= "\$ueConfig['" . $k . "']='$v';\n";
	}
	$txt .= "?>";

	// write file:
	$result			=	$adminFS->file_put_contents( $configfile, $txt );
	if ( $result ) {
		if ( _cbAdmin_chmod( $configfile ) ) {
			$msg	=	CBTxt::T('Configuration file saved');
		} else {
			$msg	=	sprintf(CBTxt::T('Failed to change the permissions of the config file %s'), $configfile);
		}
	} else {
		$msg		=	sprintf(CBTxt::T('Failed to create and write config file in %s'), $configfile);
	}

	if ( $result !== false ) {

		// adapt name fields to new name:
		_cbAdaptNameFieldsPublished( $newConfig );

		cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showconfig" ), $msg );
	} else {
		cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option" ), $msg . ': ' . CBTxt::T('ERROR: Configuration file administrator/components/com_comprofiler/ue_config.php could not be written by webserver. Please change file permissions in your web-pannel.') );
	}
}

function _cbAdaptNameFieldsPublished( &$newConfig ) {
	global $_CB_database;

	if ( ! isset( $newConfig['this_is_default_config'] ) ) {
		// checks and adapts only if it's not the default configuration:
		switch ( $newConfig['name_style'] ) {
			case 2:
				$sqlArray	=	array( 'name'	=>	0, 'firstname'	=>	1, 'middlename' => 0,	'lastname' => 1 );
				break;
			case 3:
				$sqlArray	=	array( 'name'	=>	0, 'firstname'	=>	1, 'middlename' => 1,	'lastname' => 1 );
				break;
			case 1:
			default:
				$sqlArray	=	array( 'name'	=>	1, 'firstname'	=>	0, 'middlename' => 0,	'lastname' => 0 );
				break;
		}
		foreach ( $sqlArray as $name => $published ) {
			$sql			=	'UPDATE #__comprofiler_fields SET '
							.	$_CB_database->NameQuote( 'published' )
							.	' = '
							.	(int) $published
							.	' WHERE '
							.	$_CB_database->NameQuote( 'name' )
							.	' = '
							.	$_CB_database->Quote( $name )
							;
			$_CB_database->setQuery( $sql );
			if ( ! $_CB_database->query() ) {
			    echo "<script type=\"text/javascript\"> alert('_cbAdaptNameFieldsPublished: db error: " . addslashes( $_CB_database->getErrorMsg() ) . "'); window.history.go(-1);</script>\n";
			    exit;
			}
		}
	}
}
function requiredField( $cid=null, $flag=1, $option ) {
    global $_CB_framework, $_CB_database;

	if (count( $cid ) < 1) {
   	    $action = $flag ? CBTxt::T('Make Required') : CBTxt::T('Make Non-required');
	    echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
	    exit;
	}

	foreach ($cid AS $cids) {
		$_CB_database->setQuery( "UPDATE #__comprofiler_fields SET required = " . (int) $flag . " WHERE fieldid = " . (int) $cids);
	    	$_CB_database->query();
		//print $_CB_database->getquery();
	}
    cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ) );
}

function publishField( $cid=null, $flag=1, $option ) {
    global $_CB_framework, $_CB_database;

	if (count( $cid ) < 1) {
   	    $action = $flag ? CBTxt::T('Publish') : CBTxt::T('UnPublish');
	    echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action ) ) . "'); window.history.go(-1);</script>\n";
	    exit;
	}

	foreach ($cid AS $cids) {
		$_CB_database->setQuery( "UPDATE #__comprofiler_fields SET published = " . (int) $flag . " WHERE fieldid = " . (int) $cids . " AND sys = 0" );
	    	$_CB_database->query();
		//print $_CB_database->getquery();
	}
    cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ) );
}

function registrationField( $cid=null, $flag=1, $option ) {
    global $_CB_framework, $_CB_database;

	if (count( $cid ) < 1) {
   	    $action = $flag ? CBTxt::T('Add to Registration') : CBTxt::T('Remove from Registration');
	    echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
	    exit;
	}

	foreach ($cid AS $cids) {
		$_CB_database->setQuery( "UPDATE #__comprofiler_fields SET registration = " . (int) $flag . " WHERE fieldid = " . (int) $cids);
	    	$_CB_database->query();
		//print $_CB_database->getquery();
	}
    cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ) );
}

function searchableField( $cid=null, $flag=1, $option ) {
    global $_CB_framework, $_CB_database;

    $flag		=	$flag ? 1 : 0;
	$action		=	$flag ? CBTxt::T('field searchable in users-lists') : CBTxt::T('field not searchable in users-lists');
	if (count( $cid ) < 1) {
	    echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBtxt::T('Select an item to make %s'), $action) ) . "'); window.history.go(-1);</script>\n";
	    exit;
	}

	foreach ($cid AS $cids) {
		$_CB_database->setQuery( "UPDATE #__comprofiler_fields SET searchable = " . (int) $flag . " WHERE fieldid = " . (int) $cids);
	    	$_CB_database->query();
		//print $_CB_database->getquery();
	}
    cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ), "Made " . $action );
}

function listPublishedField( $cid=null, $flag=1, $option ) {
    global $_CB_framework, $_CB_database;

	if (count( $cid ) < 1) {
   	    $action = $flag ? CBTxt::T('Publish') : CBTxt::T('UnPublish');
	    echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
	    exit;
	}

	foreach ($cid AS $cids) {
		$_CB_database->setQuery( "UPDATE #__comprofiler_lists SET published = " . (int) $flag . " WHERE listid = " . (int) $cids);
	    	$_CB_database->query();
		//print $_CB_database->getquery();
	}
    cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showLists" ) );
}
function tabPublishedField( $cid=null, $flag=1, $option ) {
    global $_CB_framework, $_CB_database;

	if (count( $cid ) < 1) {
   	    $action = $flag ? CBTxt::T('Publish') : CBTxt::T('UnPublish');
	    echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
	    exit;
	}

	foreach ($cid AS $cids) {
		$_CB_database->setQuery( "UPDATE #__comprofiler_tabs SET enabled = " . (int) $flag . " WHERE tabid = " . (int) $cids);
	    	$_CB_database->query();
		//print $_CB_database->getquery();
	}
    cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showTab" ) );
}
function listDefaultField( $cid=null, $flag=1, $option ) {
    global $_CB_framework, $_CB_database;

	if (count( $cid ) < 1) {
   	    $action = $flag ? CBTxt::T('Make Default') : CBTxt::T('Reset Default');
	    echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf(CBTxt::T('Select an item to %s'),$action) ) . "'); window.history.go(-1);</script>\n";
	    exit;
	}

    $published = "";
	if($flag==1) {
		$published = ", published = 1";
	}
	foreach ($cid AS $cids) {
		$_CB_database->setQuery( "UPDATE #__comprofiler_lists SET `default` = 0");
	    	$_CB_database->query();
		$_CB_database->setQuery( "UPDATE #__comprofiler_lists SET `default` = " . (int) $flag . " $published WHERE listid = " . (int) $cids);
	    	$_CB_database->query();
		//print $_CB_database->getquery();
	}
    cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showLists" ) );
}

function profileField( $cid=null, $flag=1, $option ) {
    global $_CB_framework, $_CB_database;

	if (count( $cid ) < 1) {
   	    $action = $flag ? CBTxt::T('Add to Profile') : CBTxt::T('Remove from Profile');
	    echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
	    exit;
	}

	foreach ($cid AS $cids) {
		$_CB_database->setQuery( "UPDATE #__comprofiler_fields SET profile = " . (int) $flag . " WHERE fieldid = " . (int) $cids);
	    	$_CB_database->query();
		//print $_CB_database->getquery();
	}
    cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ) );
}

function loadSampleData() {
    global $_CB_framework, $_CB_database;
	$sql				=	"SELECT COUNT(*) FROM #__comprofiler_fields"
						.	"\n WHERE name IN ('website','location','occupation','interests','company','address','city','state','zipcode','country','phone','fax')";
	$_CB_database->setQuery($sql);
    	$fieldCount		=	$_CB_database->loadresult();

	IF($fieldCount < 1) {
		$sqlStatements	=	array();

		$sqlStatements[0]['query']	= "INSERT IGNORE INTO `#__comprofiler_tabs` (`tabid`, `title`, `position`, `ordering`, `sys`, `displaytype`) "
			."\n VALUES (2, '_UE_ADDITIONAL_INFO_HEADER', 'cb_tabmain', 1, 0, 'tab')";
		$sqlStatements[0]['message'] = '<font color="green">' . CBTxt::T('Tab Added Successfully!') . '</font><br />';

		$sqlStatements[1]['query'] = "ALTER TABLE `#__comprofiler` ADD `website` varchar(255) default NULL,"
			  ."\n ADD `location` varchar(255) default NULL,"
			  ."\n ADD `occupation` varchar(255) default NULL,"
			  ."\n ADD `interests` varchar(255) default NULL,"
			  ."\n ADD `company` varchar(255) default NULL,"
			  ."\n ADD `address` varchar(255) default NULL,"
			  ."\n ADD `city` varchar(255) default NULL,"
			  ."\n ADD `state` varchar(255) default NULL,"
			  ."\n ADD `zipcode` varchar(255) default NULL,"
			  ."\n ADD `country` varchar(255) default NULL,"
			  ."\n ADD `phone` varchar(255) default NULL,"
			  ."\n ADD `fax` varchar(255) default NULL";
		$sqlStatements[1]['message'] = '<font color="green">' . CBTxt::T('Schema Changes Added Successfully!') .'</font><br />';

		$sqlStatements[2]['query'] = "INSERT IGNORE INTO `#__comprofiler_fields`  (`fieldid`, `name`, `tablecolumns`, `table`, `title`, `type`, `maxlength`, `size`, `required`, `tabid`, `ordering`, `cols`, `rows`, `value`, `default`, `published`, `registration`, `profile`, `calculated`, `sys`, `pluginid`) "
			."\n VALUES (30, 'website', 'website', '#__comprofiler', '_UE_Website', 'webaddress', 0, 0, 0, 2, 1, 0, 0, NULL, NULL, 1, 0, 1, 0, 0, 1),"
			."\n (31, 'location', 'location', '#__comprofiler', '_UE_Location', 'text', 50, 25, 0, 2, 2, 0, 0, NULL, NULL, 1, 0, 1, 0, 0, 1),"
			."\n (32, 'occupation', 'occupation', '#__comprofiler', '_UE_Occupation', 'text', 0, 0, 0, 2, 3, 0, 0, NULL, NULL, 1, 0, 1, 0, 0, 1),"
			."\n (33, 'interests', 'interests', '#__comprofiler', '_UE_Interests', 'text', 0, 0, 0, 2, 4, 0, 0, NULL, NULL, 1, 0, 1, 0, 0, 1),"
			."\n (34, 'company', 'company', '#__comprofiler', '_UE_Company', 'text', 0, 0, 0, 2, 5, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
			."\n (35, 'city', 'city', '#__comprofiler', '_UE_City', 'text', 0, 0, 0, 2, 6, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
			."\n (36, 'state', 'state', '#__comprofiler', '_UE_State', 'text', 10, 4, 0, 2, 7, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
			."\n (37, 'zipcode', 'zipcode', '#__comprofiler', '_UE_ZipCode', 'text', 0, 0, 0, 2, 8, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
			."\n (38, 'country', 'country', '#__comprofiler', '_UE_Country', 'text', 0, 0, 0, 2, 9, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
			."\n (40, 'address', 'address', '#__comprofiler', '_UE_Address', 'text', 0, 0, 0, 2, 10, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
			."\n (43, 'phone', 'phone', '#__comprofiler', '_UE_PHONE', 'text', 0, 0, 0, 2, 11, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
			."\n (44, 'fax', 'fax', '#__comprofiler', '_UE_FAX', 'text', 0, 0, 0, 2, 12, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1)";
		$sqlStatements[2]['message'] = '<font color="green">' . CBTxt::T('Fields Added Successfully!') . '</font><br />';

		$groups			=	implode( ', ', $_CB_framework->acl->mapGroupNamesToValues( array( 'Public', 'Registered', 'Author', 'Editor', 'Publisher', 'Manager', 'Administrator', 'Superadministrator' ) ) );
		$groupPublic	=	$_CB_framework->acl->mapGroupNamesToValues( 'Public' );
		$sqlStatements[3]['query'] = "INSERT INTO `#__comprofiler_lists` (`listid`, `title`, `description`, `published`, `default`, `usergroupids`, `sortfields`, `col1title`, `col1enabled`, `col1fields`, `col2title`, `col2enabled`, `col1captions`, `col2fields`, `col2captions`, `col3title`, `col3enabled`, `col3fields`, `col3captions`, `col4title`, `col4enabled`, `col4fields`, `col4captions`) "
					."\n VALUES (2, 'Members List', 'my Description', 1, 1, '" . $groups . "', '`username` ASC', 'Image', 1, '" . $groupPublic . "', 'Username', 1, 0, '42', 0, 'Other', 1, '26|*|28|*|27', 1, '', 0, '', 0)";

		$sqlStatements[3]['message'] = '<font color="green">' . CBTxt::T('List Added Successfully!') . '</font><br />';

		foreach ($sqlStatements AS $sql) {
			$_CB_database->setQuery($sql['query']);
			if (!$_CB_database->query()) {
				print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
				return;
			} else {
				print $sql['message'];
			}
			//print $_CB_database->getquery();
		}
	} else {
		print CBTxt::T('Sample Data is already loaded!');
	}
}

function syncUsers() {
    global $_CB_database, $ueConfig, $_PLUGINS;

	// Try extending time, as unziping/ftping took already quite some... :
	@set_time_limit( 240 );

   	$_PLUGINS->loadPluginGroup('user');
	$messages	=	$_PLUGINS->trigger( 'onBeforeSyncUser', true );
	foreach ( $messages as $msg ) {
		if ( $msg ) {
			echo "<p>" . $msg . "</p>";
		}
	}
	// 0a. delete user table for bad rows
	$sql = "DELETE FROM #__users WHERE id = 0";
	$_CB_database->setQuery($sql);
	if (!$_CB_database->query()) {
		print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
		return;
	}
	$affected		=	$_CB_database->getAffectedRows();
	if ($affected) {
		print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s not allowed user id 0 entry.'), $affected) . "</font></p>";
	}

	// 0b. delete comprofiler table for bad rows
	$sql = "DELETE FROM #__comprofiler WHERE id = 0";
	$_CB_database->setQuery($sql);
	if (!$_CB_database->query()) {
		print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
		return;
	}
	$affected		=	$_CB_database->getAffectedRows();
	if ($affected) {
		print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s not allowed user id 0 entry.'), $affected) . "</font></p>";
	}


    // 1. add missing comprofiler entries, guessing naming depending on CB's name style:
	switch ( $ueConfig['name_style'] ) {
		case 2:
			// firstname + lastname:
 			$sql = "INSERT IGNORE INTO #__comprofiler(id,user_id,lastname,firstname) "
 				  ." SELECT id,id, SUBSTRING_INDEX(name,' ',-1), "
 								 ."SUBSTRING( name, 1, length( name ) - length( SUBSTRING_INDEX( name, ' ', -1 ) ) -1 ) "
 				  ." FROM #__users";
		break;
		case 3:
			// firstname + middlename + lastname:
			$sql = "INSERT IGNORE INTO #__comprofiler(id,user_id,middlename,lastname,firstname) "
				 . " SELECT id,id,SUBSTRING( name, INSTR( name, ' ' ) +1,"
				 						  ." length( name ) - INSTR( name, ' ' ) - length( SUBSTRING_INDEX( name, ' ', -1 ) ) -1 ),"
				 		 ." SUBSTRING_INDEX(name,' ',-1),"
				 		 ." IF(INSTR(name,' '),SUBSTRING_INDEX( name, ' ', 1 ),'') "
				 . " FROM #__users";
    		break;
    	default:
 			// name only:
			$sql = "INSERT IGNORE INTO #__comprofiler(id,user_id) SELECT id,id FROM #__users";
   			break;
    }
	$_CB_database->setQuery($sql);
	if (!$_CB_database->query()) {
		print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
		return;
	}
	$affected		=	$_CB_database->getAffectedRows();
	if ($affected) {
		print "<p><font color='orange'>" . sprintf(CBTxt::T('Added %s new entries to Community Builder from users Table.'), $affected) . "</font></p>";
	}

	$sql = "UPDATE #__comprofiler SET `user_id`=`id`";
	$_CB_database->setQuery($sql);
	if (!$_CB_database->query()) {
		print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
		return;
	}
	$affected		=	$_CB_database->getAffectedRows();
	if ($affected) {
		print "<p><font color='orange'>" . sprintf(CBTxt::T('Fixed %s existing entries in Community Builder: fixed wrong user_id.'), $affected) . "</font></p>";
	}

	// 2. remove excessive comprofiler entries (e.g. if admin used mambo/joomla delete user function:
	$sql = "SELECT c.id FROM #__comprofiler c LEFT JOIN #__users u ON u.id = c.id WHERE u.id IS NULL";
	$_CB_database->setQuery($sql);
	$users = $_CB_database->loadResultArray();
	if ($_CB_database->getErrorNum()) {
		print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
		return;
	}
	if (count($users)) {
		print "<p><font color='orange'>" . sprintf(CBTxt::T('Removing %s entries from Community Builder missing in users Table.'), count($users)) . "</font></p>";
		$msg = deleteUsers($users, true);
		print "<p>".$msg."</p>";
	}
	print "<font color=green>" . CBTxt::T('Joomla/Mambo User Table and Joomla/Mambo Community Builder User Table now in sync!') . "</font>";

	$messages	=	$_PLUGINS->trigger( 'onAfterSyncUser', true );
	foreach ( $messages as $msg ) {
		if ( $msg ) {
			echo "<p>" . $msg . "</p>";
		}
	}
}

function checkcbdb( $dbId = 0 ) {
	global $_CB_database, $_CB_framework, $ueConfig, $_PLUGINS;

	// Try extending time, as unziping/ftping took already quite some... :
	@set_time_limit( 240 );

	HTML_comprofiler::secureAboveForm('checkcbdb');

	outputCbTemplate( 2 );
	outputCbJs( 2 );

	global $_CB_Backend_Title;
	$_CB_Backend_Title	=	array( 0 => array( 'cbicon-48-tools', CBTxt::T('CB Tools: Check database: Results') ) );

	$cbSpoofField			=	cbSpoofField();
	$cbSpoofString			=	cbSpoofString( null, 'cbtools' );

	$version				=	$_CB_database->getVersion();
	$version				=	substr( $version, 0, strpos( $version, '-' ) );

	if ( $dbId == 0 ) {

		echo "<div style='text-align:left;'><p>". CBTxt::T('Checking Community Builder Database') .":</p>";

		// 1. check comprofiler_field_values table for bad rows
		$sql = "SELECT fieldvalueid,fieldid FROM #__comprofiler_field_values WHERE fieldid=0";
		$_CB_database->setQuery($sql);
		$bad_rows = $_CB_database->loadObjectList();
		if ( $_CB_database->getErrorNum() ) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
		} elseif (count($bad_rows)!=0) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in Community Builder comprofiler_field_values have bad fieldid values.'), count($bad_rows)) . "</font></p>";
	   		foreach ($bad_rows as $bad_row) {
				if ( $bad_row->fieldvalueid == 0 ) {
					echo "<p><font color=red>" . sprintf(CBTxt::T('ZERO fieldvalueid illegal: fieldvalueid=%s fieldid=0'), $bad_row->fieldvalueid) . "</font></p>";
				} else {
					echo "<p><font color=red>fieldvalueid=" . $bad_row->fieldvalueid . " fieldid=0</font></p>";
				}
			}
			echo '<p><font color=red>' . CBTxt::T('This one can be fixed by <strong>first backing up database</strong>') . ' <a href="' . $_CB_framework->backendUrl( "index.php?option=com_comprofiler&task=fixcbmiscdb&$cbSpoofField=$cbSpoofString" ) . '"> ' . CBTxt::T('then by clicking here') . '</a>.</font></p>';
		} else {
			echo "<p><font color=green>" . CBTxt::T('All Community Builder comprofiler_field_values table fieldid rows all match existing fields.') . "</font></p>";
		}

		// 2.	check if comprofiler_field_values table has entries where corresponding fieldtype value in comprofiler_fields table
		//		does not allow values
		$sql = "SELECT v.fieldvalueid, v.fieldid, f.name, f.type FROM #__comprofiler_field_values as v, #__comprofiler_fields as f WHERE v.fieldid = f.fieldid AND f.type NOT IN ('checkbox','multicheckbox','select','multiselect','radio')";
		$_CB_database->setQuery($sql);
		$bad_rows = $_CB_database->loadObjectList();
		if ( $_CB_database->getErrorNum() ) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
		} elseif (count($bad_rows)!=0) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in Community Builder comprofiler_field_values link back to fields of wrong fieldtype.'), count($bad_rows)) . "</font></p>";
			foreach ($bad_rows as $bad_row) {
				echo "<p><font color=red>fieldvalueid=" . $bad_row->fieldvalueid . " fieldtype=" . $bad_row->type ."</font></p>";
			}
			echo "<p><font color=red>" . CBTxt::T('This one can be fixed in SQL using a tool like phpMyAdmin.') . "</font></p>";
			// not done automatically since some fields might have field values ! echo '<p><font color=red>This one can be fixed by <strong>first backing up database</strong> then <a href="' . $_CB_framework->backendUrl( "index.php?option=com_comprofiler&task=fixcbmiscdb&$cbSpoofField=$cbSpoofString" ) . '">by clicking here</a>.</font></p>';
		} else {
			echo "<p><font color=green>" . CBTxt::T('All Community Builder comprofiler_field_values table rows link to correct fieldtype fields in comprofiler_field table.') . "</font></p>";
		}

		// 5.	check if all cb defined fields have corresponding comprofiler columns
		$sql = "SELECT * FROM #__comprofiler";
		$_CB_database->setQuery($sql, 0, 1);
		$all_comprofiler_fields_and_values = $_CB_database->loadAssoc();

		$all_comprofiler_fields = array();
		if ( $all_comprofiler_fields_and_values === null ) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
		} elseif ( is_array( $all_comprofiler_fields_and_values ) ) {
			while ( false != ( list( $_cbfield ) = each( $all_comprofiler_fields_and_values ) ) ) {
				array_push( $all_comprofiler_fields, $_cbfield );
			}
		}

		$sql							=	"SELECT * FROM #__comprofiler_fields WHERE `name` != 'NA' AND `table` = '#__comprofiler'";
		$_CB_database->setQuery( $sql );
		$field_rows						=	$_CB_database->loadObjectList( null, 'moscomprofilerFields', array( &$_CB_database ) );
		if ( $_CB_database->getErrorNum() ) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
		} else {
			$html_output					=	array();
			$cb11							=	true;
			foreach ( $field_rows as $field_row ) {
				if ( $field_row->tablecolumns !== null ) {
					// CB 1.2 way:
					if ( $field_row->tablecolumns != '' ) {
						$tableColumns			=	explode( ',', $field_row->tablecolumns );
						foreach ( $tableColumns as $col ) {
							if ( ! in_array( $col, $all_comprofiler_fields ) ) {
								$html_output[]	=	"<p><font color=red>" . sprintf(CBTxt::T(' - Field %s - Column %s is missing from comprofiler table.'), $field_row->name, $col) . "</font></p>";
							}
						}
					}
					$cb11					=	false;
				} else {
					// cb 1.1 way
					if ( ! in_array( $field_row->name, $all_comprofiler_fields ) ) {
						$html_output[] = "<p><font color=red>" . sprintf(CBTxt::T(' - Column %s is missing from comprofiler table.'), $field_row->name) . "</font></p>";
					}
				}
			}
			if ( count( $html_output ) > 0 ) {
				echo "<p><font color=red>" . sprintf(CBTxt::T('There are %s column(s) missing in the comprofiler table, which are defined as fields (rows in comprofiler_fields):'), count( $html_output )) . "</font></p>";
				echo implode( '', $html_output );
				echo "<p><font color=red>" . CBTxt::T('This one can be fixed by deleting and recreating the field(s) using components / Community Builder / Field Management.') . '<br />' . CBTxt::T('Please additionally make sure that columns in comprofiler table <strong>are not also duplicated in users table</strong>.') . "</font></p>";
			} elseif ( $cb11 ) {
				echo "<p><font color=red>" . CBTxt::T('All Community Builder fields from comprofiler_fields are present as columns in the comprofiler table, but comprofiler_fields table is not yet upgraded to CB 1.2 table structure. Just going to Community Builder Fields Management will fix this automatically.') . "</font></p>";
			} else {
				echo "<p><font color=green>" . CBTxt::T('All Community Builder fields from comprofiler_fields are present as columns in the comprofiler table.') . "</font></p>";
			}
		}
		// 9. Check if images/comprofiler is writable:
		$folder = 'images/comprofiler/';
		if ( $ueConfig['allowAvatarUpload'] == 1 ) {
			echo "<p>Checking Community Builder folders:</p>";
			if ( ! is_writable( $_CB_framework->getCfg('absolute_path'). '/' . $folder ) ) {
				echo '<font color="red">' . sprintf(CBTxt::T('Avatars and thumbnails folder: %s/%s is NOT writeable by the webserver.'), $_CB_framework->getCfg('absolute_path'), $folder) . ' </font>';
			} else {
				echo '<font color="green">' . CBTxt::T('Avatars and thumbnails folder is Writeable.') . '</font>';
			}
		}

		cbimport( 'cb.dbchecker' );
		$dbChecker				=	new CBdbChecker( $_CB_database );
		$result					=	$dbChecker->checkCBMandatoryDb( false );
		$dbName					=	CBTxt::T('Core CB mandatory basics');
		$messagesAfter			=	array();
		$messagesBefore			=	array();
		HTML_comprofiler::fixcbdbShowResults( $dbChecker, false, false, $result, $messagesBefore, $messagesAfter, $dbName, $dbId );

		$dbChecker				=	new CBdbChecker( $_CB_database );
		$result					=	$dbChecker->checkDatabase( false );

	   	$_PLUGINS->loadPluginGroup('user');
		$messagesAfter			=	$_PLUGINS->trigger( 'onAfterCheckCbDb', true );

		$dbName					=	CBTxt::T('Core CB');
		$messagesBefore			=	array();
		HTML_comprofiler::fixcbdbShowResults( $dbChecker, false, false, $result, $messagesBefore, $messagesAfter, $dbName, $dbId );
		echo '</div>';
		// adapt published fields to global CB config (regarding name type)
		_cbAdaptNameFieldsPublished( $ueConfig );

	} elseif ( $dbId == 1 ) {
		// Check plugins db:
		$dbName					=	CBTxt::T('CB plugin');
		$messagesBefore			=	array();
		$messagesAfter			=	array();

		cbimport( 'cb.installer' );
		$sql					=	'SELECT `id`, `name` FROM `#__comprofiler_plugin` ORDER BY `ordering`';
		$_CB_database->setQuery( $sql );
		$plugins				=	$_CB_database->loadObjectList();
		if ( ! $_CB_database->getErrorNum() ) {
			$cbInstaller		=	new cbInstallerPlugin();
			foreach ( $plugins as $plug ) {
				$result			=	$cbInstaller->checkDatabase( $plug->id, false );
				if ( is_bool( $result ) ) {
					HTML_comprofiler::fixcbdbShowResults( $cbInstaller, false, false, $result, $messagesBefore, $messagesAfter, $dbName . ' "' . $plug->name . '"', $dbId, false );
				} elseif ( is_string( $result ) ) {
					echo '<div style="color:orange;">' . $dbName . ' "' . $plug->name . '"' . ': ' . $result . '</div>';
				} else {
					echo '<div style="color:black;">' . sprintf(CBTxt::T('%s "%s": no database or no database description.'),$dbName ,$plug->name) . '</div>';
				}
			}
		}
		$dbName					=	CBTxt::T('CB plugins');
		$null					=	null;
		HTML_comprofiler::fixcbdbShowResults( $null, false, false, $result, array(), array(), $dbName, $dbId, true );

	} elseif ( $dbId == 2 ) {

		echo "<div style='text-align:left;'><p>" . CBTxt::T('Checking Users Database') . ":</p>";

		// 3.	check if comprofiler table is in sync with users table
		$sql = "SELECT c.id FROM #__comprofiler c LEFT JOIN #__users u ON u.id = c.id WHERE u.id IS NULL";
		$_CB_database->setQuery($sql);
		$bad_rows = $_CB_database->loadObjectList();
		if ( $_CB_database->getErrorNum() ) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
		} elseif (count($bad_rows)!=0) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in Community Builder comprofiler table without corresponding user table rows.'), count($bad_rows)) . "</font></p>";
			$badids	=	array();
			foreach ($bad_rows as $bad_row) {
				$badids[(int) $bad_row->id]	=	$bad_row->id;
			}
			echo "<p><font color=red>" . sprintf(CBTxt::T('Following comprofiler id: %s are missing in user table'), implode( ', ', $badids )) . ( isset( $badids[0] ) ? " " . CBtxt::T('This comprofiler entry with id 0 should be removed, as it\'s not allowed.') : "" ) . "</font></p>";
			echo "<p><font color=red>" . CBTxt::T('This one can be fixed using menu Components-&gt; Community Builder-&gt; tools and then click `Synchronize users`.') . "</font></p>";
		} else {
			echo "<p><font color=green>" . CBTxt::T('All Community Builder comprofiler table rows have links to user table.') . "</font></p>";
		}

		// 4.	check if users table is in sync with comprofiler table
		$sql = "SELECT u.id FROM #__users u LEFT JOIN #__comprofiler c ON c.id = u.id WHERE c.id IS NULL";
		$_CB_database->setQuery($sql);
		$bad_rows = $_CB_database->loadObjectList();
		if ( $_CB_database->getErrorNum() ) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
		} elseif (count($bad_rows)!=0) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in users table without corresponding comprofiler table rows.'), count($bad_rows)) . "</font></p>";
			$badids	=	array();
			foreach ($bad_rows as $bad_row) {
				$badids[(int) $bad_row->id]	=	$bad_row->id;
			}
			echo "<p><font color=red>" . sprintf(CBTxt::T('users id: %s are missing in comprofiler table'), implode( ', ', $badids )) . "</font></p>";
			echo "<p><font color=red>" . CBTxt::T('This one can be fixed using menu Components-&gt; Community Builder-&gt; tools and then click `Synchronize users`.') . "</font></p>";
		} else {
			echo "<p><font color=green>" . CBTxt::T('All users table rows have links to comprofiler table.') . "</font></p>";
		}

		// 6.	check if users table has id=0 in it
		$sql = "SELECT u.id FROM #__users u WHERE u.id = 0";
		$_CB_database->setQuery($sql);
		$bad_rows = $_CB_database->loadObjectList();
		if ( $_CB_database->getErrorNum() ) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
		} elseif (count($bad_rows)!=0) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in users table with id=0.'), count($bad_rows)) . "</font></p>";
			foreach ($bad_rows as $bad_row) {
				echo "<p><font color=red>" . sprintf(CBTxt::T('users id=%s is not allowed.'), $bad_row->id) . "</font></p>";
			}
			echo "<p><font color=red>" . CBTxt::T('This one can be fixed using menu Components-&gt; Community Builder-&gt; tools and then click `Synchronize users`.') . "</font></p>";
			// echo "<p><font color=red>" . CBTxt::T('This one can be fixed in SQL using a tool like phpMyAdmin.') . " <strong><u>" . CBTxt::T('You also need to check in SQL if id is autoincremented.') . "<u><strong></font></p>";
		} else {
			echo "<p><font color=green>" . CBTxt::T('users table has no zero id row.') . "</font></p>";
		}
		// 7.	check if comprofiler table has id=0 in it
		$sql = "SELECT c.id FROM #__comprofiler c WHERE c.id = 0";
		$_CB_database->setQuery($sql);
		$bad_rows = $_CB_database->loadObjectList();
		if ( $_CB_database->getErrorNum() ) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
		} elseif (count($bad_rows)!=0) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in comprofiler table with id=0.'), count($bad_rows)) . "</font></p>";
			foreach ($bad_rows as $bad_row) {
				echo "<p><font color=red>" . sprintf(CBTxt::T('comprofiler id=%s is not allowed.'), $bad_row->id) . "</font></p>";
			}
			echo "<p><font color=red>" . CBTxt::T('This one can be fixed using menu Components / Community Builder / Tools and then click "Synchronize users".') . "</font></p>";
		} else {
			echo "<p><font color=green>" . CBTxt::T('comprofiler table has no zero id row.') . "</font></p>";
		}
		// 8.	check if comprofiler table has user_id != id in it
		$sql = "SELECT c.id, c.user_id FROM #__comprofiler c WHERE c.id <> c.user_id";
		$_CB_database->setQuery($sql);
		$bad_rows = $_CB_database->loadObjectList();
		if ( $_CB_database->getErrorNum() ) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
		} elseif (count($bad_rows)!=0) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in comprofiler table with user_id <> id.'), count($bad_rows)) . "</font></p>";
			foreach ($bad_rows as $bad_row) {
				echo "<p><font color=red>" . sprintf(CBTxt::T('comprofiler id=%s is different from user_id=%s.'), $bad_row->id, $bad_row->user_id) . "</font></p>";
			}
			echo "<p><font color=red>" . CBTxt::T('This one can be fixed using menu Components-&gt; Community Builder-&gt; tools and then click `Synchronize users`.') . "</font></p>";
		} else {
			echo "<p><font color=green>" . CBTxt::T('All rows in comprofiler table have user_id columns identical to id columns.') . "</font></p>";
		}

		// 10.	check if #__core_acl_aro table is in sync with users table	: A: user -> aro
		if ( ! cbStartOfStringMatch( $version, '3.23' ) ) {
			if ( checkJversion() == 2 ) {
				$sql = "SELECT u.id FROM #__users u LEFT JOIN #__user_usergroup_map a ON a.user_id = CAST( u.id AS CHAR ) WHERE a.user_id IS NULL";
			} else {
				$sql = "SELECT u.id FROM #__users u LEFT JOIN #__core_acl_aro a ON a.section_value = 'users' AND a.value = CAST( u.id AS CHAR ) WHERE a.value IS NULL";
			}
		} else {
			if ( checkJversion() == 2 ) {
				$sql = "SELECT u.id FROM #__users u LEFT JOIN #__user_usergroup_map a ON a.user_id = u.id WHERE a.user_id IS NULL";
			} else {
				$sql = "SELECT u.id FROM #__users u LEFT JOIN #__core_acl_aro a ON a.section_value = 'users' AND a.value = u.id WHERE a.value IS NULL";
			}
		}
		// SELECT u.id FROM jos_users u LEFT JOIN jos_core_acl_aro a ON a.section_value = 'users' AND a.value = CAST( u.id AS CHAR ) WHERE a.value IS NULL
		// INSERT INTO jos_core_acl_aro (section_value,value,order_value,name,hidden) SELECT 'users' AS section_value, u.id AS value, 0 AS order_value, u.name as name, 0 AS hidden FROM jos_users u LEFT JOIN jos_core_acl_aro a ON a.section_value = 'users' AND a.value = CAST( u.id AS CHAR ) WHERE a.value IS NULL;
		$_CB_database->setQuery($sql);
		$bad_rows = $_CB_database->loadObjectList();
		if ( $_CB_database->getErrorNum() ) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
		} elseif ( count( $bad_rows ) != 0 ) {
			echo "<p><font color=red>";
			if ( checkJversion() == 2 ) {
				echo sprintf(CBTxt::T('Warning: %s entries in the users table without corresponding user_usergroup_map table rows.'), count($bad_rows));
			} else {
				echo sprintf(CBTxt::T('Warning: %s entries in the users table without corresponding core_acl_aro table rows.'), count($bad_rows));
			}
			echo "</font></p>";
			$badids	=	array();
			foreach ($bad_rows as $bad_row) {
				$badids[(int) $bad_row->id]	=	$bad_row->id;
			}
			echo "<p><font color=red>";
			if ( checkJversion() == 2 ) {
				echo sprintf(CBTxt::T('user id: %s are missing in user_usergroup_map table'), implode( ', ', $badids ));
			} else {
				echo sprintf(CBTxt::T('user id: %s are missing in core_acl_aro table'), implode( ', ', $badids ));
			}
			echo ( isset( $badids[0] ) ? " " . CBTxt::T('This user entry with id 0 should be removed, as it\'s not allowed.') : "" ) . "</font></p>";
			echo '<p><font color=red>' . CBTxt::T('This one can be fixed by <strong>first backing up database</strong>') . ' <a href="' . $_CB_framework->backendUrl( "index.php?option=com_comprofiler&task=fixacldb&$cbSpoofField=$cbSpoofString" ) . '">' . CBTxt::T('then by clicking here') . '</a>.</font></p>';
		} else {
			echo "<p><font color=green>";
			if ( checkJversion() == 2 ) {
				echo CBTxt::T('All users table rows have ACL entries in user_usergroup_map table.');
			} else {
				echo CBTxt::T('All users table rows have ACL entries in core_acl_aro table.');
			}
			echo "</font></p>";
		}

		// 11.	check if #__core_acl_aro table is in sync with users table	: B: aro -> user
		if ( checkJversion() == 2 ) {
			$sql = "SELECT a.user_id AS id FROM #__user_usergroup_map a LEFT JOIN #__users u ON u.id = a.user_id WHERE u.id IS NULL";
		} elseif ( checkJversion() == 1 ) {
			$sql = "SELECT a.value AS id, a.id AS aro_id FROM #__core_acl_aro a LEFT JOIN #__users u ON u.id = a.value WHERE a.section_value = 'users' AND u.id IS NULL";
		} else {
			$sql = "SELECT a.value AS id, a.aro_id FROM #__core_acl_aro a LEFT JOIN #__users u ON u.id = a.value WHERE a.section_value = 'users' AND u.id IS NULL";
			// SELECT a.value AS id, a.aro_id FROM jos_core_acl_aro a LEFT JOIN jos_users u ON u.id = a.value WHERE a.section_value = 'users' AND u.id IS NULL
			// DELETE a FROM jos_core_acl_aro AS a LEFT JOIN jos_users AS u ON u.id = a.value WHERE a.section_value = 'users' AND u.id IS NULL
		}
		$_CB_database->setQuery($sql);
		$bad_rows = $_CB_database->loadObjectList();
		if ( $_CB_database->getErrorNum() ) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
		} elseif (count($bad_rows)!=0) {
			echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in the core_acl_aro table without corresponding users table rows.'), count($bad_rows)) . "</font></p>";
			$badids	=	array();
			foreach ($bad_rows as $bad_row) {
				$badids[(int) $bad_row->id]		=	"user id=" . $bad_row->id . " (aro_id=" . $bad_row->aro_id . ")";
			}
			echo "<p><font color=red>" . CBTxt::P('Following entries of [tablename1] table are missing in [tablename2] table: [badids].', array( '[tablename1]' => ( checkJversion() == 2 ? 'user_usergroup_map' : 'core_acl_aro' ), '[tablename2]' => 'users', '[badids]' => implode( ', ', $badids ))) . ( isset( $badids[0] ) ? "<br /> " . CBTxt::T('This core_acl_aro entry with (user) value 0 should be removed, as it\'s not allowed.') : "" ) . ( ( $bad_row->aro_id == 0 ) ? " " . CBtxt::T('This core_acl_aro entry with aro_id 0 should be removed, as it\'s not allowed.') : "" ) . "</font></p>";
			echo '<p><font color=red>' . CBTxt::T('This one can be fixed by <strong>first backing up database</strong>') . ' <a href="' . $_CB_framework->backendUrl( "index.php?option=com_comprofiler&task=fixacldb&$cbSpoofField=$cbSpoofString" ) . '">' . CBTxt::T('then by clicking here') . '</a>.</font></p>';
		} else {
			echo "<p><font color=green>" . CBTxt::P('All [tablename1] table rows have corresponding entries in [tablename2] table.', array( '[tablename1]' => ( checkJversion() == 2 ? 'ACL user_usergroup_map' : 'ACL core_acl_aro' ), '[tablename2]' => 'users') ) . "</font></p>";
		}

		// 12.	check if #__core_acl_groups_aro_map table is in sync with #__core_acl_aro table	A: aro -> groups
		if ( checkJversion() <= 1 ) {
			if ( checkJversion() == 1 ) {
				$sql = "SELECT a.value AS id, a.id AS aro_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.id WHERE g.aro_id IS NULL";
			} else {
				$sql = "SELECT a.value AS id, a.aro_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL";
				// SELECT a.value AS id, a.aro_id FROM jos_core_acl_aro a LEFT JOIN jos_core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL
				// INSERT INTO jos_core_acl_groups_aro_map (aro_id,section_value,group_id) SELECT a.aro_id, '', 18 AS group_id FROM jos_core_acl_aro a LEFT JOIN jos_core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL
			}
			$_CB_database->setQuery($sql);
			$bad_rows = $_CB_database->loadObjectList();
			if ( $_CB_database->getErrorNum() ) {
				echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
			} elseif (count($bad_rows)!=0) {
				echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in the core_acl_aro table without corresponding core_acl_groups_aro_map table rows.'), count($bad_rows)) . "</font></p>";
				$badids	=	array();
				foreach ($bad_rows as $bad_row) {
					$badids[(int) $bad_row->id]		=	"user id=" . $bad_row->id . " (aro_id=" . $bad_row->aro_id . ")";
				}
				echo "<p><font color=red>" . sprintf(CBTxt::T('Following entries of core_acl_aro table are missing in core_acl_groups_aro_map table: %s.'), implode( ', ', $badids )) . ( isset( $badids[0] ) ? "<br /> " . CBTxt::T('This core_acl_aro entry with (user) value 0 should be removed, as it\'s not allowed.') : "" ) . ( ( $bad_row->aro_id == 0 ) ? " " . CBtxt::T('This core_acl_aro entry with aro_id 0 should be removed, as it\'s not allowed.') : "" ) . "</font></p>";
				echo '<p><font color=red>' . CBTxt::T('This one can be fixed by <strong>first backing up database</strong>') . ' <a href="' . $_CB_framework->backendUrl( "index.php?option=com_comprofiler&task=fixacldb&$cbSpoofField=$cbSpoofString" ) . '">' . CBTxt::T('then by clicking here') . '</a>.</font></p>';
			} else {
				echo "<p><font color=green>" . CBTxt::T('All core_acl_aro table rows have ACL entries in core_acl_groups_aro_map table.') . "</font></p>";
			}
		}

		// 13.	check if #__core_acl_groups_aro_map table is in sync with #__core_acl_aro table	B: groups -> aro
		if ( checkJversion() <= 1 ) {
			if ( checkJversion() == 1 ) {
				$sql = "SELECT g.aro_id AS id FROM #__core_acl_groups_aro_map g LEFT JOIN #__core_acl_aro a ON a.id = g.aro_id WHERE a.id IS NULL";
			} else {
				$sql = "SELECT g.aro_id AS id FROM #__core_acl_groups_aro_map g LEFT JOIN #__core_acl_aro a ON a.aro_id = g.aro_id WHERE a.aro_id IS NULL";
				// SELECT g.aro_id AS id FROM jos_core_acl_groups_aro_map g LEFT JOIN jos_core_acl_aro a ON a.aro_id = g.aro_id WHERE a.aro_id IS NULL
				// DELETE g FROM jos_core_acl_groups_aro_map g LEFT JOIN jos_core_acl_aro a ON a.aro_id = g.aro_id WHERE a.aro_id IS NULL
			}
			$_CB_database->setQuery($sql);
			$bad_rows = $_CB_database->loadObjectList();
			if ( $_CB_database->getErrorNum() ) {
				echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) .  "</font></p>";
			} elseif (count($bad_rows)!=0) {
				echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in the core_acl_groups_aro_map without corresponding core_acl_aro table table rows.'), count($bad_rows)) . "</font></p>";
				$badids	=	array();
				foreach ($bad_rows as $bad_row) {
					$badids[(int) $bad_row->id]		=	$bad_row->id;
				}
				echo "<p><font color=red>" . sprintf(CBTxt::T('aro_id = %s are missing in core_acl_aro table table.'),implode( ', ', $badids )) . ( isset( $badids[0] ) ? " " . CBTxt::T('This entry with aro_id 0 should be removed, as it\'s not allowed.') : "" ) . "</font></p>";
				echo '<p><font color=red>' . CBTxt::T('This one can be fixed by <strong>first backing up database</strong>') . ' <a href="' . $_CB_framework->backendUrl( "index.php?option=com_comprofiler&task=fixacldb&$cbSpoofField=$cbSpoofString" ) . '">' . CBTxt::T('by clicking here') . '</a>.</font></p>';
			} else {
				echo "<p><font color=green>" . CBTxt::T('All core_acl_aro table rows have ACL entries in core_acl_groups_aro_map table.') . "</font></p>";
			}
		}

		$dbName					=	CBTxt::T('Users');
		echo '</div>';

	} elseif ( $dbId == 3 ) {
		// adapt published fields to global CB config (regarding name type)
		_cbAdaptNameFieldsPublished( $ueConfig );

		// Check fields db:
		cbimport( 'cb.dbchecker' );
		$dbChecker				=	new CBdbChecker( $_CB_database );
		$result					=	$dbChecker->checkAllCBfieldsDb( false );
		$dbName					=	CBTxt::T('CB fields data storage');
		$messagesBefore			=	array();

		$_PLUGINS->loadPluginGroup('user');
		$messagesAfter			=	$_PLUGINS->trigger( 'onAfterCheckCbFieldsDb', true );

		HTML_comprofiler::fixcbdbShowResults( $dbChecker, false, false, $result, $messagesBefore, $messagesAfter, $dbName, $dbId );
		echo '</div>';
	}

	global $_CB_Backend_Title;
	$_CB_Backend_Title			=	array( 0 => array( 'cbicon-48-tools', sprintf(CBTxt::T("CB Tools: Check %s database: Results"),$dbName) ) );
}

function fixacldb() {
	global $_CB_database;
	// Try extending time, as unziping/ftping took already quite some... :
	@set_time_limit( 240 );
	$version								=	$_CB_database->getVersion();
	$version								=	substr( $version, 0, strpos( $version, '-' ) );

	if ( checkJversion() <= 1 ) {
		// 1. put #__core_acl_aro table in sync with users table	: A: user -> aro
		if ( ! cbStartOfStringMatch( $version, '3.23' ) ) {
			$sql = "INSERT INTO #__core_acl_aro (section_value,value,order_value,name,hidden) SELECT 'users' AS section_value, u.id AS value, 0 AS order_value, u.name as name, 0 AS hidden FROM #__users u LEFT JOIN #__core_acl_aro a ON a.section_value = 'users' AND a.value = CAST( u.id AS CHAR ) WHERE a.value IS NULL";
		} else {
			$sql = "INSERT INTO #__core_acl_aro (section_value,value,order_value,name,hidden) SELECT 'users' AS section_value, u.id AS value, 0 AS order_value, u.name as name, 0 AS hidden FROM #__users u LEFT JOIN #__core_acl_aro a ON a.section_value = 'users' AND a.value = u.id WHERE a.value IS NULL";
		}

		$_CB_database->setQuery($sql);
		if (!$_CB_database->query()) {
			print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
			return;
		}
		$affected		=	$_CB_database->getAffectedRows();
		if ($affected) {
			print "<p><font color='orange'>" . sprintf(CBTxt::T('Added %s new entries to core_acl_aro table from users Table.'), $affected) . "</font></p>";
		}

		// 2. delete #__core_acl_aro table entries which are not in users table	: B: aro -> user
		if ( ! cbStartOfStringMatch( $version, '3.23' ) ) {
			if ( checkJversion() == 2 ) {
				$sql = "DELETE a FROM #__user_usergroup_map a LEFT JOIN #__users u ON u.id = a.user_id WHERE u.id IS NULL";
			} elseif ( checkJversion() == 1 ) {
				$sql = "DELETE a FROM #__core_acl_aro a LEFT JOIN #__users u ON u.id = a.value WHERE a.section_value = 'users' AND u.id IS NULL";
			} else {
				$sql = "DELETE a FROM #__core_acl_aro a LEFT JOIN #__users u ON u.id = a.value WHERE a.section_value = 'users' AND u.id IS NULL";
			}
			$_CB_database->setQuery($sql);
			if (!$_CB_database->query()) {
				print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
				return;
			}
			$affected		=	$_CB_database->getAffectedRows();
			if ($affected) {
				print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s core_acl_aro entries which didn\'t correspond to users table.'), $affected) ."</font></p>";
			}
		}
	}

	// 3. add missing #__core_acl_groups_aro_map table entries to put in sync with #__core_acl_aro table	A: aro -> groups
	if ( checkJversion() == 2 ) {
		$sql = "INSERT INTO #__user_usergroup_map (user_id,group_id) SELECT u.id AS user_id, 2 AS group_id FROM #__users u LEFT JOIN #__user_usergroup_map g ON g.user_id = u.id WHERE g.user_id IS NULL";
	} elseif ( checkJversion() == 1 ) {
		// $sql = "SELECT a.value AS id, a.id AS aro_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.id WHERE g.aro_id IS NULL";
		$sql = "INSERT INTO #__core_acl_groups_aro_map (aro_id,section_value,group_id) SELECT a.id AS aro_id, '', 18 AS group_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.id WHERE g.aro_id IS NULL";
	} else {
		// $sql = "SELECT a.value AS id, a.aro_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL";
		$sql = "INSERT INTO #__core_acl_groups_aro_map (aro_id,section_value,group_id) SELECT a.aro_id, '', 18 AS group_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL";
	}
	$_CB_database->setQuery($sql);
	if (!$_CB_database->query()) {
		print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
		return;
	}
	$affected		=	$_CB_database->getAffectedRows();
	if ($affected) {
		print "<p><font color='orange'>" . sprintf(CBTxt::T('Added %s new entries to core_acl_groups_aro_map table from core_acl_aro Table.'),$affected) . "</font></p>";
	}

	if ( checkJversion() <= 1 ) {
		// 4. delete #__core_acl_groups_aro_map table entries which are not in sync with #__core_acl_aro table	B: groups -> aro
		if ( ! cbStartOfStringMatch( $version, '3.23' ) ) {
			if ( checkJversion() == 1 ) {
				$sql = "DELETE g FROM #__core_acl_groups_aro_map g LEFT JOIN #__core_acl_aro a ON a.id = g.aro_id WHERE a.id IS NULL";
			} else {
				$sql = "DELETE g FROM #__core_acl_groups_aro_map g LEFT JOIN #__core_acl_aro a ON a.aro_id = g.aro_id WHERE a.aro_id IS NULL";
			}
			$_CB_database->setQuery($sql);
			if (!$_CB_database->query()) {
				print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
				return;
			}
			$affected		=	$_CB_database->getAffectedRows();
			if ($affected) {
				print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s core_acl_groups_aro_map entries which didn\'t correspond to core_acl_aro table.'), $affected) . "</font></p>";
			}
		}
	}

	print "<font color=green>" . CBTxt::T('Joomla/Mambo User Table and Joomla/Mambo ACL Table should now be in sync!') . "</font>";

}

function fixcbdb( $dryRun, $dbId = 0 ) {
	global $_CB_database, $ueConfig, $_PLUGINS;

	// Try extending time, as unziping/ftping took already quite some... :
	@set_time_limit( 240 );

	$dryRun						=	( $dryRun == 1 );

	if ( $dbId == 0 ) {
		$dbName					=	CBTxt::T('Core CB');

		// Fix mandatory basics of core CB:
		cbimport( 'cb.dbchecker' );
		$dbChecker				=	new CBdbChecker( $_CB_database );
		$result					=	$dbChecker->checkCBMandatoryDb( true, $dryRun );
		$dbName					=	CBTxt::T('Core CB mandatory basics');
		$messagesAfter			=	array();
		$messagesBefore			=	array();

		ob_start();
		HTML_comprofiler::fixcbdbShowResults( $dbChecker, true, $dryRun, $result, $messagesBefore, $messagesAfter, $dbName, $dbId );
		$html					=	ob_get_contents();
		ob_end_clean();


		// Fix core CB:

	   	$_PLUGINS->loadPluginGroup('user');
		$messagesBefore			=	$_PLUGINS->trigger( 'onBeforeFixDb', array( $dryRun ) );
		$messagesBefore[]		=	$html;
		$dbName					=	CBTxt::T('Core CB');
		$dbChecker				=	new CBdbChecker( $_CB_database );
		$result					=	$dbChecker->checkDatabase( true, $dryRun );

		$messagesAfter			=	$_PLUGINS->trigger( 'onAfterFixDb', array( $dryRun ) );

		// adapt published fields to global CB config (regarding name type)
		_cbAdaptNameFieldsPublished( $ueConfig );

	} elseif ( $dbId == 1 ) {
		// Fix plugin $dbId:
		$dbName					=	CBTxt::T('CB plugin');
		$messagesBefore			=	array();
		$messagesAfter			=	array();

		cbimport( 'cb.installer' );
		$sql					=	'SELECT `id`, `name` FROM `#__comprofiler_plugin` ORDER BY `ordering`';
		$_CB_database->setQuery( $sql );
		$plugins				=	$_CB_database->loadObjectList();
		if ( ! $_CB_database->getErrorNum() ) {
			$cbInstaller		=	new cbInstallerPlugin();
			foreach ( $plugins as $plug ) {
				$result			=	$cbInstaller->checkDatabase( $plug->id, true, $dryRun );
				if ( is_bool( $result ) ) {
					HTML_comprofiler::fixcbdbShowResults( $cbInstaller, true, $dryRun, $result, $messagesBefore, $messagesAfter, $dbName . ' "' . $plug->name . '"', $dbId, false );
				} elseif ( is_string( $result ) ) {
					echo '<div style="color:orange;">' . $dbName . ' "' . $plug->name . '"' . ': ' . $result . '</div>';
				} else {
					echo '<div style="color:black;">' . sprintf(CBTxt::T('%s "%s": no database or no database description.'),$dbName ,$plug->name) . '</div>';
				}
			}
		}
		$dbName					=	CBTxt::T('CB plugins');

	} elseif ( $dbId == 3 ) {
		// adapt published fields to global CB config (regarding name type)
		_cbAdaptNameFieldsPublished( $ueConfig );

	   	$_PLUGINS->loadPluginGroup('user');
		$messagesBefore			=	$_PLUGINS->trigger( 'onBeforeFixFieldsDb', array( $dryRun ) );

		// Check fields db:
		cbimport( 'cb.dbchecker' );
		$dbChecker				=	new CBdbChecker( $_CB_database );
		$result					=	$dbChecker->checkAllCBfieldsDb( true, $dryRun );
		$dbName					=	CBTxt::T('CB fields data storage');
		$messagesAfter			=	array();
	}
	HTML_comprofiler::secureAboveForm('fixcbdb');

	outputCbTemplate( 2 );
	outputCbJs( 2 );

	global $_CB_Backend_Title;
	$_CB_Backend_Title			=	array( 0 => array( 'cbicon-48-tools', sprintf(CBTxt::T("CB Tools: Fix %s database: "),$dbName) . ( $dryRun ? CBTxt::T('Dry-run:') : CBTxt::T('Fixed:') ) . " " .CBTXT::T("Results") ) );

	HTML_comprofiler::fixcbdbShowResults( $dbChecker, true, $dryRun, $result, $messagesBefore, $messagesAfter, $dbName, $dbId );
}

function fixcbmiscdb() {
	global $_CB_database;
	// Try extending time, as unziping/ftping took already quite some... :
	@set_time_limit( 240 );

	// 1. delete comprofiler_field_values table for bad rows
	$sql = "DELETE FROM #__comprofiler_field_values WHERE fieldid=0";
	$_CB_database->setQuery($sql);
	if (!$_CB_database->query()) {
		print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
		return;
	}
	$affected		=	$_CB_database->getAffectedRows();
	if ($affected) {
		print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s comprofiler_field_values entries which didn\'t match any field.'), $affected) . "</font></p>";
	}

	// 2. delete comprofiler_field_values table has entries where corresponding fieldtype value in comprofiler_fields table
	//		does not allow values
/* not done ! as some new fields might not be listed in here ! :
	$sql = "DELETE v FROM #__comprofiler_field_values as v, #__comprofiler_fields as f WHERE v.fieldid = f.fieldid AND f.type NOT IN ('checkbox','multicheckbox','select','multiselect','radio')";
	$_CB_database->setQuery($sql);
	if (!$_CB_database->query()) {
		print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
		return;
	}
	$affected		=	$_CB_database->getAffectedRows();
	if ($affected) {
		print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s comprofiler_field_values entries which didn\'t match any field.'), $affected) . "</font></p>";
	}
*/
	// 3. add missing #__core_acl_groups_aro_map table entries to put in sync with #__core_acl_aro table	A: aro -> groups
	if ( checkJversion() == 1 ) {
		// $sql = "SELECT a.value AS id, a.id AS aro_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.id WHERE g.aro_id IS NULL";
		$sql = "INSERT INTO #__core_acl_groups_aro_map (aro_id,section_value,group_id) SELECT a.id AS aro_id, '', 18 AS group_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.id WHERE g.aro_id IS NULL";
	} else {
		// $sql = "SELECT a.value AS id, a.aro_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL";
		$sql = "INSERT INTO #__core_acl_groups_aro_map (aro_id,section_value,group_id) SELECT a.aro_id, '', 18 AS group_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL";
	}
	$_CB_database->setQuery($sql);
	if (!$_CB_database->query()) {
		print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
		return;
	}
	$affected		=	$_CB_database->getAffectedRows();
	if ($affected) {
		print "<p><font color='orange'>" . sprintf(CBTxt::T('Added %s new entries to core_acl_groups_aro_map table from core_acl_aro Table.'),$affected) . "</font></p>";
	}

	// 4. delete #__core_acl_groups_aro_map table entries which are not in sync with #__core_acl_aro table	B: groups -> aro
	if ( checkJversion() == 1 ) {
		$sql = "DELETE g FROM #__core_acl_groups_aro_map g LEFT JOIN #__core_acl_aro a ON a.id = g.aro_id WHERE a.id IS NULL";
	} else {
		$sql = "DELETE g FROM #__core_acl_groups_aro_map g LEFT JOIN #__core_acl_aro a ON a.aro_id = g.aro_id WHERE a.aro_id IS NULL";
	}
	$_CB_database->setQuery($sql);
	if (!$_CB_database->query()) {
		print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
		return;
	}
	$affected		=	$_CB_database->getAffectedRows();
	if ($affected) {
		print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s core_acl_groups_aro_map entries which didn\'t correspond to core_acl_aro table.'), $affected) . "</font></p>";
	}

	print "<font color=green>" . CBTxt::T('Joomla/Mambo User Table and Joomla/Mambo ACL Table should now be in sync!') . "</font>";

}


function loadTools() {
	HTML_comprofiler::showTools();
}

/**
* Compacts the ordering sequence of the selected records
* @param array of table key ids which need to get saved ($row[]->ordering contains old ordering and $_POST['order'] contains new ordering)
* @param object derived from comprofilerDBTable of corresponding class
* @param string Additional "WHERE" query to limit ordering to a particular subset of records
*/
function saveOrder( $cid, &$row, $conditionStatement ) {
	global $_CB_database,$_POST;

	$total		= count( $cid );
	$order 		= cbGetParam( $_POST, 'order', array(0) );
	$conditions = array();
	$cidsChanged	= array();

    // update ordering values
	for( $i=0; $i < $total; $i++ ) {
		$row->load( (int) $cid[$i] );
		if ($row->ordering != $order[$i]) {
			$row->ordering = $order[$i];
	        if (!$row->store( (int) $cid[$i])) {
	            echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf(CBTxt::T('saveOrder:%s'), $_CB_database->getErrorMsg())) . "'); window.history.go(-1); </script>\n";
	            exit();
	        } // if
	        $cidsChanged[] = $cid[$i];
	        // remember to updateOrder this group if multiple groups (conditionStatement gives the group)
	        if ($conditionStatement) {
	        	$condition=null;				// to make php checker happy: the next line defines $condition
	        	eval($conditionStatement);
	        	$found = false;
	        	foreach ( $conditions as $cond )
		        	if ($cond[1]==$condition) {
		        		$found = true;
		        		break;
		        	} // if
	        	if (!$found) $conditions[] = array($cid[$i], $condition);
	        }
		} // if
	} // for

	if ($conditionStatement) {
		// execute updateOrder for each group
		foreach ( $conditions as $cond ) {
			$row->load( (int) $cond[0] );
			$row->updateOrder( $cond[1], $cidsChanged );
		} // foreach
	} else if ($cidsChanged) {
		$row->load( (int) $cidsChanged[0] );
		$row->updateOrder( null, $cidsChanged );
	}
	return CBTxt::T('New ordering saved');
} // saveOrder

function saveFieldOrder( &$cid ) {
	global $_CB_framework, $_CB_database;
	$row = new moscomprofilerFields( $_CB_database );
	$msg = saveOrder( $cid, $row, "\$condition = \"tabid=\$row->tabid\";" );
	cbRedirect( $_CB_framework->backendUrl( 'index.php?option=com_comprofiler&task=showField' ), $msg );
} // saveFieldOrder

function saveTabOrder( &$cid ) {
	global $_CB_framework, $_CB_database;
	$row 		= new moscomprofilerTabs( $_CB_database );
	$msg = saveOrder( $cid, $row, "\$condition = \"position='\$row->position' AND ordering > -10000 AND ordering < 10000 \";" );
	cbRedirect( $_CB_framework->backendUrl( 'index.php?option=com_comprofiler&task=showTab' ), $msg );
} // saveTabOrder saveOrder

function saveListOrder( &$cid ) {
	global $_CB_framework, $_CB_database;
	$row 		= new moscomprofilerLists( $_CB_database );
	$msg = saveOrder( $cid, $row, null );
	cbRedirect( $_CB_framework->backendUrl( 'index.php?option=com_comprofiler&task=showLists' ), $msg );
} // saveListOrder saveOrder




//plugin
function viewPlugins( $option ) {
	global $_CB_database, $_CB_framework;

	$limit			=	(int) $_CB_framework->getCfg( 'list_limit' );
	if ( $limit == 0 ) {
		$limit = 10;
	}
	$limit			=	$_CB_framework->getUserStateFromRequest( "viewlistlimit", 'limit', $limit );
	$lastCBlist = $_CB_framework->getUserState( "view{$option}lastCBlist", null );
	if ($lastCBlist == 'showplugins') {
		$limitstart 	= $_CB_framework->getUserStateFromRequest( "view{$option}limitstart", 'limitstart', 0 );
		$lastSearch = $_CB_framework->getUserState( "search{$option}", null );
		$search		= $_CB_framework->getUserStateFromRequest( "search{$option}", 'search', '' );
		if ($lastSearch != $search) {
			$limitstart = 0;
			$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
		}
		$search = trim( strtolower( $search ) );
		$filter_type	= $_CB_framework->getUserStateFromRequest( "filter_type{$option}", 'filter_type', "0" );
	} else {
		clearSearchBox();
		$search="";
		$limitstart = 0;
		$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
		$_CB_framework->setUserState( "view{$option}lastCBlist", "showplugins" );
		$filter_type = "0";
		$_CB_framework->setUserState( "filter_type{$option}", $filter_type );
	}
	$where=array();

	// used by filter
	if ( $filter_type ) {
		$where[] = "m.type = '$filter_type'";
	}
	if ( $search ) {
		$search = cbEscapeSQLsearch( trim( strtolower( cbGetEscaped($search))));
		$where[] = "LOWER( m.name ) LIKE '%$search%'";
	}

	if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
		$viewAccessLevels			=	CBuser::getMyInstance()->getAuthorisedViewLevelsIds( true );
		$viewAccessLevelsCleaned	=	implode( ',', cbArrayToInts( $viewAccessLevels ) );
		$where[]					=	'm.access IN ('. $viewAccessLevelsCleaned . ')';
	}
	
	// get the total number of records
	$query = "SELECT COUNT(*) FROM #__comprofiler_plugin AS m ". ( count( $where ) ? "\n WHERE " . implode( ' AND ', $where ) : '' );
	$_CB_database->setQuery( $query );
	$total = $_CB_database->loadResult();
	if ($total <= $limitstart) $limitstart = 0;

	cbimport( 'cb.pagination' );
	$pageNav = new cbPageNav( $total, $limitstart, $limit  );

	if ( checkJversion() == 2 ) {
		$title = 'title';
	} else {
		$title = 'name';
	}

	$query = "SELECT m.*, u.name AS editor, g.$title AS groupname"
	. "\n FROM #__comprofiler_plugin AS m"
	. "\n LEFT JOIN #__users AS u ON u.id = m.checked_out";

	if ( checkJversion() == 2 ) {
		$query .= "\n LEFT JOIN #__viewlevels AS g ON g.id = m.access + IF(m.access <= 2, 1, 0)";		// fix J1.6's wrong access levels, same as g.id = IF( m.access = 0, 1, IF( m.access = 1, 2, IF( m.access = 2, 3, m.access ) ) )
	} else {
		$query .= "\n LEFT JOIN #__groups AS g ON g.id = m.access";
	}

	$query .= ( count( $where ) ? "\n WHERE " . implode( ' AND ', $where ) : '' )
	. "\n GROUP BY m.id"
	. "\n ORDER BY m.type ASC, m.ordering ASC, m.name ASC";
	$_CB_database->setQuery( $query, (int) $pageNav->limitstart, (int) $pageNav->limit );
	$rows = $_CB_database->loadObjectList();
	if ($_CB_database->getErrorNum()) {
		echo $_CB_database->stderr();
		return false;
	}

	// get list of Positions for dropdown filter
	$query = "SELECT type AS value, type AS text"
	. "\n FROM #__comprofiler_plugin"
	. "\n GROUP BY type"
	. "\n ORDER BY type"
	;
	$types[] = moscomprofilerHTML::makeOption( '0', (!defined('_SEL_TYPE')) ? '- ' . CBTxt::T('Select Type') . ' -' : _SEL_TYPE );		// Mambo 4.5.1 Compatibility
	$_CB_database->setQuery( $query );
	$types = array_merge( $types, $_CB_database->loadObjectList() );
	$lists['type']	= moscomprofilerHTML::selectList( $types, 'filter_type', 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'value', 'text', $filter_type, 2 );

	$canAdmin		=	CBuser::getMyInstance()->authoriseAction( 'core.admin' );
	$canEdit		=	CBuser::getMyInstance()->authoriseAction( 'core.edit' );
	$canEditState	=	CBuser::getMyInstance()->authoriseAction( 'core.edit.state' );
	
	HTML_comprofiler::showPlugins( $rows, $pageNav, $option, $lists, $search, $canAdmin, $canEdit, $canEditState );
	return true;
}


/**
* Deletes one or more plugins
*
* Also deletes associated entries in the #__comprofiler_plugin table.
* @param array An array of unique category id numbers
*/
function removePlugin( &$cid, $option ) {
	if (count( $cid ) < 1) {
		echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Select a plugin to delete') ) . "'); window.history.go(-1);</script>\n";
		exit;
	}
	$installer = new cbInstallerPlugin();
	foreach($cid AS $id) {
		$ret	=	$installer->uninstall($id,$option);
		if ( ! $ret ) {
			break;
		}
	}
	if ( $ret ) {
		HTML_comprofiler::showInstallMessage( $installer->getError(), CBTxt::T('Uninstall Plugin') . ' - '.($ret ? CBTxt::T('Success') : CBTxt::T('Failed')),
		$installer->returnTo( $option, 'showPlugins' ) );
	}
}

/**
* Publishes or Unpublishes one or more plugins
* @param array An array of unique category id numbers
* @param integer 0 if unpublishing, 1 if publishing
*/
function publishPlugin( $cid=null, $publish=1, $option ) {
	global $_CB_database, $_CB_framework;

	if (count( $cid ) < 1) {
		$action = $publish ? CBTxt::T('publish') : CBTxt::T('unpublish');
		echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select a plugin to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
		exit;
	}

	cbArrayToInts($cid);

	if ( $publish == 0 ) {
		foreach ( $cid as $id ) {
			$row			=	new moscomprofilerPlugin( $_CB_database );
			if ( $row->load( (int) $id ) ) {
				if ( ( $row->type == "language" ) && $row->published ) {
					cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ), CBTxt::T('Language plugins cannot be unpublished, only uninstalled'), 'error' );
				} elseif ( ( $row->id == 1 ) && $row->published ) {
					cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ), CBTxt::T('Core plugin cannot be unpublished'), 'error' );
				}
			} else {
				cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ), CBTxt::T('Plugin can not be found'), 'error' );
			}
		}
	}
	$cids = implode( ',', $cid );

	$query = "UPDATE #__comprofiler_plugin SET published = " . (int) $publish
	. "\n WHERE id IN ($cids)"
	. "\n AND ((checked_out = 0) OR (checked_out = " . (int) $_CB_framework->myId() . "))"
	;
	$_CB_database->setQuery( $query );
	if (!$_CB_database->query()) {
		echo "<script type=\"text/javascript\"> alert('".$_CB_database->getErrorMsg()."'); window.history.go(-1); </script>\n";
		exit();
	}

	if (count( $cid ) == 1) {
		$row = new moscomprofilerPlugin( $_CB_database );
		$row->checkin( $cid[0] );
	}

	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" )  );
}

/**
* Cancels an edit operation
*/
function cancelPlugin( $option) {
	global $_CB_framework, $_CB_database, $_POST;

	$row = new moscomprofilerPlugin( $_CB_database );
	$row->bind( $_POST );
	$row->checkin();

	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ) );
}

function cancelPluginAction( $option) {
	global $_CB_framework, $_POST;

	$pluginId	=	(int) cbGetParam( $_POST, 'cid' );
	if ( $pluginId ) {
		cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=editPlugin&cid=$pluginId" ) );
	} else {
		cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ) );
	}
}

/**
* Moves the order of a record
* @param integer The unique id of record
* @param integer The increment to reorder by
*/
function orderPlugin( $uid, $inc, $option ) {
	global $_CB_framework, $_CB_database;

	$row = new moscomprofilerPlugin( $_CB_database );
	$row->load( (int) $uid );
	$row->move( $inc, "type='$row->type' AND ordering > -10000 AND ordering < 10000 "  );

	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ) );
}

/**
* changes the access level of a record
* @param integer The increment to reorder by
*/
function accessMenu( $uid, $access, $option ) {
	global $_CB_framework, $_CB_database;

	switch ( $access ) {
		case 'accesspublic':
			$access = 0;
			break;

		case 'accessregistered':
			$access = 1;
			break;

		case 'accessspecial':
			$access = 2;
			break;
	}

	$row = new moscomprofilerPlugin( $_CB_database );
	$row->load( (int) $uid );
	$row->access = $access;

	if ( !$row->check() ) {
		return $row->getError();
	}
	if ( !$row->store() ) {
		return $row->getError();
	}

	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ) );
	return null;
}

function savePluginOrder( &$cid, $option ) {
	global $_CB_framework, $_CB_database;
	$row = new moscomprofilerPlugin( $_CB_database );
	$msg = saveOrder( $cid, $row, "\$condition = \"type='\$row->type' AND ordering > -10000 AND ordering < 10000 \";" );
	cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ), $msg );
} // savePluginOrder

function installPluginUpload() {
	global $_FILES;

	// Try extending time, as unziping/ftping took already quite some... :
	@set_time_limit( 240 );

	HTML_comprofiler::secureAboveForm('showPlugins');

	outputCbTemplate( 2 );
	outputCbJs( 2 );
    initToolTip( 2 );

	$option		=	"com_comprofiler";
	$task		=	"showPlugins";
	$client		=	0;
	//echo "installPluginUpload";

	$installer	=	new cbInstallerPlugin();

	// Check if file uploads are enabled
	if ( ! (bool) ini_get( 'file_uploads' ) ) {
		HTML_comprofiler::showInstallMessage( CBTxt::T('The installer cannot continue before file uploads are enabled. Please use the install from directory method.'),
			CBTxt::T('Installer - Error'), $installer->returnTo( $option, $task, $client ) );
		exit();
	}

	// Check that the zlib is available
	if( ! extension_loaded( 'zlib' ) ) {
		HTML_comprofiler::showInstallMessage( CBTxt::T('The installer cannot continue before zlib is installed'),
			CBTxt::T('Installer - Error'), $installer->returnTo( $option, $task, $client ) );
		exit();
	}

	$userfile				=	cbGetParam( $_FILES, 'userfile', null );

	if ( ! $userfile || ( $userfile == null ) ) {
		HTML_comprofiler::showInstallMessage( CBTxt::T('No file selected'), CBTxt::T('Upload new plugin - error'),
			$installer->returnTo( $option, $task, $client ));
		exit();
	}

//	$userfile['tmp_name']	=	stripslashes( $userfile['tmp_name'] );
//	$userfile['name']		=	stripslashes( $userfile['name'] );

	$msg		=	'';
	$localName	=	$_FILES['userfile']['name'];
	$resultdir	=	uploadFile( $_FILES['userfile']['tmp_name'], $localName , $msg );		// $localName is updated here

	if ( $resultdir !== false ) {
		if ( ! $installer->upload( $localName ) ) {
			if ( $installer->unpackDir() ) {
				$installer->cleanupInstall( $localName, $installer->unpackDir() );
			}
			HTML_comprofiler::showInstallMessage( $installer->getError(), sprintf(CBTxt::T('Upload %s - Upload Failed'), $task),
				$installer->returnTo( $option, $task, $client ) );
		}
		$ret	=	$installer->install();

		$installer->cleanupInstall( $localName, $installer->unpackDir() );

		HTML_comprofiler::showInstallMessage( $installer->getError(), sprintf(CBTxt::T('Upload %s - '), $task) . ( $ret ? CBTxt::T('Success') : CBTxt::T('Failed') ),
			$installer->returnTo( $option, $task, $client ) );
		$installer->cleanupInstall( $localName, $installer->unpackDir() );
	} else {
		HTML_comprofiler::showInstallMessage( $msg, sprintf(CBTxt::T('Upload %s - Upload Error'), $task),
			$installer->returnTo( $option, $task, $client ) );
	}

}

function _cbAdmin_chmod( $filename ) {
	global $_CB_framework;

	cbimport( 'cb.adminfilesystem' );
	$adminFS			=&	cbAdminFileSystem::getInstance();

	$origmask			=	null;
	if ( $_CB_framework->getCfg( 'dirperms' ) == '' ) {
		// rely on umask
		// $mode			=	0777;
		return true;
	} else {
		$origmask		=	@umask( 0 );
		$mode			=	octdec( $_CB_framework->getCfg( 'dirperms' ) );
	}

	$ret				=	$adminFS->chmod( $filename, $mode );

	if ( isset( $origmask ) ) {
		@umask( $origmask );
	}
	return $ret;
}

function uploadFile( $filename, &$userfile_name, &$msg ) {
	global $_CB_framework;

	cbimport( 'cb.adminfilesystem' );
	$adminFS			=&	cbAdminFileSystem::getInstance();

	$baseDir			=	_cbPathName( $_CB_framework->getCfg('tmp_path') );
	$userfile_name		=	$baseDir . $userfile_name;		// WARNING: this parameter is returned !

	if ( $adminFS->file_exists( $baseDir ) ) {
		if ( $adminFS->is_writable( $baseDir ) ) {
			if ( move_uploaded_file( $filename, $userfile_name ) ) {
//			    if ( _cbAdmin_chmod( $userfile_name ) ) {
			        return true;
//				} else {
//					$msg = CBTxt::T('Failed to change the permissions of the uploaded file.');
//				}
			} else {
				$msg = sprintf( CBTxt::T('Failed to move uploaded file to %s directory.'), '<code>' . htmlspecialchars( $baseDir ) . '</code>' );
			}
		} else {
		    $msg = sprintf( CBTxt::T('Upload failed as %s directory is not writable.'), '<code>' . htmlspecialchars( $baseDir ) . '</code>' );
		}
	} else {
	    $msg = sprintf( CBTxt::T('Upload failed as %s directory does not exist.'), '<code>' . htmlspecialchars( $baseDir ) . '</code>' );
	}
	return false;
}

function installPluginDir() {
	// Try extending time, as unziping/ftping took already quite some... :
	@set_time_limit( 240 );

	HTML_comprofiler::secureAboveForm('showPlugins');

	outputCbTemplate( 2 );
	outputCbJs( 2 );
    initToolTip( 2 );

	$option="com_comprofiler";
	$task="showPlugins";
	$client=0;
	// echo "installPluginDir";

	$installer = new cbInstallerPlugin();

	$userfile = cbGetParam( $_REQUEST, 'userfile', null );

	// Check if file name exists
	if (!$userfile) {
		HTML_comprofiler::showInstallMessage( CBTxt::T('No file selected'), CBTxt::T('Install new plugin from directory - error'),
			$installer->returnTo( $option, $task, $client ) );
		exit();
	}

	$path = _cbPathName( $userfile );
	if (!is_dir( $path )) {
		$path = dirname( $path );
	}

	$ret = $installer->install( $path);

	HTML_comprofiler::showInstallMessage( $installer->getError(), sprintf( CBTxt::T('Install new plugin from directory %s'), $userfile ) . ' - ' . ( $ret ? CBTxt::T('Success') : CBTxt::T('Failed') ),
		$installer->returnTo( $option, $task, $client ) );
}


function installPluginURL() {
	global $_CB_framework;

	// Try extending time, as unziping/ftping took already quite some... :
	@set_time_limit( 240 );

	HTML_comprofiler::secureAboveForm('showPlugins');

	outputCbTemplate( 2 );
	outputCbJs( 2 );
    initToolTip( 2 );

	$option="com_comprofiler";
	$task="showPlugins";
	$client=0;
	// echo "installPluginURL";

	$installer = new cbInstallerPlugin();

	// Check that the zlib is available
	if(!extension_loaded('zlib')) {
		HTML_comprofiler::showInstallMessage( CBTxt::T('The installer cannot continue before zlib is installed'),
			CBTxt::T('Installer - Error'), $installer->returnTo( $option, $task, $client ) );
		exit();
	}

	$userfileURL = cbGetParam( $_REQUEST, 'userfile', null );

	if (!$userfileURL) {
		HTML_comprofiler::showInstallMessage( CBTxt::T('No URL selected'), CBTxt::T('Upload new plugin - error'),
			$installer->returnTo( $option, $task, $client ));
		exit();
	}


	cbimport( 'cb.adminfilesystem' );
	$adminFS			=&	cbAdminFileSystem::getInstance();

	if ( $adminFS->isUsingStandardPHP() ) {
		$baseDir		=	_cbPathName( $_CB_framework->getCfg('tmp_path') );
	} else {
		$baseDir		=	$_CB_framework->getCfg( 'absolute_path' ) . '/tmp/';
	}
	$userfileName		=	$baseDir . 'comprofiler_temp.zip';


	$msg			=	'';
	//echo "step-uploadfile<br />";
	$resultdir		=	uploadFileURL( $userfileURL, $userfileName, $msg );

	if ($resultdir !== false) {
		//echo "step-upload<br />";
		if (!$installer->upload( $userfileName )) {
			HTML_comprofiler::showInstallMessage( $installer->getError(), sprintf(CBTxt::T('Download %s - Upload Failed'), $userfileURL),
				$installer->returnTo( $option, $task, $client ) );
		}
		//echo "step-install<br />";
		$ret = $installer->install();

		if ( $ret ) {
			HTML_comprofiler::showInstallMessage( $installer->getError(), sprintf( CBTxt::T('Download %s'), $userfileURL ) . ' - ' . ( $ret ? CBTxt::T('Success') : CBTxt::T('Failed') ),
													$installer->returnTo( $option, $task, $client ) );
		}
		$installer->cleanupInstall( $userfileName, $installer->unpackDir() );
	} else {
		HTML_comprofiler::showInstallMessage( $msg, sprintf(CBTxt::T('Download %s - Download Error'), $userfileURL),
												$installer->returnTo( $option, $task, $client ) );
	}

}

function uploadFileURL( $userfileURL, $userfile_name, &$msg ) {
	global $_CB_framework;

	cbimport( 'cb.snoopy' );
	cbimport( 'cb.adminfilesystem' );
	$adminFS					=&	cbAdminFileSystem::getInstance();

	if ( $adminFS->isUsingStandardPHP() ) {
		$baseDir				=	_cbPathName( $_CB_framework->getCfg('tmp_path') );
	} else {
		$baseDir				=	$_CB_framework->getCfg( 'absolute_path' ) . '/tmp';
	}

	if ( file_exists( $baseDir ) ) {
		if ( $adminFS->is_writable( $baseDir ) || ! $adminFS->isUsingStandardPHP() ) {

			$s					=	new CBSnoopy();
			$fetchResult		=	@$s->fetch( $userfileURL );

			if ( $fetchResult && ! $s->error && ( $s->status == 200 ) ) {
				cbimport( 'cb.adminfilesystem' );
				$adminFS		=&	cbAdminFileSystem::getInstance();
				if ( $adminFS->file_put_contents( $baseDir . $userfile_name, $s->results ) ) {
					if ( _cbAdmin_chmod( $baseDir . $userfile_name ) ) {
						return true;
					} else {
						$msg = sprintf(CBTxt::T('Failed to change the permissions of the uploaded file %s'), $baseDir.$userfile_name);
					}
				} else {
					$msg = sprintf(CBTxt::T('Failed to create and write uploaded file in %s'), $baseDir.$userfile_name);
				}
			} else {
				$msg = ( $s->error ? sprintf( CBTxt::T('Failed to download package file from <code>%s</code> to webserver due to following error: %s'),  $userfileURL, $s->error ) :
					   				 sprintf( CBTxt::T('Failed to download package file from <code>%s</code> to webserver due to following status: %s'), $userfileURL, $s->status . ': ' . $s->response_code ) );
			}
		} else {
		    $msg = sprintf( CBTxt::T('Upload failed as %s directory is not writable.'), '<code>' . htmlspecialchars( $baseDir ) . '</code>' );
		}
	} else {
	    $msg = sprintf( CBTxt::T('Upload failed as %s directory does not exist.'), '<code>' . htmlspecialchars( $baseDir ) . '</code>' );
	}
	return false;
}


// Ajax: administrator/index.php?option=com_comprofiler&task=latestVersion :
function latestVersion(){
	global $_CB_framework, $ueConfig;

	cbimport( 'cb.snoopy' );

	$s = new CBSnoopy();
	$s->read_timeout = 90;
	$s->referer = $_CB_framework->getCfg( 'live_site' );
	@$s->fetch('http://www.joomlapolis.com/versions/comprofilerversion.php?currentversion='.urlencode($ueConfig['version']));
	$version_info = $s->results;
	$version_info_pos = strpos($version_info, ":");
	if ($version_info_pos === false) {
		$version = $version_info;
		$info = null;
	} else {
		$version = substr( $version_info, 0, $version_info_pos );
		$info = substr( $version_info, $version_info_pos + 1 );
	}
	if($s->error || $s->status != 200){
    	echo '<font color="red">' . CBTxt::T('Connection to update server failed') . ': ' . CBTxt::T('ERROR') . ': ' . $s->error . ($s->status == -100 ? CBTxt::T('Timeout') : $s->status).'</font>';
    } else if($version == $ueConfig['version']){
    	echo '<font color="green">' . $version . '</font>' . $info;
    } else {
    	echo '<font color="red">' . $version . '</font>' . $info;
    }
}

// NB for now duplicated in frontend and admin backend:
function tabClass( $option, $task, $uid ) {
	global $_PLUGINS, $_REQUEST, $_POST;

	if ( $uid ) {
		$cbUser				=&	CBuser::getInstance( (int) $uid );
		if ( $cbUser ) {
			$user			=&	$cbUser->getUserData();
		} else {
			$cbUser			=&	CBuser::getInstance( null );
			$user			=	null;
		}
	} else {
		$cbUser				=&	CBuser::getInstance( null );
		$user				=	null;
	}

	$unsecureChars			=	array( '/', '\\', ':', ';', '{', '}', '(', ')', "\"", "'", '.', ',', "\0", ' ', "\t", "\n", "\r", "\x0B" );
	if ( $task == 'fieldclass' ) {
		if ( $user && $user->id ) {
			$uid			=	$user->id;
		} else {
			$uid			=	0;
		}

		$msg				=	checkCBpermissions( array($uid), "edit", true );
		if ( $msg ) {
			echo $msg;
			return;
		}

		$fieldName			=	trim( substr( str_replace( $unsecureChars, '', urldecode( stripslashes( cbGetParam( $_REQUEST, "field" ) ) ) ), 0, 50 ) );
		if ( ! $fieldName ) {
			echo CBTxt::T('no field');
			return;
		}
	} elseif ( $task == 'tabclass' ) {
		$tabClassName		=	urldecode( stripslashes( cbGetParam( $_REQUEST, "tab" ) ) );
		if ( ! $tabClassName ) {
			return;
		}
		$pluginName			=	null;
		$tabClassName		=	substr( str_replace( $unsecureChars, '', $tabClassName ), 0, 32 );
		$method				=	'getTabComponent';
	} elseif ( $task == 'pluginclass' ) {
		$pluginName			=	urldecode( stripslashes( cbGetParam( $_REQUEST, "plugin" ) ) );
		if ( ! $pluginName ) {
			return;
		}
		$tabClassName		=	'CBplug_' . strtolower( substr( str_replace( $unsecureChars, '', $pluginName ), 0, 32 ) );
		$method				=	'getCBpluginComponent';
	}
	$tabs					=	$cbUser->_getCbTabs( false );
	if ( $task == 'fieldclass' ) {
		$result				=	$tabs->fieldCall( $fieldName, $user, $_POST, 'edit' );
	} else {
		$result				=	$tabs->tabClassPluginTabs( $user, $_POST, $pluginName, $tabClassName, $method );
	}
	if ( $result === false ) {
	 	if( $_PLUGINS->is_errors() ) {
			echo "<script type=\"text/javascript\">alert(\"" . $_PLUGINS->getErrorMSG() . "\"); </script>\n";
	 	}
	} elseif ( $result !== null ) {
		echo $result;
	}
}

function finishInstallation( $option ) {
	global $_CB_framework, $ueConfig, $task;

	// Try extending time, as unziping/ftping took already quite some... :
	@set_time_limit( 240 );

	HTML_comprofiler::secureAboveForm('finishInstallation');

	$tgzFile			=	$_CB_framework->getCfg( 'absolute_path' ) . '/administrator/components/com_comprofiler/pluginsfiles.tgz';
	$installerFile		=	$_CB_framework->getCfg( 'absolute_path' ) . '/administrator/components/com_comprofiler/';
	if ( file_exists( $installerFile . 'comprofiler.xml' ) ) {
		$installerFile	.=	'comprofiler.xml';
	} elseif ( file_exists( $installerFile . 'comprofilej.xml' ) ) {
		$installerFile	.=	'comprofilej.xml';
	} elseif ( file_exists( $installerFile . 'comprofileg.xml' ) ) {
		$installerFile	.=	'comprofileg.xml';
	}

	if ( ! file_exists( $tgzFile ) ) {
		echo _UE_NOT_AUTHORIZED;
		return;
	}

	$installer = new cbInstallerPlugin();
	$client				=	2;

	// Check that the zlib is available
	if(!extension_loaded('zlib')) {
		HTML_comprofiler::showInstallMessage( CBTxt::T('The installer cannot continue before zlib is installed'),
			CBTxt::T('Installer - Error'), $installer->returnTo( $option, $task, $client ) );
		exit();
	}

	if ( ! $installer->upload( $tgzFile, true, false ) ) {
		HTML_comprofiler::showInstallMessage( sprintf(CBTxt::T("Uncompressing %s failed."), $tgzFile),
			CBTxt::T('Installer - Error'), $installer->returnTo( $option, '', 2 ) );
		exit();
	}

	$installFrom		=	$installer->installDir();
	$installTo			=	$_CB_framework->getCfg( 'absolute_path' ) . '/components/com_comprofiler/plugin';
	$filesList			=	cbReadDirectory( $installFrom, '.', true );
	// create directories and remove them from file list:
	if ( ! $installer->mosMakePath( dirname( $installTo ) . '/', 'plugin' ) ) {
		HTML_comprofiler::showInstallMessage( sprintf(CBTxt::T('Failed to create directory "%s"'), $installTo . '/plugin' ),
			CBTxt::T('Installer - Error'), $installer->returnTo( $option, '', 2 ) );
		exit();
	}
	foreach ( $filesList as $k => $file ) {
		if ( basename( $file ) != $file ) {
			$newdir		=	dirname( $file );
			if ( ! $installer->mosMakePath( $installTo . '/', $newdir ) ) {
				HTML_comprofiler::showInstallMessage( sprintf(CBTxt::T('Failed to create directory "%s"'), $installTo . '/' . $newdir ),
					CBTxt::T('Installer - Error'), $installer->returnTo( $option, '', 2 ) );
				exit();
			}
		}
		if ( ! is_file( $installFrom . '/' . $file ) ) {
			unset( $filesList[$k] );
		}
	}

	$result				=	$installer->copyFiles( $installFrom, $installTo, $filesList, true );
	if ( $result === false ) {
		HTML_comprofiler::showInstallMessage( sprintf(CBTxt::T("Copying plugin files failed with error: %s"), $installer->getError()),
			CBTxt::T('Installer - Error'), $installer->returnTo( $option, '', 2 ) );
		exit();
	}

	$adminFS			=&	cbAdminFileSystem::getInstance();
	$result				=	$adminFS->deldir( _cbPathName( $installFrom . '/' ) );
	if ( $result === false ) {
		HTML_comprofiler::showInstallMessage( CBTxt::T('Deleting expanded tgz file directory failed with an error.'),
			CBTxt::T('Installer - Error'), $installer->returnTo( $option, '', 2 ) );
	}
	$tgzFileOS			=	_cbPathName( $tgzFile, false );
	$result				=	$adminFS->unlink( $tgzFileOS );
	if ( $result === false ) {
		HTML_comprofiler::showInstallMessage( sprintf(CBTxt::T("Deleting file %s failed with an error."),$tgzFileOS),
			CBTxt::T('Installer - Error'), $installer->returnTo( $option, '', 2 ) );
	}

	// adapt published fields to global CB config (regarding name type)
	_cbAdaptNameFieldsPublished( $ueConfig );

	$htmlToDisplay		=	$_CB_framework->getUserState( 'com_comprofiler_install' );
	// clears the session buffer memory after installaion done:
	$_CB_framework->setUserState( 'com_comprofiler_install', '' );

	cbimport( 'cb.xml.simplexml' );
	$installerXml		=	new CBSimpleXMLElement( file_get_contents( $installerFile ) );
	if ( is_object( $installerXml ) ) {
		$description	=	$installerXml->getElementByPath( 'description' );
		if ( $description !== false ) {
			echo '<h2>' . $description->data() . '</h2>';
		}
	}
	echo $htmlToDisplay;
?>
<div style="font-weight:bold;font-size:110%;background:#ffffe4;border:2px green solid;padding:5px;margin-bottom:20px;"><font color="green"><?php echo CBTxt::T('Second and last installation step of Community Builder Component (comprofiler) done successfully.') ?></font></div><br />
<div style="font-weight:bold;font-size:125%;background:#ffffe4;border:2px green solid;padding:5px;">
<font color="green"><b><?php echo CBTxt::T('Installation finished. Important: Please read README.TXT and installation manual for further settings.'); ?> <br /><br /><?php echo CBTxt::T('We also have a PDF installation guide as well as a complete documentation available on'); ?> <a href="http://www.joomlapolis.com">www.joomlapolis.com</a> <?php echo CBTxt::T('which will help you making the most out of your Community Builder installation, while supporting this project, as well as plugins and templates.'); ?></b></font>
</div>
<?php
		$_CB_framework->setUserState( "com_comprofiler_install", '' );
}

?>