PageRenderTime 42ms CodeModel.GetById 15ms app.highlight 18ms RepoModel.GetById 1ms app.codeStats 0ms

/Docs/07-Implementacion/Source/trunk/EDUAR_Regular/EDUAR/EDUAR_UI/EDUARMaster.Master.cs

http://blpm.googlecode.com/
C# | 691 lines | 474 code | 54 blank | 163 comment | 76 complexity | 4c0d7a73279d69ec205cb9ac11f7a41d MD5 | raw file
  1using System;
  2using System.Collections.Generic;
  3using System.IO;
  4using System.Text;
  5using System.Web;
  6using System.Web.Security;
  7using System.Web.UI;
  8using System.Web.UI.WebControls;
  9using EDUAR_BusinessLogic.Common;
 10using EDUAR_Entities;
 11using EDUAR_Entities.Security;
 12using EDUAR_Entities.Shared;
 13using EDUAR_UI.Shared;
 14using EDUAR_UI.Utilidades;
 15using EDUAR_Utility.Enumeraciones;
 16using EDUAR_Utility.Excepciones;
 17
 18namespace EDUAR_UI
 19{
 20	public partial class EDUARMaster : MasterPage, ICallbackEventHandler
 21	{
 22		#region --[Propiedades]--
 23		public Boolean EsExepcion
 24		{
 25			get { return (Boolean)ViewState["esExepcion"]; }
 26			set { ViewState["esExepcion"] = value; }
 27		}
 28
 29		private string _callbackResult;
 30
 31		/// <summary>
 32		/// Mantiene los datos del usuario logueado.
 33		/// </summary>
 34		public DTSessionDataUI ObjSessionDataUI
 35		{
 36			get
 37			{
 38				if (Session["ObjSessionDataUI"] == null)
 39					Session["ObjSessionDataUI"] = new DTSessionDataUI();
 40
 41				return (DTSessionDataUI)Session["ObjSessionDataUI"];
 42			}
 43			set { Session["ObjSessionDataUI"] = value; }
 44		}
 45
 46		/// <summary>
 47		/// Gets or sets the obj session persona.
 48		/// </summary>
 49		/// <value>
 50		/// The obj session persona.
 51		/// </value>
 52		public Persona objSessionPersona
 53		{
 54			get
 55			{
 56				if (Session["objSessionPersona"] == null)
 57				{
 58					BLPersona objBLPersona = new BLPersona(new Persona() { username = ObjSessionDataUI.ObjDTUsuario.Nombre });
 59					objBLPersona.GetPersonaByEntidad();
 60					//objSessionPersona = new Persona();
 61					objSessionPersona = objBLPersona.Data;
 62				}
 63				return (Persona)Session["objSessionPersona"];
 64			}
 65			set { Session["objSessionPersona"] = value; }
 66		}
 67
 68		/// <summary>
 69		/// Gets or sets the ciclo lectivo actual.
 70		/// </summary>
 71		/// <value>
 72		/// The ciclo lectivo actual.
 73		/// </value>
 74		public CicloLectivo cicloLectivoActual
 75		{
 76			get
 77			{
 78				if (ViewState["cicloLectivoActual"] == null)
 79				{
 80					BLCicloLectivo objBLCicloLectivo = new BLCicloLectivo();
 81					cicloLectivoActual = objBLCicloLectivo.GetCicloLectivoActual();
 82				}
 83				return (CicloLectivo)ViewState["cicloLectivoActual"];
 84			}
 85			set { ViewState["cicloLectivoActual"] = value; }
 86		}
 87		#endregion
 88
 89		#region --[Eventos]--
 90		/// <summary>
 91		/// Handles the Load event of the Page control.
 92		/// </summary>
 93		/// <param name="sender">The source of the event.</param>
 94		/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
 95		protected void Page_Load(object sender, EventArgs e)
 96		{
 97			try
 98			{
 99				//Llama a la funcionalidad que redirecciona a la pagina de Login cuando finaliza el tiempo de session
100				((EDUARBasePage)Page).DireccionamientoOnSessionEndScript();
101
102				if (HttpContext.Current.User == null || (ObjSessionDataUI.ObjDTUsuario.Nombre == null && HttpContext.Current.User.Identity.Name != string.Empty))
103				{
104					HttpContext.Current.User = null;
105					ObjSessionDataUI = null;
106				}
107				if (HttpContext.Current.User == null)
108					NavigationMenu.DataSource = SiteMapAnonymusEDUAR;
109				else
110					if (HttpContext.Current.User.Identity.IsAuthenticated)
111					{
112						divInfo.Visible = true;
113
114						CargaInforUsuario();
115
116						// ~/Private/Manuales/{0}/index.htm
117						string rol = string.Empty;
118						if (HttpContext.Current.User.IsInRole(enumRoles.Administrador.ToString()))
119							rol = enumRoles.Administrador.ToString();
120						if (HttpContext.Current.User.IsInRole(enumRoles.Administrativo.ToString()))
121							rol = enumRoles.Administrativo.ToString();
122						if (HttpContext.Current.User.IsInRole(enumRoles.Alumno.ToString()))
123							rol = enumRoles.Alumno.ToString();
124						if (HttpContext.Current.User.IsInRole(enumRoles.Director.ToString()))
125							rol = enumRoles.Director.ToString();
126						if (HttpContext.Current.User.IsInRole(enumRoles.Docente.ToString()))
127							rol = enumRoles.Docente.ToString();
128						if (HttpContext.Current.User.IsInRole(enumRoles.Preceptor.ToString()))
129							rol = enumRoles.Preceptor.ToString();
130						if (HttpContext.Current.User.IsInRole(enumRoles.Psicopedagogo.ToString()))
131							rol = enumRoles.Psicopedagogo.ToString();
132						if (HttpContext.Current.User.IsInRole(enumRoles.Tutor.ToString()))
133							rol = enumRoles.Tutor.ToString();
134
135						if (!string.IsNullOrEmpty(rol) && ((HyperLink)Page.Master.FindControl("HeadLoginView").FindControl("linkAyuda")) != null)
136							((HyperLink)Page.Master.FindControl("HeadLoginView").FindControl("linkAyuda")).NavigateUrl = string.Format("~/Private/Manuales/{0}/index.htm", rol);
137
138						#region --[Mensajes en header]--
139						//StringBuilder s = new StringBuilder();
140						//string er;
141						//  configura los llamados a RaiseCallbackEvent y GetCallbackResult
142						//er = Page.ClientScript.GetCallbackEventReference(this, "clientTime('')", "putCallbackResult", "null", "clientErrorCallback", true);
143
144						//  funcion que llama a RaiseCallbackEvent
145						//s.Append(" function callServerTask() { ");
146						//s.Append((er + ";"));
147						//s.Append(" } ");
148						////  inserta el script en la pgina
149						//Page.ClientScript.RegisterClientScriptBlock(
150						//     this.GetType(), "callServerTask", s.ToString(), true);
151						//  NOTA:
152						//  La función callServerTask() es llamada desde la function timerEvent()
153						#endregion
154					}
155					else
156					{
157						NavigationMenu.DataSource = SiteMapAnonymusEDUAR;
158					}
159
160				NavigationMenu.MenuItemDataBound += (NavigationMenu_OnItemBound);
161				NavigationMenu.DataBind();
162
163				// Ocultar la ventana de información
164				ventanaInfoMaster.Visible = false;
165
166				//Suscribe los eventos de la ventana emergente. 
167				ventanaInfoMaster.VentanaAceptarClick += (Aceptar);
168				ventanaInfoMaster.VentanaCancelarClick += (Cancelar);
169
170				if (!Page.IsPostBack)
171					CargarMenu();
172			}
173			catch (Exception ex)
174			{
175				ManageExceptions(ex);
176			}
177		}
178
179		/// <summary>
180		/// Cargas the infor usuario.
181		/// </summary>
182		private void CargaInforUsuario()
183		{
184			lblUsuario.Text = objSessionPersona.nombre + " " + objSessionPersona.apellido;
185			lblRol.Text = ObjSessionDataUI.ObjDTUsuario.ListaRoles[0].Nombre + ": ";
186
187			if (HttpContext.Current.User.IsInRole(enumRoles.Alumno.ToString()))
188			{
189				BLAlumno objBLAlumno = new BLAlumno(new Alumno() { username = ObjSessionDataUI.ObjDTUsuario.Nombre });
190				AlumnoCursoCicloLectivo objCurso = objBLAlumno.GetCursoActualAlumno(cicloLectivoActual);
191				lblCursosAsignados.Text = "Curso Actual: " + objCurso.cursoCicloLectivo.curso.nivel.nombre + "  " + objCurso.cursoCicloLectivo.curso.nombre;
192			}
193			if (HttpContext.Current.User.IsInRole(enumRoles.Docente.ToString()))
194			{
195				BLCicloLectivo objBLCicloLectivo = new BLCicloLectivo();
196				Asignatura objFiltro = new Asignatura();
197				objFiltro.curso.cicloLectivo = cicloLectivoActual;
198				//nombre del usuario logueado
199				objFiltro.docente.username = HttpContext.Current.User.Identity.Name;
200				List<Curso> listaCursos = objBLCicloLectivo.GetCursosByAsignatura(objFiltro);
201				string cursos = string.Empty;
202				if (listaCursos.Count > 0) cursos = "Cursos: <br />";
203				int i = 1;
204				listaCursos.Sort((p, q) => string.Compare(p.nombre, q.nombre));
205				foreach (Curso item in listaCursos)
206				{
207					if (!cursos.Contains(item.nombre))
208					{
209						if (i % 2 == 0)
210							cursos += item.nombre + " <br />";
211						else
212							cursos += item.nombre + " - ";
213						i++;
214					}
215				}
216				lblCursosAsignados.Text = cursos;
217			}
218			if (HttpContext.Current.User.IsInRole(enumRoles.Tutor.ToString()))
219			{
220				List<Tutor> lista = new List<Tutor>();
221				lista.Add(new Tutor() { username = HttpContext.Current.User.Identity.Name });
222				BLAlumno objBLAlumno = new BLAlumno(new Alumno() { listaTutores = lista });
223				List<AlumnoCursoCicloLectivo> listaAlumnos = objBLAlumno.GetAlumnosTutor(cicloLectivoActual);
224				string cursos = string.Empty;
225				if (listaAlumnos.Count > 0) cursos = "Cursos: \n";
226				foreach (AlumnoCursoCicloLectivo item in listaAlumnos)
227				{
228					if (!cursos.Contains(item.cursoCicloLectivo.curso.nivel.nombre + "  " + item.cursoCicloLectivo.curso.nombre))
229					{
230						cursos += item.cursoCicloLectivo.curso.nivel.nombre + "  " + item.cursoCicloLectivo.curso.nombre + " \n";
231					}
232				}
233				lblCursosAsignados.Text = cursos;
234			}
235		}
236
237		/// <summary>
238		/// Handles the Click event of the btnMensaje control.
239		/// </summary>
240		/// <param name="sender">The source of the event.</param>
241		/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
242		protected void btnMensaje_Click(object sender, EventArgs e)
243		{
244			try
245			{
246				StringWriter sr = new StringWriter();
247				HtmlTextWriter htm = new HtmlTextWriter(sr);
248
249				((ImageButton)Page.Master.FindControl("HeadLoginView").FindControl("btnMensaje")).Visible = false;
250				((ImageButton)Page.Master.FindControl("HeadLoginView").FindControl("btnMensaje")).RenderControl(htm);
251				htm.Flush();
252				Response.Redirect("~/Private/Mensajes/MsjeEntrada.aspx", false);
253			}
254			catch (Exception ex)
255			{
256				ManageExceptions(ex);
257			}
258		}
259
260		/// <summary>
261		/// Handles the Click event of the btnLogout control.
262		/// </summary>
263		/// <param name="sender">The source of the event.</param>
264		/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
265		protected void btnLogout_Click(object sender, EventArgs e)
266		{
267			try
268			{
269				UIUtilidades.EliminarArchivosSession(Session.SessionID);
270				Response.Cookies.Clear();
271				Session.Abandon();
272				//HttpContext.Current = null;
273				ObjSessionDataUI = null;
274				objSessionPersona = null;
275				FormsAuthentication.SignOut();
276				Response.Redirect("~/Login.aspx", false);
277			}
278			catch (Exception ex)
279			{
280				ManageExceptions(ex);
281			}
282		}
283
284		/// <summary>
285		/// Método que cierra la sesión del usuario logueado.
286		/// </summary>
287		/// <param name="sender"></param>
288		/// <param name="e"></param>
289		protected void HeadLoginStatus_LoggingOut(object sender, LoginCancelEventArgs e)
290		{
291			try
292			{
293				UIUtilidades.EliminarArchivosSession(Session.SessionID);
294				LoginStatus control = ((LoginStatus)Page.Master.FindControl("HeadLoginView").FindControl("HeadLoginStatus"));
295				control.LogoutPageUrl = "~/Login.aspx";
296				control.LogoutAction = LogoutAction.RedirectToLoginPage;
297				Response.Cookies.Clear();
298				//HttpContext.Current.User = null;
299				Session.Abandon();
300				FormsAuthentication.SignOut();
301			}
302			catch (Exception ex)
303			{
304				ManageExceptions(ex);
305			}
306		}
307
308		/// <summary>
309		/// Handles the PreRender event of the siteMapPathEDUAR control.
310		/// </summary>
311		/// <param name="sender">The source of the event.</param>
312		/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
313		protected void NavigationMenu_PreRender(object sender, EventArgs e)
314		{
315			//SiteMapNodeItem sepItem = new SiteMapNodeItem(-1, SiteMapNodeItemType.PathSeparator);
316			//ITemplate sepTemplate = NavigationMenu.TemplateControl;
317			//if (sepTemplate == null)
318			//{
319			//    Literal separator = new Literal { Text = siteMapPathEDUAR.PathSeparator };
320			//    sepItem.Controls.Add(separator);
321			//}
322			//else
323			//    sepTemplate.InstantiateIn(sepItem);
324
325			//sepItem.ApplyStyle(siteMapPathEDUAR.PathSeparatorStyle);
326
327			if (SiteMapEDUAR.Provider.RootNode != null)
328			{
329				foreach (SiteMapNode node in SiteMapEDUAR.Provider.RootNode.ChildNodes)
330				{
331					if (!ValidarNodo(node))
332						continue;
333					trvMenu.Visible = true;
334					MenuItem objMenuItem = new MenuItem(node.Title);
335					if (node.Url != string.Empty)
336						objMenuItem.NavigateUrl = node.Url;
337
338					//Recorre los nodos hijos
339					foreach (SiteMapNode nodeChild in node.ChildNodes)
340					{
341						if (!ValidarNodo(nodeChild))
342							continue;
343
344						MenuItem objMenuItemChild = new MenuItem(nodeChild.Title) { NavigateUrl = nodeChild.Url };
345						objMenuItem.ChildItems.Add(objMenuItemChild);
346					}
347					if (objMenuItem.ChildItems.Count > 0 || objMenuItem.Text.Contains("Inicio"))
348						NavigationMenu.Items.Add(objMenuItem);
349				}
350			}
351		}
352
353		/// <summary>
354		/// Valida si el nodo se debe mostrar. 
355		/// Puede tener el atributo visible=false o puede que el perfil del usuario lo permita.
356		/// </summary>
357		/// <param name="node"></param>
358		/// <returns></returns>
359		protected Boolean ValidarNodo(SiteMapNode node)
360		{
361			//Si el nodo está marcado como visible False es porque solo se utiliza para que sea visible 
362			//en el menu superior y no se debe mostrar en el menu lateral
363			Boolean isVisible;
364			if (bool.TryParse(node["visible"], out isVisible) && !isVisible)
365				return false;
366
367			foreach (DTRol rolUsuario in ObjSessionDataUI.ObjDTUsuario.ListaRoles)
368			{
369				if (node.Roles.Contains(rolUsuario.Nombre))
370					return true;
371			}
372			return false;
373		}
374
375		/// <summary>
376		/// Click en botón aceptar de ventana de información / confirmación / error
377		/// </summary>
378		/// <param name="sender"></param>
379		/// <param name="e"></param>
380		void Aceptar(object sender, EventArgs e)
381		{
382			if (!EsExepcion)
383				OnBotonClickAviso(BotonAvisoAceptar, e);
384		}
385
386		/// <summary>
387		/// Click en botón Cancelar de ventana de información / confirmación / error
388		/// </summary>
389		/// <param name="sender"></param>
390		/// <param name="e"></param>
391		void Cancelar(object sender, EventArgs e)
392		{
393			if (!EsExepcion)
394				OnBotonClickAviso(BotonAvisoCancelar, e);
395		}
396
397		/// <summary>
398		/// Handles the OnItemBound event of the NavigationMenu control.
399		/// </summary>
400		/// <param name="sender">The source of the event.</param>
401		/// <param name="args">The <see cref="System.Web.UI.WebControls.MenuEventArgs"/> instance containing the event data.</param>
402		protected void NavigationMenu_OnItemBound(object sender, MenuEventArgs args)
403		{
404			args.Item.ImageUrl = ((SiteMapNode)args.Item.DataItem)["ImageUrl"];
405		}
406
407		#endregion
408
409		#region --[Métodos Públicos]--
410		/// <summary>
411		/// Método que permite tratar las excepciones de forma standard. 
412		/// </summary>
413		/// <param name="ex">Excepción a tratar</param>
414		public void ManageExceptions(Exception ex)
415		{
416			try
417			{
418				string exceptionName = ex.GetType().FullName;
419				string Titulo = string.Empty;
420				string Detalle = string.Empty;
421				enumTipoVentanaInformacion tipoVentana = enumTipoVentanaInformacion.Error;
422				Detalle = ex.Message;
423
424				if (exceptionName.Contains("CustomizedException"))
425				{
426					switch (((CustomizedException)ex).ExceptionType)
427					{
428						case enuExceptionType.BusinessLogicException:
429							Titulo = "Error en Negocio";
430							Detalle = "Se ha producido un error al realizar una acción en el negocio.";
431							break;
432						case enuExceptionType.SqlException:
433						case enuExceptionType.MySQLException:
434						case enuExceptionType.DataAccesException:
435							Titulo = "Error en Base de Datos";
436							Detalle = "Se ha producido un error al realizar una acción en la Base de Datos.";
437							break;
438						case enuExceptionType.ServicesException:
439							Titulo = "Error en Servicio";
440							Detalle = "Se ha producido un error al realizar la consulta al Servicio.";
441							break;
442						case enuExceptionType.IntegrityDataException:
443							Titulo = "Error de Integridad de Datos";
444							break;
445						case enuExceptionType.ConcurrencyException:
446							Titulo = "Error de Concurrencia";
447							break;
448						case enuExceptionType.ValidationException:
449							//Esta es una excepcion de tipo validacion que viene de UI.
450							Titulo = "Error de Validación";
451							tipoVentana = enumTipoVentanaInformacion.Advertencia;
452							//MostrarMensaje("Error de Validación", ex.Message, enumTipoVentanaInformacion.Advertencia);
453							break;
454						case enuExceptionType.SecurityException:
455							Titulo = "Error de seguridad";
456							tipoVentana = enumTipoVentanaInformacion.Advertencia;
457							break;
458						case enuExceptionType.WorkFlowException:
459							break;
460						case enuExceptionType.Exception:
461							Titulo = "Error en la Aplicación";
462							Detalle = "Se ha producido un error interno en la aplicación.";
463							break;
464						default:
465							break;
466					}
467					if (Detalle != ex.Message) Detalle += " " + ex.Message;
468					//Detalle += " " + ex.Message;
469					MostrarMensaje(Titulo, Detalle, tipoVentana);
470					if (tipoVentana != enumTipoVentanaInformacion.Advertencia)
471						ManageExceptionsLog(ex);
472				}
473				//Esta es una excepcion de tipo validacion que viene de BL.
474				else if ((exceptionName.Contains("GenericException")))
475				{
476					///GenericException genericEx = ((GenericException)ex).Detail;
477					if (((CustomizedException)ex).ExceptionType == enuExceptionType.ValidationException)
478						MostrarMensaje("Error de Validación", ex.Message, enumTipoVentanaInformacion.Advertencia);
479					else
480						ventanaInfoMaster.GestionExcepciones(ex);
481				}
482				else
483					ventanaInfoMaster.GestionExcepciones(ex);
484
485				// Refrescar updatepanel
486				updVentaneMensajes.Update();
487				EsExepcion = true;
488			}
489			catch (Exception exNew)
490			{
491				ventanaInfoMaster.GestionExcepciones(exNew);
492			}
493		}
494
495		/// <summary>
496		/// Método que guardar un log
497		/// </summary>
498		/// <param name="exepcionControlada">Excepcion que se va a guardar</param>
499		public void ManageExceptionsLog(Exception exepcionControlada)
500		{
501			try
502			{
503				ventanaInfoMaster.GestionExcepcionesLog(exepcionControlada);
504			}
505			catch (Exception ex)
506			{
507				ManageExceptions(ex);
508			}
509		}
510
511		/// <summary>
512		/// Metodo que se encarga de mostrar mensajes en la aplicacion.
513		/// </summary>
514		/// <param name="titulo"></param>
515		/// <param name="detalle"></param>
516		/// <param name="tipoventana"></param>
517		public void MostrarMensaje(string titulo, string detalle, enumTipoVentanaInformacion tipoventana)
518		{
519			try
520			{
521				EsExepcion = false;
522				ventanaInfoMaster.TipoVentana = tipoventana;
523				ventanaInfoMaster.Titulo = titulo;
524				ventanaInfoMaster.Detalle = detalle;
525				ventanaInfoMaster.MostrarMensaje();
526
527				// Refrescar updatepanel
528				updVentaneMensajes.Update();
529
530			}
531			catch (Exception ex)
532			{
533				ManageExceptions(ex);
534			}
535		}
536
537		/// <summary>
538		/// Metodo que se encarga de ocultar los mensajes en la aplicacion.
539		/// </summary>
540		public void OcultarMensaje()
541		{
542			try
543			{
544				ventanaInfoMaster.OcultarMensaje();
545				// Refrescar updatepanel
546				updVentaneMensajes.Update();
547
548			}
549			catch (Exception ex)
550			{
551				ManageExceptions(ex);
552			}
553		}
554
555		/// <summary>
556		/// Procesa un evento de devolución de llamada que tiene como destino un control.
557		/// </summary>
558		/// <param name="eventArgument">Cadena que representa un argumento del evento que se pasará al controlador de eventos.</param>
559		public void RaiseCallbackEvent(string eventArgument)
560		{
561			if (!Page.Request.Url.ToString().Contains("MsjeEntrada"))
562			{
563				StringWriter sr = new StringWriter();
564				HtmlTextWriter htm = new HtmlTextWriter(sr);
565				//HyperLink link = ((HyperLink)Page.Master.FindControl("HeadLoginView").FindControl("lnkMensajes"));
566				ImageButton boton = ((ImageButton)Page.Master.FindControl("HeadLoginView").FindControl("btnMensaje"));
567				if (HttpContext.Current.User != null)
568				{
569					BLMensaje objBLMensaje = new BLMensaje();
570					List<Mensaje> objMensajes = new List<Mensaje>();
571					objMensajes = objBLMensaje.GetMensajes(new Mensaje() { destinatario = new Persona() { username = ObjSessionDataUI.ObjDTUsuario.Nombre }, activo = true });
572					objMensajes = objMensajes.FindAll(p => p.leido == false);
573					if (boton != null)
574					{
575						boton.Visible = true;
576						if (objMensajes.Count > 0)
577						{
578							boton.ImageUrl = "/EDUAR_UI/Images/mail-new-message.gif";
579							//link.AlternateText = "Nuevo Mensaje!";
580							boton.ToolTip = "Nuevo Mensaje!";
581						}
582						else
583						{
584							boton.ImageUrl = "/EDUAR_UI/Images/mail-inbox.png";
585							//btnMail.AlternateText = "Mensajes";
586							boton.ToolTip = "Mensajes";
587						}
588						//boton.NavigateUrl = "Private/Mensajes/MsjeEntrada.aspx";
589						boton.RenderControl(htm);
590						htm.Flush();
591						//htm = new HtmlTextWriter(sr);
592						//boton.RenderControl(htm);
593						//htm.Flush();
594					}
595				}
596				else
597				{
598					boton.ImageUrl = "";
599					boton.Visible = false;
600					boton.RenderControl(htm);
601					htm.Flush();
602				}
603				_callbackResult = sr.ToString();
604			}
605		}
606
607		/// <summary>
608		/// Devuelve los resultados de un evento de devolución de llamada que tiene como destino un control.
609		/// </summary>
610		/// <returns>
611		/// Resultado de la devolución de llamada.
612		/// </returns>
613		public string GetCallbackResult()
614		{
615			//  ésta variable es pasada al argumento de putCallbackResult
616			return _callbackResult;
617		}
618		#endregion
619
620		#region --[Métodos Privados]--
621		/// <summary>
622		/// Cargars the menu.
623		/// </summary>
624		private void CargarMenu()
625		{
626			if (SiteMapEDUAR.Provider.RootNode != null)
627			{
628				foreach (SiteMapNode node in SiteMapEDUAR.Provider.RootNode.ChildNodes)
629				{
630					if (!ValidarNodo(node))
631						continue;
632					trvMenu.Visible = true;
633					TreeNode objTreeNode = new TreeNode(node.Title);
634					if (node.Url != string.Empty)
635						objTreeNode.NavigateUrl = node.Url;
636
637					objTreeNode.SelectAction = TreeNodeSelectAction.Expand;
638					//Recorre los nodos hijos
639					foreach (SiteMapNode nodeChild in node.ChildNodes)
640					{
641						if (!ValidarNodo(nodeChild))
642							continue;
643
644						TreeNode objTreeNodeChild = new TreeNode(nodeChild.Title) { NavigateUrl = nodeChild.Url };
645						objTreeNode.ChildNodes.Add(objTreeNodeChild);
646					}
647					if (objTreeNode.ChildNodes.Count > 0 || objTreeNode.Text.Contains("Inicio"))
648						trvMenu.Nodes.Add(objTreeNode);
649				}
650				trvMenu.ExpandAll();
651			}
652		}
653
654		#endregion
655
656		#region --[Delegados]--
657		/// <summary>
658		/// Delegado para capturar el evento de click sobre aceptar / cancelar en ventana de aviso
659		/// </summary>
660		/// <param name="sender"></param>
661		/// <param name="e"></param>
662		public delegate void MasterPageAvisoClickHandler(object sender, EventArgs e);
663
664		/// <summary>
665		/// Evento click sobre botón aceptar de ventana de aviso
666		/// </summary>
667		public event MasterPageAvisoClickHandler BotonAvisoAceptar;
668
669		/// <summary>
670		/// Evento click sobre botón cancelar de ventana de aviso
671		/// </summary>
672		public event MasterPageAvisoClickHandler BotonAvisoCancelar;
673
674		/// <summary>
675		/// Invoca los delegados al evento de click al botón, para que los eventos de
676		/// aceptar / cancelar puedan ser controlados desde las páginas "hijas" al masterpage
677		/// </summary>
678		/// <param name="sender"></param>
679		/// <param name="e">Argumentos del evento</param>
680		protected virtual void OnBotonClickAviso(MasterPageAvisoClickHandler sender, EventArgs e)
681		{
682			if (sender != null)
683			{
684				//Invoca los delegados
685				sender(this, e);
686			}
687		}
688
689		#endregion
690	}
691}