// *************************************************************************** // Libreria de scripts de Javascript // Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla // Fichero: menucontextual.js // Este fichero implementa las funciones javascript de la clase MenuContextual // *************************************************************************** var ctx_grissistema="#d4d0c8" var ctx_azulmarino="#0a266a"; var ctx_blanco="#ffffff"; var ctx_negro="#000000"; var ctx_grissombra="#808080"; var gmenuctx=new Array(); // Guarda el último menu flotante var idxmnu=0 // Indice de los menus flotantes var currentItem=null; var currentPadresubmenu; var currentPadreY; var ClickX=null // Coordenada x del evento click del boton derecho var ClickY=null // Coordenada y del evento click del boton derecho var botonraton=null; //____________________________________________________________________________ // // Esta función muestra un menu contextual // Parámetros: // - x: Coordenada x de referencia // - y: Coordenada y de referencia // - menuctx: Objeto DIV contenedor del menu contextual //____________________________________________________________________________ function muestra_contextual(x,y,menuctx){ var margen=0 var dpzx=16 var dpzy=16 var wtop=calculatop_ctx(y,dpzy,margen,menuctx) // Calcula posición del menu contextual var wleft=calculaleft_ctx(x,dpzx,margen,menuctx) var ftop=wtop+parseInt(document.body.scrollTop) // Tiene en cuenta el scrolling var fleft=wleft+parseInt(document.body.scrollLeft) menuctx.style.top=ftop menuctx.style.left=fleft menuctx.style.visibility="visible" menuctxSetSelectedIndex(menuctx,-1) // Coloca el nuevo indice gmenuctx[idxmnu++]=menuctx; } //____________________________________________________________________________ // // Calcula coordenada top para el menu contextual que se mostrará. // Parametros: // - oriy : Coordenada Y del objeto que provoca el evento // - dpzy : Desplazamiento sobre el eje y // - margen : Margen para que el menu aparezca un poco separado del ese objeto // - menuctx: El menu (objeto DIV) que se mostrará //____________________________________________________________________________ function calculatop_ctx(oriy,dpzy,margen,menuctx){ // Calcula Y del menu contextual var largodiv=parseInt(menuctx.offsetHeight); var wtop=oriy+dpzy+margen if (wtop+largodiv>parseInt(document.body.clientHeight)){ var nwtop=oriy-dpzy-margen-largodiv if (nwtop>0) wtop=nwtop } return(wtop) } //____________________________________________________________________________ // // Calcula coordenada left para el menu contextual que se mostrará. // Parametros: // - orix : Coordenada X del objeto que provoca el evento // - dpzx : Desplazamiento sobre el eje x // - margen : Margen para que el menu aparezca un poco separado del ese objeto // - menuctx: El menu (objeto DIV) que se mostrará //____________________________________________________________________________ function calculaleft_ctx(orix,dpzx,margen,menuctx){ // Calcula Y del menu contextual var anchodiv=parseInt(menuctx.offsetWidth) var wleft=orix+dpzx+margen var maximodpl=parseInt(document.body.clientWidth) if (wleft+anchodiv>maximodpl){ // Si no cabe a la derecha var nwleft=orix-dpzx-margen-anchodiv // lo intenta a la izda. if (nwleft>0) wleft=nwleft else{ wleft=maximodpl-dpzx-margen-anchodiv; if(wleft // Parametros: // - o: El objeto //____________________________________________________________________________ function contextual(o){ while(o.tagName!="DIV") o=o.parentNode return(o) } //____________________________________________________________________________ // // Esta función devuelve el objeto apuntado por el indice // Parametros: // - o: El objeto TR // - idx: el indice del item, si es nulo se devuelve el item(objeto TR), seleccionado //____________________________________________________________________________ function menuctxSelectedItem(o,idx){ var oDIV=contextual(o); // Se asegura que el objeto de inicio es DIV var oTABLE=oDIV.childNodes[0]; // objeto TABLE var oINPUT=oDIV.childNodes[1]; // objeto INPUT var oTBODY=oTABLE.getElementsByTagName('TBODY')[0]; if(idx==null) // No se especificó indice, devuelve el item seleccionado idx=oINPUT.getAttribute("value"); var oTRS=oTBODY.getElementsByTagName('TR'); for (var i=0;i0){ // Si existía item anterior seleccionado desmarcar_item(oDIV,idx) // Desmarca item anterior } marcar_item(o); // Marca el actual item currentItem=o; } } //____________________________________________________________________________ // // Hace resaltar el item del menu contextual donde se coloca el cursor. // Si este item tuviese un submenu contextual,éste también aparecería. // Además, inicializa el campo oculto de cada DIV donde se guarda el índice // del item selecionado. // // Parametros: // - item: El objeto //____________________________________________________________________________ function marcar_item(item){ marca_desmarca(item,true) // Marca el item if (item.getAttribute("name")!=""){ // Existe submenu contextual currentPadresubmenu=item currentPadreY=ClickY setTimeout ("muestra_submenu();", 300); } menuctxSetSelectedIndex(contextual(item),item.getAttribute("id")); // Coloca el nuevo indice } //____________________________________________________________________________ // // Quita el resalte de un item y oculta los posibles submenus que tuviera // Parametros: // -o : El objeto DIV que contiene el menu contextual // - idx: el indice del item, si es nulo desmarca el item(objeto TR), seleccionado //____________________________________________________________________________ function desmarcar_item(o,idx){ var oDIV=contextual(o) // Se asegura que el objeto de inicio es DIV if(idx==null) // No se especificó indice idx=menuctxSelectedIndex(oDIV) // Indice del Item seleccionado var item=menuctxSelectedItem(oDIV,idx) if(item==null) return // No hay item seleccionado marca_desmarca(item,false); var nomsub=item.getAttribute("name"); if (nomsub!=null &&nomsub!=""){ // Tiene submenu var submenuctx=document.getElementById(nomsub); desmarcar_item(submenuctx); // Desmarca submenu submenuctx.style.visibility="hidden"; } } //____________________________________________________________________________ // // Marca o desmarca items dependiendo del parametro sw. // Parámetros: // - o: El item (objeto TR) // Si sw=true marca, si sw=false demarca //____________________________________________________________________________ function marca_desmarca(o,sw){ if(sw){ // Marca var wfondo=ctx_azulmarino; var wcolor=ctx_blanco; } else{ // Desmarca var wfondo=ctx_grissistema; var wcolor=ctx_negro; } var i0; (MenuconImagen(contextual(o)) ? i0=2 : i0=1); var nh=o.childNodes.length; for (var i=i0;i0){ var oIMG=oIMGS[0]; if (oIMG.getAttribute("name")=="swsbfn"){ // imagen switch submenu oTD.style.backgroundColor=wfondo oTD.style.color=wcolor if (sw) oIMG.setAttribute("src","../images/flotantes/swsbfb.gif",null); else oIMG.setAttribute("src","../images/flotantes/swsbfn.gif",null); } else{ // imagen del item if (sw){ // Marcar oIMG.style.border="1px"; oIMG.style.borderStyle="outset"; } else{ // Desmarcar oIMG.style.borderStyle="none"; } } } else{ oTD.style.backgroundColor=wfondo var oSPAN=oTD.getElementsByTagName('SPAN'); if (oSPAN.length>0) oSPAN[0].style.color=wcolor } } } //____________________________________________________________________________ // // Detecta si el menu contextual tiene items con imágenes asociadas // Devuelve true en caso afirmativo y false en caso contrario. //____________________________________________________________________________ function MenuconImagen(o){ var oDIV=contextual(o); var oIMGS=oDIV.getElementsByTagName('IMG'); return(oIMGS.length>0); } //____________________________________________________________________________ function reset_contextual(x,y){ var swm=false; for (var i=0;i=origen_x && x<=origen_x+anchodiv && y>=origen_y && y<=origen_y+largodiv ) return true return(false) } //____________________________________________________________________________ // // Muestra un submenu // Parametros: // - item: El objeto padre del submenu //____________________________________________________________________________ function muestra_submenu(){ if(currentPadresubmenu==currentItem){ var objdiv=contextual(currentPadresubmenu) var menuctx=document.getElementById(currentPadresubmenu.getAttribute("name")); // Obtiene el submenu //desmarcar_item(menuctx) // Desmarca el submenu por si se ha usado anteriormente wleft=subcalculaleft_ctx(objdiv,menuctx) // La x en función del padre wtop=subcalculatop_ctx(currentPadreY,menuctx) // La y depende de la longitud del submenu menuctx.style.top=wtop menuctx.style.left=wleft menuctx.style.visibility="visible"; menuctxSetSelectedIndex(menuctx,-1) // Coloca el nuevo indice gmenuctx[idxmnu++]=menuctx; } } //____________________________________________________________________________ // // Calcula coordenada top para el submenu contextual que se mostrará. // Parametros: // - y : Coordenada Y de la pantalla donde se hizo click // - menuctx: El submenu (objeto DIV) que se mostrará //____________________________________________________________________________ function subcalculatop_ctx(y,menuctx){ // Calcula el posicionamiento (y) del DIV ( SUBmenu contextual) var dpl=0 largodiv=parseInt(menuctx.offsetHeight) var wtop=y+dpl+parseInt(document.body.scrollTop) if (parseInt(wtop+largodiv)>parseInt(document.body.clientHeight+parseInt(document.body.scrollTop))){ var nwtop=y+parseInt(document.body.scrollTop)-16-largodiv if (nwtop>0) wtop=nwtop } return(wtop) } //____________________________________________________________________________ // // Calcula coordenada left para el submenu contextual que se mostrará. // Parametros: // - padrediv : Objeto DIV padre del submenu a mostrar // - menuctx: El submenu (objeto DIV) que se mostrará //____________________________________________________________________________ function subcalculaleft_ctx(padrediv,menuctx){ // Calcula el posicionamiento (x) del DIV ( SUBmenu contextual) var anchopadrediv=parseInt(padrediv.offsetWidth) // Ancho del div padre var anchomenuctx=parseInt(menuctx.offsetWidth) // Ancho del div var leftpadrediv; // Coordenada x del div padre if(IE) leftpadrediv=padrediv.style.pixelLeft else if(NS) leftpadrediv=parseInt(padrediv.style.left) // Coordenada x del div padre var desplazamiento=leftpadrediv+anchopadrediv-4 // Desplazamiento var wleft=parseInt(desplazamiento) var maximodpl=parseInt(document.body.clientWidth)+parseInt(document.body.scrollLeft) if (wleft+anchomenuctx>maximodpl){ var nwleft=leftpadrediv-anchomenuctx if (nwleft>0) wleft=nwleft else{ wleft=maximodpl-anchomenuctx; if(wleft0){ reset_contextual(ClickX,ClickY); } } //____________________________________________________________________________ // // Se ejecuta cada vez que se mueve el puntero del ratón. Se usa para capturar coordenadas //____________________________________________________________________________ function move_de_raton(e){ if(IE){ ClickX=event.clientX ClickY=event.clientY event.returnValue=true; } if(NS){ ClickX=e.clientX ClickY=e.clientY e.returnValue=true; } } //____________________________________________________________________________ // // Redirecciona el evento onmousedown a la función de usuario especificada. //____________________________________________________________________________ document.onmousedown = click_de_raton; // Redefine el evento onmousedown document.onmousemove = move_de_raton; // Redefine el evento onmousedown