1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
|
// ***************************************************************************
// 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";
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
dpzx=16
dpzy=16
wtop=calculatop_ctx(y,dpzy,margen,menuctx) // Calcula posición del menu contextual
wleft=calculaleft_ctx(x,dpzx,margen,menuctx)
ftop=wtop+parseInt(document.body.scrollTop) // Tiene en cuenta el scrolling
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
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
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<document.body.scrollLeft) wleft=document.body.scrollLeft+16
}
}
return(wleft)
}
//____________________________________________________________________________
//
// Esta función devuelve el objeto DIV al que pertenece el item <TR>
// Parametros:
// - o: El objeto <TR>
//____________________________________________________________________________
function contextual(o){
while(o.tagName!="DIV")
o=o.parentNode
return(o)
}
//____________________________________________________________________________
//
// Esta función devuelve el objeto <TR> 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;i<oTRS.length;i++){
var oTR=oTRS[i];
if(oTR.getAttribute("id")==idx) return(oTR);
}
return(null);
}
//____________________________________________________________________________
//
// Esta función actualiza el nuevo el indice del item seleccionado
// Parametros:
// - o: El objeto DIV que contiene el menu contextual o un item(objeto TR) de él
// - i: El valor del indice
//____________________________________________________________________________
function menuctxSetSelectedIndex(o,idx){
var oDIV=contextual(o); // Se asegura que el objeto de inicio es DIV
var oINPUT=oDIV.childNodes[1];
oINPUT.value=idx;
}
//____________________________________________________________________________
//
// Esta función devuelve el indice del item seleccionado
// Parametros:
// -o : El objeto DIV que contiene el menu contextual o un item(objeto TR) de él
//____________________________________________________________________________
function menuctxSelectedIndex(o){
var oDIV=contextual(o); // Se asegura que el objeto de inicio es DIV
var oINPUT=oDIV.childNodes[1];
return(oINPUT.value);
}
//____________________________________________________________________________
// Se ejecuta cuando se posiciona el cursor dentro de un item de algún menú contextual.
// Parámetros:
// - o: El item (objeto TR) donde se ha colocado el ratón
//____________________________________________________________________________
function sobre_contextual(o){
var oDIV=contextual(o) // Se asegura que el objeto de inicio es DIV
var idx=menuctxSelectedIndex(oDIV) // Indice del Item anterior seleccionado
var nwid=o.getAttribute("id");
if (parseInt(idx)!=parseInt(nwid)){ // Si cambio de item
if(idx>0){ // 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 <TR>
//____________________________________________________________________________
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;
}
(MenuconImagen(contextual(o)) ? i0=2:i0=1);
var nh=o.childNodes.length;
for (var i=i0;i<nh-1;i++){
var oTD=o.childNodes[i];
var oIMGS=oTD.getElementsByTagName('IMG');
if (oIMGS.length>0){
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<idxmnu;i++ ){
if (gmenuctx[i].style.visibility=="visible")
swm=swm || EnContextual(x,y,gmenuctx[i])
}
if (!swm){ // No se ha hecho click en ningún menu contextual
for (var i=0;i<idxmnu;i++ ){
desmarcar_item(gmenuctx[i]);
gmenuctx[i].style.visibility="hidden";
gmenuctx[i]=null
}
idxmnu=0;
}
}
//____________________________________________________________________________
//
// Detecta si ha hecho fuera del menu contextual pasado como parametro
// Parametros:
// - x : Coordenada X de la pantalla donde se hizo click
// - y : Coordenada Y de la pantalla donde se hizo click
// - menuctx: El submenu (objeto DIV)
//____________________________________________________________________________
function EnContextual(x,y,menuctx){
origen_x=parseInt(menuctx.offsetLeft)-parseInt(document.body.scrollLeft)
origen_y=parseInt(menuctx.offsetTop)-parseInt(document.body.scrollTop)
anchodiv=parseInt(menuctx.offsetWidth)
largodiv=parseInt(menuctx.offsetHeight)
if ( x>=origen_x && x<=origen_x+anchodiv && y>=origen_y && y<=origen_y+largodiv ) return true
return(false)
}
//____________________________________________________________________________
//
// Muestra un submenu
// Parametros:
// - item: El objeto <TR> 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)
anchopadrediv=parseInt(padrediv.offsetWidth) // Ancho del div padre
anchomenuctx=parseInt(menuctx.offsetWidth) // Ancho del div
if(IE)
leftpadrediv=padrediv.style.pixelLeft // Coordenada x del div padre
else
if(NS)
leftpadrediv=parseInt(padrediv.style.left) // Coordenada x del div padre
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(wleft<document.body.scrollLeft) wleft=document.body.scrollLeft+18
}
}
return(wleft)
}
//____________________________________________________________________________
//
// Se ejecuta cada vez que se hace click con el puntero del ratón. Se usa para desmarca
// cualquier item de menu contextual que estuviese activo
//____________________________________________________________________________
function click_de_raton(e){
if(IE){
botonraton=event.button
event.returnValue=true;
}
if(NS){
botonraton=e.which;
e.returnValue=true;
}
if (gmenuctx.length>0){
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
|