var ENABLE_DAY_OF_WEEK = [];
var DAYS_OF_WEEK = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var MONTHS_OF_YEAR = ['January','February','March','April','May','June','July','August','September','October','November','December'];
// this function returns true if the passed date is special
function dayOfWeekIsEnabled(day) {
    for (var i in ENABLE_DAY_OF_WEEK) if (ENABLE_DAY_OF_WEEK[i] == DAYS_OF_WEEK[day]) return true;
    return false;
}

// this is the actual date status handler.  Note that it receives the
// date object as well as separate values of year, month and date, for
// your comfort.

var clientLoadTime = new Date().getTime();
var serverDate;
var dateNow;
var dateFrom;
var dateFirst;
var nextDate = null;
var nextCutoffDate;
var nextService;

function newDate()
{
    timeSinceLoad = new Date().getTime() - clientLoadTime;
    return new Date(serverDate.getTime() + timeSinceLoad);
}

function setDays(days, hour, min)
{
    ENABLE_DAY_OF_WEEK = days;
    if (days.length > 0) { setCutOff(hour, min); }
    rebuildCalender();
    if(!(dateFirst === undefined))
    {
    //alert(dateFirst);
      cal.setDate(dateFirst);
      setDeliveryDate(cal.date.print("%d %B %Y"));
    }
    else 
    {
      setDeliveryDate("");
    }
}

function rebuildCalender()
{
    cal.destroy();
  cal = Zapatec.Calendar.setup({
		firstDay          : 1,
		flat              : "calendar",
		flatCallback      : flatCalendarCallback,
		dateStatusFunc 	  : dateStatusHandler,
		date              : dateFrom
	});
}

function disableCalender()
{
    setDays([], 0, 1);
}

function isBankHoliday(date)
{
    var bh = BANK_HOLIDAYS[date.getFullYear() + "-" + (date.getMonth() + 1)]; //note: month is zero based in javascript
      if (bh) 
        for (var i in bh) if (bh[i] == date.getDate()) 
          return true;
      
     return false;
}

function nextAvailableDelivery(deliveryOptions)
{
    for (var i in deliveryOptions)  
    {
        ENABLE_DAY_OF_WEEK = deliveryOptions[i][0];
        setCutOff(deliveryOptions[i][1], deliveryOptions[i][2]);
        
        if(nextDate == null || dateFrom < nextDate)
        {
            nextDate = dateFrom;
            nextCutoffDate = newDate();
            nextCutoffDate.setHours(deliveryOptions[i][1], deliveryOptions[i][2],0,0);
            //alert('Next Cut Off ' + nextCutoffDate);
            //alert('Next Date ' + nextDate);
            //alert('Date Now ' + dateNow);
            if (nextCutoffDate < dateNow) //missed today's cut off so use day before nextDate
            {
                nextCutoffDate = new Date(nextDate.getTime());
                nextCutoffDate.setHours(deliveryOptions[i][1], deliveryOptions[i][2], 0, 0);
                nextCutoffDate = new Date(nextCutoffDate.getTime() - 86400000); 
            }
            nextService = deliveryOptions[i][3];
        }
    }
    //alert(nextDate);
    window.document.getElementById("nextDeliveryDate").innerHTML = DAYS_OF_WEEK[nextDate.getDay()] + ", " + MONTHS_OF_YEAR[nextDate.getMonth()] + " " + nextDate.getDate() + "? ";
    window.document.getElementById("nextDeliveryCutoffTime").innerHTML = timeDifference(nextCutoffDate, dateNow) + " ";
    window.document.getElementById("nextDeliveryService").innerHTML = nextService;
}

function timeDifference(date1, date2)
{
    diff_ms = date1 - date2;
    diff_mins = Math.ceil(diff_ms / 60000);
    diff_hours = 0;
    if(diff_mins > 59)
    {
        diff_hours = Math.floor(diff_mins / 60);
        diff_mins = diff_mins % 60;
    }
    diff_string = ""
    if(diff_mins != 0)
        diff_string = diff_mins + ' minute' + (diff_mins > 1 ? 's' : '');
    if(diff_hours != 0)
        diff_string = diff_hours + ' hour' + (diff_hours > 1 ? 's' : '') + ' and ' + diff_string;
    return diff_string;
}

function setCutOff(hour, min)
{
    //alert("CutOff " + hour + "-" + min);
    var dateCutoff = newDate();
    //alert("dateNow " + dateNow.toString());
    dateCutoff.setHours(hour, min, 0, 0);
    //alert("dateCutoff " + dateCutoff.toString());
    dateFrom = newDate();
    
    if(dateNow > dateCutoff || dateNow.getDay() == 6 || dateNow.getDay() == 0) { //if missed today's cutoff or today is Sat or Sun
        dateFrom.setDate(dateNow.getDate() + 2);
        if(dateFrom.getDay() == 0) {//dateFrom is Sunday so must be weekend so cannot pick for this Monday  
          dateFrom.setDate(dateFrom.getDate() + 2);
        }
        else if(dateFrom.getDay() == 1) {//dateFrom is set to Monday so must be weekend so cannot pick for this Monday  
          dateFrom.setDate(dateFrom.getDate() + 1);
        }    
    } else {
	    dateFrom.setDate(dateNow.getDate() + 1);
    }
    loopCount = 0;
    while((!dayOfWeekIsEnabled(dateFrom.getDay()) || isBankHoliday(dateFrom)) && loopCount < 999) 
    {
        loopCount++;
        dateFrom.setDate(dateFrom.getDate() + 1);
    }
    dateFrom.setHours(0,0,1,0);
    //alert("dateFrom " + dateFrom.getDate());
    dateFirst = undefined;
}

//this function is called by the calendar as it renders each individual day for displayed month/year
//checks whether day should be disabled. returns true if day disabled
function dateStatusHandler(date, y, m, d) {
    if (date.getDay() == 0) { //No Sunday
      return true;
    }

    if (date < dateFrom) { //No earlier than dateFrom
      return true;
    }
    
    if (!(dayOfWeekIsEnabled(date.getDay()))) return true;   

  var bh = BANK_HOLIDAYS[y + "-" + (m + 1)]; //note: month is zero based in javascript
  if (bh) 
    for (var i in bh) if (bh[i] == d) 
      return true;

  if (dateFirst === undefined || date < dateFirst || dateFirst.getMonth() != date.getMonth()) {
     // alert(date + " - " + dateFirst + ' - ' + y + '.' + m + '.' + d);
      
    dateFirst = new Date(date.getTime());
    //dateFirst.setYear(y); 
    //dateFirst.setMonth(m);
    //dateFirst.setDate(d);
  }

//    if(d == 30)
//    { alert(result + " - " + m);
//        alert('Date From '  + dateFrom + ' Date ' + date);
//    }
   return false;
    // return true above if you want to disable other dates
}

function setDeliveryDate(value)
{
    document.getElementById("deliveryDate").value = value;
}


function flatCalendarCallback(cal) {
	if (cal.dateClicked) {
		setDeliveryDate(cal.date.print("%d %B %Y"));
	}
};


//this function is called by edit_carriage.asp to set the calendar selected date to the currently
//selected date for the carriage being edited
function setSelectedDate(year, month, day)
{
    var d = newDate();
    d.setYear(year); 
    d.setMonth(month);
    d.setDate(day);
    cal.setDate(d);
    setDeliveryDate(d.getDate() + ' '  + MONTHS_OF_YEAR[d.getMonth()] + ' ' + d.getFullYear());
}

