<?php
/**
 * CrugeModule 
 * 
 * @uses CWebModule
 * @author Christian Salazar H. <christiansalazarh@gmail.com> 
 * @license /protected/modules/cruge/LICENSE
 */
class CrugeModule extends CWebModule
{
	public $debug = false;					// poner a true para ayudar en la instalacion
	public $tableprefix = 'cruge_';			// agrega un prefijo para buscar las tablas en db
	public $maptables = array();			// permite cambiar los nombres de las tablas

	public $baseUrl = "";					// usada para enviar los links de activacion de la cuenta de usuario
											// se usa mediante CrugeUtil::config()->baseUrl
											// para principalmente en CrugeUserManagement::getActivationUrl()

	public $superuserName = 'admin';		// username del super usuario. cualquier llamada
											// a Yii::app()->user->checkAccess retornara true
											// si el superuserName coincide con este valor

	// permite que se puedan configurar los campos (incluso personalizados)
	//	a la hora de consultar a:  $usuario->getUserDescription()  (CrugeStoredUser)
	//
	//	se debe retornar un array con "username" o "email" o cualquier nombre de campo personalizado
	//  ejemplos: array("firstname","lastname","chipnumber","address")
	//	lo cual concatenara una lista separada por comas con los valores de estos
	//	campos.
	//
	public $userDescriptionFieldsArray = array("email" /*, firstname, lastname */);


	public $afterLoginUrl;				// por defecto son usadas por el filtro de sesion: DefaultSessionFilter
	public $afterLogoutUrl;				//	tras el evento onLogin y onLogout
	public $afterSessionExpiredUrl;		//

	// la clase a usar para los CGridView, debido a que BootStrap ofrece clases con distinto estilo
	// modificando este valor se causa que los CGridView se renderizen usando la clase indicada
	//
	// por defecto poner: zii.widgets.grid.CGridView
	public $useCGridViewClass = 'zii.widgets.grid.CGridView';

	// el estilo del boton que la UI usara:
	//	normal, jui, bootstrap
	//  por defecto: normal
	public $buttonStyle = 'normal';
	public $buttonConf = 'small';// large, small o mini

	// ponerla a true para que se creen de forma automatica las operaciones en el sistema de Rbac
	// cuando se haga una llamada a Yii::app()->user->checkAccess() y esta retorne false.
	//
	// public function actionCreatePost(){
	//    if(Yii::app()->user->checkAccess('createpost_get')==false)
	//    		throw new CrugeException('acceso denegado');
	// }
	//
	// en este action de ejemplo (arriba), se solicita una operacion llamada: 'createpost_get'
	// que quiza no haya sido insertada en la lista de operaciones del sistema de rbac. entonces,
	// cuando rbacSetupEnabled es true esta operacion sera insertada para que podamos usarla
	// para ser asignada a los diferentes roles o tareas.
	//
	public $rbacSetupEnabled=false;
	// cuando esta en true y el modo de setup de rbac tambien lo esta (rbacSetupEnabled=true)
	// entonces permitira al usuario acecder a la funcion denegada aunque no tenga el permiso
	//
	public $allowUserAlways=false;


	// el iduser del usuario invitado. por defecto es 2. (admin es 1)
	//
	public $guestUserId=2;

	// los nombres de los modulos de autenticacion habilitados para reconocer usuarios:
	// cada nombre debe coincidir con el valor devuelto por ICrugeAuth::authName()
	//
	// en UiController::actionLogin se lee esta variable para saber con que filtro de autenticacion se procesara
	// el request de login del usuario, por defecto 'default' el cual usa a models.auth.CrugeAuthDefault
	//
	// para leer este valor usar:
	//	$valor = CrugeFactory::get()->getConfiguredAuthMethodName();
	//
	public $availableAuthMethods = array('default');

	// los campos por los cuales se puede buscar a un usuario cuando hace login
	public $availableAuthModes	 = array('email','username');

	// ruta de la clase que implementa a ICrugeSessionFilter.
	// si es null se usa a defaultSessionFilter
	// son usados en: CrugeFactory::getICrugeSessionFilter para determinar con que conceder la sesion
	public $sessionfilter=null;
	public $defaultSessionFilter = 'cruge.models.filters.DefaultSessionFilter';

	// este filtro permite o niega la creacion o actualizacion de un usuario.
	//
	// aqui se espera una clase que implemente a: ICrugeUserFilter
	//
	public $userFilter='cruge.models.filters.DefaultUserFilter';

	// indica si una clave es almacenada con hash o no.
	//
	public $useEncryptedPassword = false;

    // Indica el algoritmo de hash a usarse

    public $hash = 'md5';

	// estos atributos llamados xxxLayout, son para indicar que layout usar
	// para los actions:
	//
	// generalUserManagementLayout: todos los actions de usermanagament (admin,create,update..)
	// activateAccountLayout:  el action que presenta la pagina de activar cuenta
	// registrationLayout: el action para registrar usuarios
	//
	// por defecto usar valor: "ui".  eso hara que lea el archivo llamado "ui" ubicado en
	// 		/protected/modules/cruge/views/layouts/ui.php
	// si se quisiera usar un layout de la aplicacion en vez del modulo:
	//		/protected/views/layouts/otrolayout.php
	// entonces configurar asi:
	//		"//layouts/otrolayout"
	public $generalUserManagementLayout = 'ui';
	public $editProfileLayout = 'ui';
	public $activateAccountLayout = '//layouts/column1';
	public $registrationLayout = '//layouts/column1';
	public $loginLayout = '//layouts/column1';

	// sirve para que la controladora UiController pueda que nombre pasar a $_POST['??']
	// para actualizar los atributos de una clase.  Si se llegase a cambiar una clase
	// por otra entonces con solo cambiar aqui el nombre el formulario podr� trabajar de nuevo
	//
	// Es utilizada en cada referencia a $_POST o $_GET en la controladora de UiController
	//
	// ejemplo: Ma�ana no nos gusta CrugeField y cambiamos la clase por CrugeMyOwnField
	// entonces en este array se mapearia asi:  'CrugeField'=>'CrugeMyOwnField'
	//
	public $postNameMappings = array(
		'CrugeLogon'=>'CrugeLogon',
		'CrugeStoredUser'=>'CrugeStoredUser',
		'CrugeField'=>'CrugeField',
		'CrugeSystem'=>'CrugeSystem',
		'CrugeSession'=>'CrugeSession',
	);

	// estos parametros no deben manipularse
	public $defaultController = 'ui';
	public $uicontroller='ui';
	public $_lazyAuthModes = null;
	private $_factory;

	// este array es usado por CrugeUi para almacenar errors que han sido reportados
	// por CrugeUi::addError() , luego, para desplegar los errores observados
	// puede usarse al pie de la pagina web la siguiente linea:
	//
	//	echo Yii::app()->user->ui->displayErrorConsole();
	//
	public $globalErrors = array();



	public function init()
	{
		$this->setImport(array(
			'cruge.models.*',
			'cruge.models.data.*',	// clases del modelo de datos
			'cruge.models.auth.*',	// clases de autenticacion
			'cruge.models.filters.*',// clases de filtros de sesion
			'cruge.models.ui.*',// clases de interfaz de usuario
			'cruge.components.*',	// clases del modelo
			'cruge.interfaces.*',	// interfaces
			'cruge.extensions.crugemailer.*',	// extensiones consumidas por el modulo

		));

	}

	public function getUiControllerName(){
		return $this->uicontroller;
	}

	public function getFactory(){
		if($this->_factory == null)
			$this->_factory = new CrugeFactory();
		return $this->_factory;
	}



	public function beforeControllerAction($controller, $action)
	{
		if(parent::beforeControllerAction($controller, $action))
		{
			return true;
		}
		else
			return false;
	}



}