Newsgroup: it.comp.lang.javascript
Titolo: doppio target di js per un elemento di un form

Salve ng,
ho adattato uno script (trovato mi sembra su 
jsdir.com
) di un calendarietto
affinchè funzionasse nel mio cms collegato ad un db mysql.
Come sarà noto a tutti, il mysql ha un modo particolare di getire le date,
le vuole sono nel formato aaaa-mm-gg.
Lo script funziona alla perfezione, e onde evitare che l'utente metta mano
nel campo text in cui appare la data, ho pensato di gestire il calendario
tramite un pulsante di tipo button che però tramite il js manda il valore
della data ad un campo hidden.
sqldate(now()) è una funzione che ho costruito e che mi passa la data dal
fomato vbscript gg/mm/aaa al formato mysql aaaa-mm-gg
<input class="FormButton" type="button" name="Databutton" value="<%=
sqldate(now()) %>" onMouseDown="cal(DataIns, event, 1)">
<input class="FormButton" type="hidden" name="DataIns" value="<%=
sqldate(now()) %>">
ora il problema è che il js del calendarietto grazie a cal(DataIns, event,
1) manda il valore scelto nel calendario al campo hidden chiamato datains,
il che va bene ai fini dello script, il punto è che però l'utente non ha
modo di verificare la correttezza della data, poichè nel campo button il
value rimane sqldate(now()).
Esiste un modo per dire al js di aggionare il value sia del campo hidden
chiamato "datains" che del campo button chiamato "databutton"?
tks,

concatena i due comandi separandoli da ;

 concatena i due comandi separandoli da ;
ossia dici di trasformare:
<input class="FormButton" type="button" name="Databutton" value="<%=
sqldate(now()) %>" onMouseDown="cal(DataIns, event, 1)">
<input class="FormButton" type="hidden" name="DataIns" value="<%=
sqldate(now()) %>">
in
<input class="FormButton" type="button" name="Databutton" value="<%=
sqldate(now()) %>" onMouseDown="cal(Databutton;DataIns, event, 1)">
<input class="FormButton" type="hidden" name="DataIns" value="<%=
sqldate(now()) %>">
???

No
è nella tua function cal() che devi aggiungere un comando dopo l'altro...

 č nella tua function cal() che devi aggiungere un comando dopo l'altro...
scusa, ma non ti seguo, dove devo concatenare?.... la mia funzione cal() č
function cal(val, e, t) {
  var dt = new Array();
  xPos = 600;
  yPos = 80;
  tipo = t;
  source = val;
  if (t == 0) {
   dt[0] = val[0].value;
   dt[1] = val[1].value;
   dt[2] = val[2].value;
  }
  else
   dt = val.value.split('-');
  showCalendar(new Date(dt[0], dt[1] - 1, dt[2]), xPos, yPos);
 }

Dopo showCalendar aggiorna anche il tuo button...
non sto capendo forse cosa stai chiedendo?


in
<input class="FormButton" type="button" name="Databutton"
value="<%=sqldate(now()) %>" onMouseDown="cal(DataIns, event, 1)">
<input class="FormButton" type="hidden" name="DataIns"
value="<%=sqldate(now()) %>">
nella chiamata alla funzione "cal(DataIns, event, 1)", il primo paramatro
dice alla function qual'è l'elemento del form da aggiornare... ed infatti ho
messo "datains", visto che il campo hidden si chiama "datains".
Il mio problema è che vorrei far aggiornare anche il campo button che si
chiama  "Databutton" che invece attualmente non viene aggiornato... Mi
servirebbe qualcosa che faccia agire due volte la stessa func una volta mi
aggiorna l'hidden e una volta il button, o che lo faccia contemporaneamente.
idee?

[CUT]
AAAAhhhhh (forse) ho capito...
Come prima istanza potresti chiamare la function 2 volte:
cal(DataIns,event,1);cal(Databutton,event,1)
Probabilmente studiandosi un attimo la function si evita di eseguirla 2
volte: passi un quarto argomento con il nome del button, poi nel punto dove
aggiorna (nella function cal che hai fornito non vi è traccia di
aggiornamenti di campi hidden o altro, quindi immagino lo faccia lo
showCalendar) aggiungi la riga per il button.
Occorrerebbe anche capire COME aggiorna, visto che un campo hidden
aggiornerà il value, mentre un button...boh, farà immagino un innerHTML;
però senza la function che esegui è ardua (ripeto: la cal che hai postato, e
che riporto qua sotto, non capisco minimamente cosa faccia ma non vedo
aggiornamenti di campi hidden)


 aggiornamenti di campi hidden)
ti ringrazio per la tua disponibilità.... il js completo che viene richiamto
lo posto qui,, magari può servire anche ad altri... :
var xwidth = 220;
var xheight = 180;
var browser = document.layers ? 0 : document.all ? 1 : 2;
// colori
var backtable = '#90C0FF';
var calendback = '#DDDDBB';
var lines = '#404040';
var bright = '#000000';
var festa = '#FD9139';
// ------ Non cambiare ----------
var mesi = new Array('Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio',
'Giugno',
               'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre',
'Dicembre');
var days = new Array('Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa', 'Do');
var dd = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var today = new Date();
var anno = today.getFullYear();
var mese = today.getMonth();
var currday = today.getDate();
var cellwidth = Math.floor(xwidth / 7);
xwidth = cellwidth * 7;
var xmese = 0;
var aboutx = true;
var isOn = false;
function action(a, m , g) {
   function format(x) {
      return x > 9 ? x : "0" + x;
   }
   getId().showIt(false);
   if (tipo == 0) {
      source[0].value = format(g);
      source[1].value = format(m + 1);
      source[2].value = a;
   }
   else
      source.value = format(g) + '-' + format(m + 1) + '-' + a;
}
document.write('<style type="text/css">\n<!--');
document.write('.cal { font-family: Arial, Helvetica, sans-serif; font-size:
10px; font-weight: bold; color: #000099}');
document.write('.num { font-family: Arial, Helvetica, sans-serif; font-size:
12px; text-decoration:none}');
document.write('.mese {  font-family: Arial, Helvetica, sans-serif;
font-size: 14px; font-weight: bold; color: #663300}');
document.write('.butt {  font-family: Arial, Helvetica, sans-serif;
font-size: 10px}');
document.write('-->\n</style>');
function comparedate(d1, d2) {
   if (d1.getFullYear() == d2.getFullYear() && d1.getMonth() ==
d2.getMonth() && d1.getDate() == d2.getDate())
      return true;
   return false;
}
function pasqua(aa) {
   var xx = new Array(22, 22, 23, 23, 24, 24);
   var yy = new Array(2, 2, 3, 4, 5, 5);
   var a = aa % 19;
   var b = aa % 4;
   var c = aa % 7;
   var i = Math.floor(aa / 100) - 15;
   var x = xx[i], y = yy[i];
   var d = (19*a + x) % 30;
   var e = (2*b + 4*c + 6 * d + y) % 7;
   var p = 22 + d + e;
   var m = 300;
   if (p > 31) {
      m = 400;
      p = p - 31;
   }
   return m + p;
}
function isfesta(d) {
   var feste = new Array(0, 101, 106, 425, 501, 602, 815, 1101, 1208, 1225,
1226);
   if (d.getDay() == 0)
      return true;
   var pp = pasqua(d.getFullYear()) + 1;     // Pasquetta
      if (pp % 100 > 31)
         pp = 401;
   feste[0] = pp;
   for (var i = 0; i < feste.length; i++)
      if (Math.floor(feste[i] / 100) == d.getMonth() + 1) {
         var gg = feste[i] % 100;
         if (gg == d.getDate())
            return true;
      }
   return false;
}
function calendar(currday, mese, anno) {
   var dx = 2 - (new Date(anno, mese, 1)).getDay();
   if (dx == 2)
      dx = -5;
   var daysInMonth = dd[mese];
   if (mese == 1) {
      if (anno % 4 == 0 && anno % 100 != 0  || anno % 400 == 0)
         daysInMonth++
   }
   var tx = '<div class="mese">&nbsp;&nbsp;' + mesi[mese] + ' ' + anno
+'</div>\n';
   tx += '<table width="' + xwidth + '" border="0" cellspacing="1"
cellpadding="1">\n';
   tx += '<tr align="right">\n';
   for (var i = 0; i < 7; i++)
      tx += '<td width="' + cellwidth+ '" class="cal">' + days[i] +
'&nbsp;</td>\n';
   tx += '</tr>\n';
   for (var j = 0; j < 6; j++) {
      tx += '<tr bgcolor="' + calendback + '" align="right">\n';
      for (var i = 0; i < 7; i++) {
         var bgstring = "";
         var fgcol = lines;
         var fgstring = '&nbsp;';
         if (dx > 0 && dx <= daysInMonth) {
            fgstring = dx;
            var ddx = new Date(anno, mese, dx);
            if (isfesta(ddx)) {
               bgstring = ' bgcolor="' + festa + '"';
            }
            if (comparedate(ddx, today)) {
               fgcol = bright;
               fgstring = '<b><u>' + dx + '</u></b>\n';
            }
            var tempdate = ddx.getDate() + ", " + ddx.getMonth() + ", " +
ddx.getFullYear();
            fgstring = '<a href="javascript:action(' + tempdate + ')" class
= "num"><font color="' + fgcol + '">' + fgstring + '</font></a>\n';
         }
         tx += '<td width="' + cellwidth + '" class="num"' + bgstring +
'>\n';
         tx += fgstring;
         tx += '</td>\n';
         dx++;
      }
      tx += '</tr>\n';
   }
   tx += '</table>\n';
   return tx;
}
function dataframe(x) {
   var s = '<table width="' + xwidth + '" border="1" cellspacing="0"
cellpadding="0" bgcolor="' + backtable + '">';
   s += '<tr>\n<td class="mese" valign="middle">';
   s += x; // calendar(currday, mese, anno);
   s += '</td></tr><tr><td>';
   s += '<form class="butt"><table width="100%" border="0" cellspacing="0"
cellpadding="2">';
   s += '<tr>';
   s += '<td><input type="button" name="about" value="x" class="butt"
onclick=document.getElementById("calframe").style.visibility="hidden"></td>'
;
   s += '<td align="right"><input type="button" name="prev" value=" - "
class="butt" onclick="altro_mese(-1)">';
   s += '<input type="button" name="current" value="Default" class="butt"
onclick="altro_mese(9)">';
   s += '<input type="button" name="next" value=" + " class="butt"
onclick="altro_mese(1)"></td>';
   s += '</tr></form></table>';
   s += '</td>\n</tr>\n</table>';
   return s;
}
function altro_mese(x) {
   xmese += x;
   if (x == 9)
      xmese = 0;
   var xday = (xmese == 0)? currday : 99;
   var mm = (mese + xmese) % 12;
   while (mm < 0)
      mm += 12;
   var s = dataframe(calendar(xday, mm, anno + Math.floor((mese + xmese) /
12)));
   writeLayer(s);
   aboutx = false;
}
function xabout() {
   if (aboutx)
      altro_mese(0);
   else {
      var aboutstr = '<table border="0" cellspacing="0" cellpadding="10"
align="center"><tr><td nowrap class="mese">';
      aboutstr += '<br>Calendario vers. 1.0<br><br>';
      aboutstr += '&copy;2002 by Maurizio Mauri<br><br>';
      aboutstr += '<a href="mailto:
M.M...@mclink.it
"
class="num">
M.M...@mclink.it
</a>';
      aboutstr += '</td></tr></table><br>';
      writeLayer(dataframe(aboutstr));
   }
   aboutx = true;
}
function getId() {
   switch (browser) {
      case 0:
         return document.layers.calframe;
      case 1:
         return eval('calframe');
      case 2:
         return document.getElementById("calframe");
   }
}
function moveLayer(xPos, yPos) {
   switch (browser) {
   case 0:
      this.left = xPos;
      this.top = yPos;
      break;
   case 1:
      this.style.pixelLeft = xPos;
      this.style.pixelTop = yPos;
     break;
   default:
      this.style.left = xPos;
      this.style.top = yPos;
   }
}
function createlayer() {
   var s;
   if (document.layers)
      s = '<layer id="calframe" visibility="hide" z-index=1>';
   else
      s = '<div id="calframe" style="position:absolute; visibility:
hidden">';
   if (document.layers)
      s += '</layer>';
   else
      s += '</div>';
   document.writeln(s);
}
function showIt(on) {
   isOn = on;
   if (browser)
      this.style.visibility = (on) ? "visible" : "hidden";
   else
      this.visibility = (on) ? "show" : "hide"
}
function writeLayer(s) {
   var id = getId();
   if (browser)
      id.innerHTML = s;
   else {
      id.document.open();
      id.document.write(s);
      id.document.close();
   }
}
function init() {
   var id = getId();
   id.moveLayer = moveLayer;
   id.showIt = showIt;
   id.showIt(false);
}
function showCalendar(d, xpos, ypos) {
   if (!isOn) {
      if (d) {
            anno = d.getFullYear();
            mese = d.getMonth();
            currday = d.getDate();
         } else {
            anno = today.getFullYear();
            mese = today.getMonth();
            currday = today.getDate();
      }
      if (arguments.length > 2) {
         var id = getId();
         id.moveLayer(xpos, ypos);
      }
      else
         getId().moveLayer(100, 100);
      xmese = 0;
      writeLayer(dataframe(calendar(currday, mese, anno)));
   }
   getId().showIt(!isOn);
}
createlayer(1);
onload = init;

Mammamia...
vediamo se qualche santo ha voglia di studiarsi il tutto e cercare questo
fantomatico Databutton...

 fantomatico Databutton...
infatti... è davvero un ottimo scriptino, questo Mauri è stato davvero
bravo...
intanto dici che per far girare due volte los cript mi basta inserire sue
volte la funzione cal()?

 volte la funzione cal()?
Questo sicuramente, se la chiami 2 volte "gira" 2 volte...
Non sono molto sicuro (anzi, mi puzza molto) che funzioni con un button,
prova però, non si sa mai

 cal(DataIns,event,1);cal(Databutton,event,1)
nisba... non funzia...

 della data ad un campo hidden.
Non ho davanti lo script, ma pochi minuti fa per un lavoro ho fatto 
così:
<input type='text' ... onclick='Prendivalori(this.value)' 
onfocus='this.blur()'>
La funzione legge una lista da un db e ritorna alcune selezioni (quindi 
analogo al calendario che ti serve), onfocus='this.blur()' sfancula il 
deficiente di turno che clicca sul campo (o ci arriva col tab) in modo 
che non modifichi.
Ovviamente il tutto funziona con JavaScript attivo, ma se non è attivo 
non va neanche il calendario, quindi... :-)
Fammi sapere se risolvi in questo modo abbastanza indolore (ripeto: non 
ho proprio aperto lo script! non so se sono esaustivo) senza andare a 
spippolare la funzione che non essendo una mia creatura potrei fare 
qualche casino :-P
p.s.
Tra l'altro Maurizio mi scriveva proprio ieri per chiedermi se il NG 
esiste ancora, sembra che lui da MCLink non riesca ad accedervi da 
giorni :-(
-- 
Ciao, Riccardo
------------------------------------------------------------------------
http://www.jsdir.com
  ---- Bring Your Site To Life!!!!
http://www.wmtools.it
 ---- WebMasterTools - Servizi per il tuo sito
http://www.dev2dev.it
 ---- La rete ha connesso nuove particelle - D2D006
------------------------------------------------------------------------
Per rispondere: togli i PUNTO .


Grande Riccardo!
Hai detto giusto... ho riso su quel tuo "sfancullizzare", ma esprime a pieno
ciò che pensavo...
come al solito, la soluzione è sempre quella più semplice...  intanto che tu
postavi pensavo a qualche attributo tipo disabled... ma
onfocus='this.blur()' è di gran lunga l a soluzione migliore... grazie
mille!
se senti mauri, ringrazialo... il suo calendarietto è davvero ottimo!

 se senti mauri, ringrazialo... il suo calendarietto č davvero ottimo!
Lo sappiamo :-)
E lo sa anche una compagnia aerea (non mi ricordo il nome, l'abbiamo 
beccata grazie a PuntoInformatico se ben ricordo) che l'ha preso e 
utilizzato togliendo quasi tutti i credits :-(


 utilizzato togliendo quasi tutti i credits :-(
Strano! Perchè Mauri nel suo js ha lasciato anche l'opzione per rendere i
credits visibili o meno... quindi non vedo la ragione di un tale atto!
Io l'ho abbinato ad un mio script in vbscript che mi formatta le date per il
mysql,  a quel punto mi è bastato invertire l'ordine nella function del js e
il gioco è fatto!