// Calendar: a date picker
// Author: Alfio Casella
// To use it in your project write to: alfcas@etneide.it
var c_monthIT = new Array("Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre");
var c_monthUK = new Array("January","February","March","April","May","June","July","August","September","Octber","November","December");
var c_monthFR = new Array("Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre");
var c_monthRO = new Array("Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie");
//
var c_monthName = new Array(c_monthIT,c_monthUK,c_monthFR,c_monthRO);
//
var c_dayIT = new Array("Dom","Lun","Mar","Mer","Gio","Ven","Sab");
var c_dayUK = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
var c_dayFR = new Array("Dim","Lun","Mar","Mer","Jeu","Ven","Sam");
var c_dayRO = new Array("Dum","Lun","Mar","Mie","Joi","Vin","Sam");
//
var c_dayName = new Array(c_dayIT,c_dayUK,c_dayFR,c_dayRO);
//
var c_footerMsg = new Array("Oggi","Today","Aujourd'hui","Today");
//
var c_lang=0;
var c_widthPix=228;
//
var c_workDate = new Date();
var c_weekendCol = new Array(2);
var c_weekStart = 1; // Monday

var c_fromYear = 2000;
var c_toYear = 2010;
var c_dateFormat = 'DMY';
var c_dateSeparator = '/';
var c_dateStyle = 'N';     // A=alfabetic a=short  n=Numeric N=numeric zero filled month
var c_ctlRef;
var c_ctlName;
var c_notBeforeDate = new Date();
var c_notAfterDate = new Date();

var gx = 0;
var gy = 0;




//
// handle mousemove
//
if ((navigator.appName.indexOf("Netscape") != -1) || (navigator.appName.indexOf("Opera") != -1))
{
   if (document.onmousemove == undefined)
      document.onmousemove = c_funMouseMove;
}
function c_funMouseMove(evnt)
{
   gx = evnt.pageX;
   gy = evnt.pageY;
   return true;
}


function buildCalendar(lang,format,separator,weekstart,fromyear,toyear)
{
   if (lang>=0 && lang<=7) c_lang = lang;
   if (format!='') c_dateFormat = format;
   if (separator!='') c_dateSeparator = separator;
   if (weekstart>=0 && weekstart<=6) c_weekStart = weekstart;
   if (fromyear>=0) c_fromYear = fromyear;
   if (toyear>=0) c_toYear = toyear;
   // calculate week end column for different visual appearance
   c_weekendCol[0] = 6 - weekstart;
   c_weekendCol[1] = (weekstart == 0) ? 0 : 7 - weekstart;
   //
   c_createCalendar();
   c_listenEvent();
}

function c_createCalendar()
{
   var i,j,d;
   document.write('<div id="monthCalendar" class="MonthCalendar">');
   document.write('<table class="Calendar" cellpadding="0" celspacing="0">');
   document.write('<tr>');
   document.write('<td colspan="7">');
   document.write('<table width="100%" cellpading="0" cellspacing="0">');
   document.write('<tr class="CalendarTop">');
   document.write('<td onClick="c_paintCalendar(-1);" align="right" ><img src="/pages/CalendarPrev.gif" border="0"></td>');
   document.write('<td onClick="c_paintCalendar(1);" align="left" ><img src="/pages/CalendarNext.gif" border="0"></td>');
   document.write('<td id="c_topSelector" align="center">'+c_monthOption()+c_yearOption()+'</td>');
   document.write('<td align="center" onClick="c_hideCalendar()"><img src="/pages/CalendarClose.gif" border="0"></td>');
   document.write('</tr>');
   document.write('</table>');
   document.write('</td>');
   document.write('</tr>');
   // week header
   document.write('<tr>');
   for (i=0; i<7; i++) {
      d = i + c_weekStart;
      if (d>6) d = d - 7;
      document.write('<td class="CalendarDays">' + c_dayName[c_lang][d] + '</td>');
   }
   document.write('</tr>');
   // calendar grid
   for (i=0; i<6; i++) {
      document.write('<tr>');
      for (j=0; j<7; j++) {
         document.write('<td class="day_out" id="c_grd'+i+''+j+'">&nbsp;</td>');
      }
      document.write('</tr>');
   }
   // footer today
   document.write('<tr><td colspan="7" bgcolor="#cccccc"></td></tr>');
   document.write('<tr><td colspan="7" class="footer" align="center" id="c_footerBar">&nbsp;</td></tr>');
   //
   document.write('</table></div>');
}

function c_listenEvent()
{
   var obj;
   var i,j;
   // set the onclick event for every calendar cell to c_setDate
   for (i=0; i<6; i++) {
      for (j=0; j<7; j++) {
         obj = document.getElementById('c_grd'+i+''+j);
         obj.rowNumber = i;
         obj.colNumber = j;
         obj.fireEvent = false;
         if (window.addEventListener)
            obj.addEventListener('click', c_setDate, false); // Mozilla, Netscape, Firefox
         else
	    obj.attachEvent('onclick', c_setDate); // IE
      }
   }
}

//
// change month and year on top bar
//
function c_selectMonth(id)
{
   var ctl = document.getElementById(id);
   c_workDate.setMonth(ctl.options[ctl.selectedIndex].value);
   c_paintCalendar(0);
}
function c_selectYear(id)
{
   var ctl = document.getElementById(id);
   c_workDate.setFullYear(ctl.options[ctl.selectedIndex].value);
   c_paintCalendar(0);
}


function c_monthOption()
{
   var i;
   var html='<select class="Selector" id="c_monthSelector" onchange="c_selectMonth(\'c_monthSelector\')">';
   for (i=0; i<12; i++) {
      html += '<option value="' + i + '" ' + ((i == c_workDate.getMonth())?'selected ':'')+ '>'+ c_monthName[c_lang][i] + '</option>';
   }
   html += '</select>';
   return html;
}
function c_yearOption()
{
   var i;
   var html='<select class="Selector" id="c_yearSelector" onchange="c_selectYear(\'c_yearSelector\')">';
   for (i=c_fromYear; i<=c_toYear; i++) {
      html += '<option value="' + i + '" ' + ((i == c_workDate.getFullYear())?'selected ':'')+ '>'+ i + '</option>';
   }
   html += '</select>';
   return html;
}


function c_makeDayCell(d)
{
   var dd = new Date(d);
   var today = new Date();
   var obj;
   var diff;
   var state;

   // Cleaning ...
   for (i=0;i<6;i++) {
      for (j=0;j<7;j++) {
         obj = document.getElementById('c_grd'+i+''+j);
         obj.innerHTML= '';
         obj.className = 'day_out';
         obj.fireEvent = false;
         obj.content = '';
      }
   }

   dd.setDate(1);   // the first day of the month
   diff = dd.getDay() - c_weekStart; // previous month's days
   if (diff<0) diff += 7;
   if (diff==0) {
     state=1;
   } else {
     dd.setDate(dd.getDate()-diff);
     state=0;
   }

   for (i=0; i<6; i++) {
    for (j=0; j<7; j++) {
     obj = document.getElementById('c_grd'+i+''+j);
     switch (state) {
     case 0:
         obj.innerHTML= dd.getDate();
         obj.content=date2a(dd);
         if ((c_weekendCol[0] == j) || (c_weekendCol[1] == j))
            obj.className = 'wke_out';
         if (isToday(dd))
             obj.className = 'today';
         if (isBetween(dd,c_notBeforeDate,c_notAfterDate))
             obj.fireEvent = true;
         dd.setDate(dd.getDate()+1);
         if (dd.getDate()==1) {
           state=1;
         }
         break;
     case 1:
         obj.innerHTML= dd.getDate();
         obj.content=date2a(dd);
         if ((c_weekendCol[0] == j) || (c_weekendCol[1] == j))
            obj.className = 'wke_in';
         else
            obj.className = 'day_in';
         if (isToday(dd))
             obj.className = 'today';
         if (isBetween(dd,c_notBeforeDate,c_notAfterDate))
             obj.fireEvent = true;
         dd.setDate(dd.getDate()+1);
         if (dd.getDate()==1) {
           state=2;
         }
         break;
     case 2:
         obj.innerHTML= dd.getDate();
         obj.content=date2a(dd);
         if ((c_weekendCol[0] == j) || (c_weekendCol[1] == j))
            obj.className = 'wke_out';
         if (isToday(dd))
             obj.className = 'today';
         if (isBetween(dd,c_notBeforeDate,c_notAfterDate))
             obj.fireEvent = true;
         dd.setDate(dd.getDate()+1);
         break;
     }
    }
   }
}

//
// paint calendar shifting month by a value
//
function c_paintCalendar(shift)
{
   var innerHtml;

   c_workDate.setDate(1);
   c_workDate.setMonth(c_workDate.getMonth() + shift);
   // write topbar
   innerHtml = c_monthOption();
   innerHtml += '&nbsp;';
   innerHtml += c_yearOption();
   document.getElementById('c_topSelector').innerHTML = innerHtml;
   // write days calendar
   c_makeDayCell(c_workDate);
   // write footer info
   var now = new Date();
   document.getElementById('c_footerBar').innerHTML = ' '+c_footerMsg[c_lang]+' '+date2a(now);
}


//
// write data to the html input
//
function c_setDate(evt)
{
   var idd;
   var date;
   var i,j;

   var ie_var = 'srcElement'; // "srcElement" for IE
   var mo_var = 'target';     // "target" for Mozilla, Netscape, Firefox et al.
   var p_name;                // property name
   var value;

   // if day_out do not fire event
   p_name = 'fireEvent';
   evt[mo_var] ? value = evt[mo_var][p_name] : value = evt[ie_var][p_name];
   if (value==false) return;

   /*
   // get row and col
   p_name = 'rowNumber';
   evt[mo_var] ? i = evt[mo_var][p_name] : i = evt[ie_var][p_name];
   p_name = 'colNumber';
   evt[mo_var] ? j = evt[mo_var][p_name] : j = evt[ie_var][p_name];

   idd = document.getElementById('c_grd'+i+''+j).innerHTML;
   c_workDate.setDate(idd);
   date=date2a(c_workDate);
   */
   p_name = 'content';
   evt[mo_var] ? value = evt[mo_var][p_name] : value = evt[ie_var][p_name];
   date = value;
   try {
      document.getElementById(c_ctlName).value = date;
   }
   catch (e)
   {c_ctlRef.value = date;}
   //
   c_hideCalendar();
}


//
// hide calendar
//
function c_hideCalendar()
{
   document.getElementById('monthCalendar').style.visibility='hidden';
   // hide undercover iframe
   document.getElementById('c_underCover').style.display = "none";
}

//
// show calendar
//
function c_showCalendar(callerId)
{
   var obj = document.getElementById('monthCalendar');
   var top,left;

   c_paintCalendar(0);
/*
   if (navigator.userAgent.indexOf("MSIE") != -1) {
      if (window.event.x+document.body.scrollLeft+c_widthPix>document.body.clientWidth)
         left=window.event.x+document.body.scrollLeft-c_widthPix;
      else
         left=window.event.x+document.body.scrollLeft;
      top=window.event.y+document.body.scrollTop;
   }
   else if ((navigator.appName.indexOf("Netscape") != -1) || (navigator.appName.indexOf("Opera") != -1)) {
      if (gx+c_widthPix>document.body.clientWidth)
         left=gx + 5 - c_widthPix;
      else
         left=gx + 5;
      top=gy + 5;
   }
*/
   left=document.getElementById(callerId).offsetLeft+'px';
   top=document.getElementById(callerId).offsetTop+'px';
   obj.style.left=left;
   obj.style.top=top;
   //For covering select control under the Calendar
   document.getElementById('c_underCover').style.width = obj.scrollWidth;
   document.getElementById('c_underCover').style.height = obj.scrollHeight;
   document.getElementById('c_underCover').style.top = top;
   document.getElementById('c_underCover').style.left = left;
   document.getElementById('c_underCover').style.display = "inline";
   obj.style.visibility = 'visible';
}


// callable function by the outside

function getCalendar(callerId, ctlName, notBefore, notAfter)
{
   if (ctlName == undefined) {
      alert('Parameter ctlName not found');
      return;
   }
   if (isDate(notBefore)) c_notBeforeDate = a2date(notBefore);
   if (isDate(notAfter))  c_notAfterDate = a2date(notAfter);

   c_ctlName = ctlName;
   if (isDate(document.getElementById(c_ctlName).value))
      c_workDate = a2date(ctlRef.value);
   else
      c_workDate.setDate(c_workDate.getDate());

   c_showCalendar(callerId);
}

function getCalendarFor(callerId, ctlRef)
{
   if (ctlRef == undefined) {
      alert('Parameter ctlRef not found');
      return;
   }
   c_ctlRef = ctlRef;
   if (isDate(ctlRef.value))
      c_workDate = a2date(ctlRef.value);
   else
      c_workDate.setDate(c_workDate.getDate());

   c_notBeforeDate = a2date('01/01/'+c_fromYear);
   c_notAfterDate = a2date('31/12/'+c_toYear);
   c_showCalendar(callerId);
}

function isToday(date)
{
 var today = new Date();
 if ( date.getDate()==today.getDate()&&date.getMonth()==today.getMonth()&&date.getFullYear()==today.getFullYear() )
    return true;
 else
    return false;
}
function isBefore(date,notBefore)
{
 if ( date.getDate()<notBefore.getDate()&&date.getMonth()<notBefore.getMonth()&&date.getFullYear()<notBefore.getFullYear() )
    return true;
 else
    return false;
}
function isAfter(date,notAfter)
{
 if ( date.getDate()>notAfter.getDate()&&date.getMonth()>notAfter.getMonth()&&date.getFullYear()>notAfter.getFullYear() )
    return true;
 else
    return false;
}
function isBetween(date,notBefore,notAfter)
{
 if ( (date.getDate()<notBefore.getDate()&&date.getMonth()<notBefore.getMonth()&&date.getFullYear()<notBefore.getFullYear())
 || (date.getDate()>notAfter.getDate()&&date.getMonth()>notAfter.getMonth()&&date.getFullYear()>notAfter.getFullYear()) )
    return false;
 else
    return true;
}

function isLeapYear(year) {
 if ((year%400==0)||((year%4==0)&&(year%100!=0)))
    return true;
 else
    return false;
}

function isDate(date) {
  var tmp;

  if (date=='') return false;

  if (date.match(c_dateSeparator))
     tmp = date.split(c_dateSeparator);
  else
     if (date.match('-')) tmp = date.split('-'); else return false;

  if (isNaN(parseInt(tmp[0])) || isNaN(parseInt(tmp[1])) || isNaN(parseInt(tmp[2]))) return false;

  var igg=parseInt(tmp[0],10);
  var imm=parseInt(tmp[1],10);
  var iaa=parseInt(tmp[2],10);

  if (iaa<c_fromYear || iaa>c_toYear) return false;
  if (imm<1 || imm>12) return false;

  var ml = new Array (31,28,31,30,31,30,31,31,30,31,30,31);
  ml[1] = (isLeapYear(iaa)) ? 29 : 28;
  if (igg>ml[imm-1] || igg<1) return false;

  return true;
}

function a2date(date) {
  var tmp;

  if (isDate(date)==false) return;

  if (date.match(c_dateSeparator))
     tmp = date.split(c_dateSeparator);
  else
     if (date.match('-')) tmp = date.split('-'); else return false;

  var igg = parseInt(tmp[0],10);
  var imm = parseInt(tmp[1],10);
  var iaa = parseInt(tmp[2],10);
  var retval = new Date(iaa,imm-1,igg,0,0,0,0);
  return retval;
}

function date2a(dt) {
  var date;
  var idd = dt.getDate();
  var imm = dt.getMonth()+1;
  var iyy = dt.getFullYear();
  var zdd,zmm;

  if (idd<10) zdd='0'+idd; else zdd=idd;
  if (imm<10) zmm='0'+imm; else zmm=imm;

  switch (c_dateStyle) {
  case 'N':
     // numeric
     if (c_dateFormat=='DMY')
        date = zdd+c_dateSeparator+zmm+c_dateSeparator+iyy;
     if (c_dateFormat=='MDY')
        date = zmm+c_dateSeparator+zdd+c_dateSeparator+iyy;
     if (c_dateFormat=='YMD')
        date = ''+iyy+c_dateSeparator+zmm+c_dateSeparator+zdd;
     break;
  case 'n':
     // numeric
     if (c_dateFormat=='DMY')
        date = ''+idd+c_dateSeparator+imm+c_dateSeparator+iyy;
     if (c_dateFormat=='MDY')
        date = ''+imm+c_dateSeparator+idd+c_dateSeparator+iyy;
     if (c_dateFormat=='YMD')
        date = ''+iyy+c_dateSeparator+imm+c_dateSeparator+idd;
     break;
  case 'A':
      // alfabetic
     if (c_dateFormat=='DMY')
        date = ''+idd+c_dateSeparator+c_monthName[c_lang][imm-1]+c_dateSeparator+iyy;
     if (c_dateFormat=='MDY')
        date = ''+c_monthName[c_lang][imm-1]+c_dateSeparator+idd+c_dateSeparator+iyy;
     if (c_dateFormat=='YMD')
        date = ''+iyy+c_dateSeparator+c_monthName[c_lang][imm-1]+c_dateSeparator+idd;
     break;
  case 'a':
      // alfabetic
     if (c_dateFormat=='DMY')
        date = ''+idd+c_dateSeparator+c_monthName[c_lang][imm-1]+c_dateSeparator+iyy;
     if (c_dateFormat=='MDY')
        date = ''+c_monthName[c_lang][imm-1]+c_dateSeparator+idd+c_dateSeparator+iyy;
     if (c_dateFormat=='YMD')
        date = ''+iyy+c_dateSeparator+c_monthName[c_lang][imm-1]+c_dateSeparator+idd;
     break;
  }
  return date;
}

function compareToday(date) {
 if (isDate(date)==false) return;
 var now = new Date();
 var today = new Date(now.getFullYear(),now.getMonth(),now.getDate(),0,0,0,0);

 if (a2date(date)>today)
   return 1;
 else if (a2date(date)<today)
   return -1;
 else
   return 0;
}

function compareDate(dateFirst,dateLast) {
 if (isDate(dateFirst)==false || isDate(dateLast)==false) return;
 if (a2date(dateFirst)<a2date(dateLast))
   return -1;
 else if (a2date(dateFirst)>a2date(dateLast))
   return 1;
 else return 0;
}


