EDIT: Ron posted his answer while I was typing but I won't delete mine. It's almost the same thing, minus a few things, plus a few bells and whistles...
--------------------------
Having a menu won't remove the need to touch the calendar to trigger the dialog at least...
Any way, here is a skeleton with a little flesh on the bones:
--------------------------
list Buttons = ["Oct", "Nov", "Dec", "Jul", "Aug", "Sep", "Apr", "May", "Jun",
"Jan", "Feb", "Mar"];
list Textures = ["10", "11", "12", "7", "8", "9", "4", "5", "6", "1", "2", "3"];
// Replace the number of the month by the name of the corresponding texture.
integer Busy;
integer Handle;
key Avatar;
default {
state_entry()
{
Busy = FALSE;
}
touch_start(integer total)
{
if (Busy)
{
llInstantMessage(llDetectedKey(0), "Already in use. Please wait a minute..."

;
return;
}
else
{
Busy = TRUE;
}
Avatar = llDetectedKey(0);
Handle = llListen(-99999, "", Avatar, ""

;
llSetTimerEvent(60.0); // 1 minute time out
llDialog(Avatar, "Select the month:", Buttons, -99999);
}
timer()
{
llSetTimerEvent(0.0);
llListenRemove(Handle);
Busy = FALSE;
llInstantMessage(Avatar, "Time out! Dialog is now disabled."

;
}
listen(integer channel, string name, key id, string msg)
{
llSetTimerEvent(0.0);
llListenRemove(Handle);
Busy = FALSE;
integer month = llListFindList(Buttons, [msg]);
if (month != -1) // It should never fail
{
llSetTexture(llList2String(Textures, month), 0);
}
}
}
---------------------------------------------
Not tested in world but I'm very confident... Except for the tyops typso typos...
