﻿/// <reference name="MicrosoftAjax.js"/>
///<reference path="comun.js">

/***********************************************************************************************************
//En este archivo se definirán las funciones y objetos necesarios para dar mayor funcionalidad a javascript.
//en la gestión de eventos y capas.
************************************************************************************************************/

document.Elementos=new Array;
//Funciones para obtener los distintos Elementos que están contenidos en un placeHolder
document.getAspElementIdFromParent=function(idElement,IdparentElement)
{
    //no cacheamos los elementos debido a que en ocasiones cambia la variable
    if ((document.Elementos[idElement])&&(document.Elementos[idElement]!=null))
    {
        //comprobamos si el elemento tiene un nodo padre, 
        //si no es así deberemos de volver a ejecutar las funciones de búsqueda
        //y cacheo del elemento. En ocasiones se puede perder el elemento en un postback de Ajax
        if (document.Elementos[idElement].parentNode)
            return document.Elementos[idElement];
    }
    

    var rg=null;
    if (IdparentElement)
        rg=new RegExp("\\b\\w*" +IdparentElement+"\\w*" +idElement+"\\b","ig");
    else
        return document.getElementById(idElement);

    var sHTML=document.forms[0].innerHTML;
    var rgResult=sHTML.match(rg);
    var aspElement=null;
    if (rgResult)
    {
        aspElement=document.getElementById(rgResult[0]);
    }
    
    document.Elementos[idElement]=aspElement;
    return aspElement;
}

document.getAspElementById=function (idElement)
{
    var aspElement=document.getAspElementIdFromParent(idElement,"cphDatos");
    
    
    if (aspElement) //Buscamos en el content cphDatos
    {
        return aspElement;
    }
    else
    {
        
        aspElement=document.getAspElementIdFromParent(idElement)
        //if (aspElement)//buscamos el elemento con el nombre específico
            return aspElement;
        //else
          //  return document.getAspElementIdFromParent(idElement);
    }
} 

document.getAspElementsNameFromParent=function(idElement,IdparentElement)
{
    var rg=null;
            
    if (IdparentElement)
        rg=new RegExp("\\b\\w*\\$\\w*" +IdparentElement+"\\w*\\$\\w*" +idElement+"\\b","ig");
    else
        return document.getElementById(idElement);
        
    var sHTML=document.forms[0].innerHTML;
    
    var rgResult=sHTML.match(rg);
    var aspElement=null;
    if (rgResult)
    {
        aspElement=document.getElementsByName(rgResult[0]);
        
    }
    return aspElement;
}

document.getAspElementsByName=function (idElement)
{
    var aspElement=document.getAspElementsNameFromParent(idElement,"cphDatos");
    
    if (aspElement) //Buscamos en el content cphDatos
    {
        return aspElement;
    }
    else
    {
        aspElement=document.getElementsByName(idElement)
        if (aspElement)//buscamos el elemento con el nombre específico
            return aspElement;
        else
            return document.getAspElementsNameFromParent(idElement);
    }
}

//funciones con las que se pueden agregar eventos a los distintos objetos.
//document.eventos.Agregar(nombreObjeto)
function Eventos()
{

    this.Agregar=function(objeto, nombreEvento, funcion)
    {
            if (window.addEventListener)
            {
	            objeto.addEventListener(nombreEvento, funcion,false)
            }else
            {
                objeto.attachEvent(nombreEvento, funcion)
            }
    }
    
    this.Eliminar=function (objeto, nombreEvento,funcion)
    {
        if (window.addEventListener)
        {
            objeto.removeEventListener(nombreEvento, funcion,false)
        }else
        {
            objeto.detachEvent(nombreEvento, funcion)
        }
    }
    
    this.EjecutarAsp=function(nombreObjeto, evento)
    {
       //try
       //{
       
       var obj=document.getAspElementById(nombreObjeto);
       if (obj)
       {
           var idObj=obj.id;
           var expresion=new RegExp("_","ig");//para cambiar las _ por $
           var expresion2=new RegExp("^\\$"); //para cambiar la primera $ por _
           idPostBack=idObj.replace(expresion,"$").replace(expresion2,"_");
           __doPostBack(idPostBack,evento);
       }
       //}catch(ex)
       //{
        
       //}
    }
}

document.eventos=new Eventos();
//window.setTimeout("document.eventos.EjecutarAsp('lnkInsertar','');",1000);


//funciones para Establecer el posicionamiento de las capas.
//document.capas.Agregar()
function EstablecerCapas()
{
    if (document.capas)
        document.capas.EstablecerPosicion();
}

var capas=new Array();
function GestorCapasPrincipales(idImgReferencia)
{  
    this.capas=new Array();
    this.idImgReferencia=idImgReferencia;
    this.imgReferencia=null;//=document.getAspElementById(this.idImgReferencia);
    document.eventos.Agregar(window,"onfocus",EstablecerCapas);
    document.eventos.Agregar(window,"onresize",EstablecerCapas);
}



GestorCapasPrincipales.prototype.Capa=function(idCapa,posicionX,posicionY,gestorCapas)
{
    this.id=idCapa;
    this.object=document.getAspElementById(idCapa);
    if (this.object)
    {
        
        this.object.style.position="absolute";
        this.object.style.zIndex="145";
        this.posX=posicionX;
        this.posY=posicionY;
        this.gestorCapas=gestorCapas;
    }
    function PosicionarCapa()
    {
        //P7_Snap(this.gestorCapas.idImgReferencia,this.id,this.posX,this.posY);
        if (!this.gestorCapas.imgReferencia)
            this.gestorCapas.imgReferencia=document.getAspElementById(this.gestorCapas.idImgReferencia);
        
        P7_Snap(this.gestorCapas.imgReferencia.id,this.object.id,this.posX,this.posY);
    }
    if (this.object)
    {
        this.Posicionar=PosicionarCapa;
        this.Posicionar();
    }else
    {
        this.object=null;
    }
}

GestorCapasPrincipales.prototype.capas=new Array();
GestorCapasPrincipales.prototype.Agregar=function(idCapa, posicionX, posicionY)
{
    //this.capas=new Array;
    
    var capa=new this.Capa(idCapa,posicionX,posicionY,this);
    if (capa.object)
        this.capas.push(capa);         
}
GestorCapasPrincipales.prototype.Obtener=function(idCapa)
{
    var i=0;
    while (this.capas[i])
    {
        if (this.capas[i].id==idCapa)
            return this.capas[i]
    }
    return null;
    
}
    
GestorCapasPrincipales.prototype.EstablecerPosicion=function()
{
    var i=0;
    for (i=0;i<this.capas.length;i++)
    {
        this.capas[i].Posicionar();
    }
    
}

document.capas=new GestorCapasPrincipales("imgReferencia");

document.PosicionRaton=function(ev){
	if(ev.pageX || ev.pageY){
		return {x:ev.pageX, y:ev.pageY};
	}
	return {
		x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
		y:ev.clientY + document.body.scrollTop  - document.body.clientTop
	};
}
document.PosicionObjeto=function(e){
	    var left = 0;
	    var top  = 0;

	    while (e.offsetParent){
		    left += e.offsetLeft;
		    top  += e.offsetTop;
		    e     = e.offsetParent;
	    }

	    left += e.offsetLeft;
	    top  += e.offsetTop;

	    return {x:left, y:top};
    }

document.PosicionObjetoRelativa=function (target, ev){
	    ev = ev || window.event;

	    var docPos    = document.PosicionObjeto(target);
	    var mousePos  = document.PosicionRaton(ev);
	    return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
    }

    
//funciones para el desplazamiento de capas
var objDesplazable  = null;
var posRelativa = null;
function Efectos()
{
    
    this._desplazando=function(ev){
	    ev           = ev || window.event;
	    var mousePos = document.PosicionRaton(ev);
	    if(objDesplazable){
		    objDesplazable.style.position = 'absolute';
		    
		    var posY=mousePos.y - posRelativa.y;
		    var posX=mousePos.x - posRelativa.x;
		    var top=parseInt(posY+ objDesplazable.clientHeight);
		    var left=parseInt(posX+ objDesplazable.clientWidth)
		    if  (top>parseInt(document.body.clientHeight)-2)
		        posY=parseInt(document.body.clientHeight)-objDesplazable.clientHeight-2;
		    if  (left>parseInt(document.body.clientWidth)-2)
		        posX=parseInt(document.body.clientWidth)-objDesplazable.clientWidth-2;
            if (posX<0)
	            posX=0;
		    if (posY<0)
		        posY=0;
		    /*if  (posY>parseInt(document.documentElement.clientHeight))
		        return false;
	        if (posX<0)
	            posX=0;*/
		    /*if  (posY>parseInt(document.documentElement.clientHeight))
		        return false;
		        
		    if  (posX>parseInt(document.documentElement.clientWidth))
		        return false;*/
		    
		        objDesplazable.style.top      =posY;
		    
		        objDesplazable.style.left     =posX;

		    return false;
	    }
    }
    this._finDesplazamiento=function(){
        if ((objDesplazable) && (objDesplazable.alpha))
            objDesplazable.style.filter = ' ';
	    objDesplazable = null;
	    
    }

    this.CrearElementoDesplazable=function(obj,mostrarTransparencia){
	    if(!obj) return;
	    //añadimos los eventos a la página
	    document.eventos.Agregar(document,"onmousemove",this._desplazando);
	    document.eventos.Agregar(document,"onmouseup",this._finDesplazamiento);
	    
	    if (mostrarTransparencia==false)
	        obj.alpha=false;
	    else
	        obj.alpha=true;
	    obj.onmousedown = function(ev){
		    objDesplazable  = this;
		    if (objDesplazable.alpha)
	            objDesplazable.style.filter = 'alpha(opacity='+60+')';
		    posRelativa = document.PosicionObjetoRelativa(this, ev);
		    
		    return false;
	    }
	}
	
	this.CrearVentanaDesplazable=function(objVentana,objTituloVentana,mostrarTransparencia,objDesplazamiento){
	    if(!objVentana) return;
	    if(!objTituloVentana) return;
	    
	    //añadimos los eventos a la página
	    	    
	    if (!objDesplazamiento)
	    {
	        objDesplazamiento=document;
	    }
	    
	    document.eventos.Agregar(objDesplazamiento,"onmousemove",this._desplazando);
	    document.eventos.Agregar(objDesplazamiento,"onmouseup",this._finDesplazamiento);
	    

	    objTituloVentana.ventana=objVentana;
	    if (mostrarTransparencia==false)
	        objTituloVentana.ventana.alpha=false;
	    else
	        objTituloVentana.ventana.alpha=true;
	        
	        
	    objTituloVentana.onmousedown = function(ev){
	        objDesplazable  = this.ventana;
	        if (objDesplazable.alpha)
	            objDesplazable.style.filter = 'alpha(opacity='+60+')';
	        //comprobamos si la ventana no se sale de margen.
	        posRelativa = document.PosicionObjetoRelativa(this, ev);
	        return false;
	    }
		
    }

}

document.efectos=new Efectos()

//En esta clase se añadirán funciones que optimicen las operaciones con los componentes de Ajax
function Ajax()
{
    this.ObtenerComponente=function(idElement,idExtender){
    
        /*
        var element=document.getAspElementById(idElement);
        if (element===null)
            return null;
            
        if (idExtender)
            return Sys.Application.findComponent(element.id +"$"+idExtender)
        else
            return Sys.Application.findComponent(element.id) */
        var c = Sys.Application.getComponents();
        var s = "";
        for (var i=0; i<c.length; i++) {
            var id = c[i].get_id().toLowerCase();
            
            if (id.indexOf(idElement.toLowerCase())>=0)
            {
                if (idExtender)
                    if (id.indexOf(idExtender.toLowerCase())>=0)
                    {
                        return c[i];
                    }
                else
                    return c[i];
            
            }
        }
        return;
    }
    
    this.ListadoComponentes=function() {
        var c = Sys.Application.getComponents();
        var s = "";
        for (var i=0; i<c.length; i++) {
            var id = c[i].get_id();
            var type = Object.getType(c[i]).getName();
            s += 'Item ' + i + ': id=' + id + ', type=' + type + '.<br />';
        }
        alert(s);
    }   
    
    
    this.extensiones=new Object();
    this.extensiones.tabPanel=new Object();
    //this.extensions.tabPanel._setTabStateInt=new Array();
    this.extensiones.tabPanel.SetTabsState=function(tbcClientId,activeTabIndex)
    {
        var numArgs=2;
        
        if(arguments.length<=1)
        {
            return;
        }
        
        var tabContainer=$find(tbcClientId);
        
        if (tabContainer!=null)
        {
                tabContainer.set_activeTabIndex(activeTabIndex);
        
                var tabs=tabContainer.get_tabs();
                if (tabs.length!=arguments.length-numArgs)
                {
                    throw new Error("Error: no se puede establecer el estado de las pestañas.")
                    return;
                }
                
                var i=0;
                while (i<tabs.length)
                {
                    tabs[i].set_enabled(arguments[i+numArgs]);
                    i++;
                }
                
        }else
        {
            var strArgs=""
            var i=numArgs;
            while(i<arguments.length)
            {
                strArgs += arguments[i] + ","
                i++;
            }
            if (strArgs!="")            
                strArgs=strArgs.substring(0,strArgs.length-1)
            window.setTimeout("document.ajax.extensiones.tabPanel.SetTabsState('"+ tbcClientId +"',"+ activeTabIndex +"," + strArgs +");",500);
         
        }
    }
    
    
    
    
        this.extensiones.calendar=new Object();
        this.extensiones.calendar.abiertos=new Array()
        this.extensiones.calendar.PosicionarEncima=function(idCalendar,zIndex)
        {
            var calendar=document.ajax.ObtenerComponente(idCalendar,"PopupBehavior");
            var parent=calendar._popupDiv.parentElement;
            this.abiertos.unshift(calendar);
            parent.style.position="absolute";
            if (!zIndex)
                zIndex=10000;                
            parent.style.zIndex=zIndex;
            document.body.insertBefore(parent,document.body.lastChild);
        }
        
        this.extensiones.calendar.Ocultar=function(idCalendar)
        {
            var calendar=document.ajax.ObtenerComponente(idCalendar,"PopupBehavior")
            if(calendar)
                calendar.hide();
        }
        
        this.extensiones.calendar.OcultarTodosCalendarios=function()
        {
               var c = Sys.Application.getComponents();
                var s = "";
                var idElement="PopupBehavior";
                
                for (var i=0; i<c.length; i++) {
                    var id = c[i].get_id().toLowerCase();
                    if (id.indexOf(idElement.toLowerCase())>=0)
                    {
                        document.ajax.extensiones.calendar.Ocultar(id);
                    }
                }
        }
        
        this.extensiones.calendar.AlMostrarCalendario=function(sender,e)
        {
            document.ajax.extensiones.calendar.PosicionarEncima(sender.get_id());
        }
        
        this.extensiones.calendar.AlOcultarWindowPanelContenedor=function(sender,e)
        {
            document.ajax.extensiones.calendar.OcultarTodosCalendarios();
        }

        this.extensiones.linkButton = new Object();
        this.extensiones.linkButton.OnceClick = function(sender, validado) {
            if (!sender)
                return false;

            if (sender.noClick)
                return false;
            if (validado != null) {
                if (validado) {
                    sender.style.visibility = "hidden";
                    sender.noClick = true;
                    return true;
                }
            }
            else {
                sender.style.visibility = "hidden";
                sender.noClick = true;
                return true;
            }

            return false;
        }

        
        /*PageRequestManagerEx es un objeto que extiende la funcionalidad de los UpdatePanel para que 
        se puedan producir varios postback a la vez. Si esto ocurre, se introducen las llamadas en una cola
        que se van ejecutando según se vayan resolviendo las anteriores.
        Con esto nos evitamos el error que se produce al intentar ejecutar una acción cuando se está cargando 
        aún la anterior.
        
        Información extraída de la página:
        //http://geekswithblogs.net/rashid/archive/2007/08/08/Asp.net-Ajax-UpdatePanel-Simultaneous-Update---A-Remedy.aspx
        */
        
        var PageRequestManagerEx =
        {
            _initialized : false,

            init : function()
            {
                if (!PageRequestManagerEx._initialized)
                {
                    var _callQueue = new Array();
                    var _executingElement = null;
                    var _prm = Sys.WebForms.PageRequestManager.getInstance();

                    _prm.add_initializeRequest(initializeRequest);
                    _prm.add_endRequest(endRequest);

                    PageRequestManagerEx._initialized = true;
                }

                function initializeRequest(sender, args)
                {
                    document.body.style.cursor = "progress";
                    if (_prm.get_isInAsyncPostBack())
                    {
                        //if we are here that means there already a call pending.

                        //Get the element which cause the postback
                        var postBackElement = args.get_postBackElement();

                        //We need to check this otherwise it will abort the request which we made from the
                        //end request
                        if (_executingElement != postBackElement)
                        {
                            //Does not match which means it is another control
                            //which request the update, so cancel it temporary and 
                            //add it in the call queue
                            args.set_cancel(true);
                            Array.enqueue(_callQueue, postBackElement);
                        }

                        //Reset it as we are done with our matching
                        _executingElement = null;
                    }
                }

                function endRequest(sender, args)
                {
                    document.body.style.cursor = "default";
                    //Establecemos la nueva visita en El Google Analytics /js/comun.js
                    LanzaEventoGoogleAnalyticsByAjax();
                    //Check if we have a pending call
                    if (_callQueue.length > 0)
                    {
                        //Get the first item from the call queue and setting it
                        //as current executing item
                        _executingElement = Array.dequeue(_callQueue);

                        //Now Post the from which will also fire the initializeRequest
                        _prm._doPostBack(_executingElement.id, '');
                    }
                }
            }
        }

        if (typeof(Sys) != 'undefined')
        {
            Sys.Application.notifyScriptLoaded();
        }
        
        this.extensiones.PageRequestManagerEx= PageRequestManagerEx;
        //Ejecutaremos el Init al iniciar la página.
        document.eventos.Agregar(window,"onload",this.extensiones.PageRequestManagerEx.init);
        
   
}

document.ajax=new Ajax();


