
function special_dates(date, y, m, d) {
    // inputs: DATE, MONTH,  MONTH YOU WANT TO CHECK, WHICH WEEK (1=1st, 2=2nd etc), WHICH WEEKDAY
    // Wgtn anniversary day
    if(find_day(date,m,0,3,1)) return true;
    // Labour Day = 4th Monday of October
    if(find_day(date,m,9,4,1)) return true;
    // Queen's Birthday = 1st Monday of June
    if(find_day(date,m,5,1,1)) return true;
}

var wkcount=0;
function find_day(date,m,tm,w,td) {
    var myDate =0;
    if(tm != m){
        return false;
    } else {
        if(date.getDay() == td){
           wkcount++;
           if(wkcount == w){
//    alert(date+' '+date.getDay()+' '+td+' '+wkcount+' '+w);
               myDate = 1;
           }
        }
    }
    if(date.getDate() == 31 && (m == 0 || m == 2 || m == 4 || m == 6 || m == 7 || m == 9 || m == 11)){
      wkcount =0;
    }
    if(date.getDate() == 30 && (m == 3 || m == 5 || m == 8 || m == 10)){
      wkcount = 0;
    }
    if(date.getDate() == 28 && m == 1){
      wkcount = 0;
    }
    if(myDate==1){
       return true;
    } else {
       return false;
    }
}

//  EASTER FUNCTIONS
//  ~~~~~~~~~
function IntDiv (num, dvsr)
         // performs integer division of num/dvsr - eg IntDiv(9,4)=2
{
   var negate = false;
   var result = 0;

   if (dvsr == 0)
      return null;
   else {
       if (num * dvsr < 0 )
           negate = true;
           if (num < 0)
                num = -num;
                if (dvsr < 0)
                      dvsr = -dvsr;
                result = ((num - (num % dvsr)) / dvsr);
                if (negate)
                   return -result;
                else
                   return result;
   }
}

function EasterWestern(date){
   var year = date.getFullYear();
   var wDay = 0;
   var wMonth = 0;
   var g = 0;
   var c = 0;
   var h = 0;
   var i = 0;
   var j = 0;
   var p = 0;
   g = year % 19;
   c = IntDiv(year, 100);
   h = (c - IntDiv(c, 4) - IntDiv(8 * c + 13, 25) + 19 * g + 15) % 30;
   i = h - IntDiv(h, 28) * (1 - IntDiv(h, 28) * IntDiv(29, h + 1) * IntDiv(21 - g, 11));
   j = (year + IntDiv(year, 4) + i + 2 - c + IntDiv(c, 4)) % 7;
   p = i - j + 28;

   wDay = p;
   wMonth = 4;
   if (p > 31)
     wDay = p - 31;
   else
     wMonth = 3;

   if(date.getMonth() == (wMonth-1) && date.getDate() == (wDay-2)) return true; // is easter friday
   if(date.getMonth() == (wMonth-1) && date.getDate() == wDay) return true; // is easter sunday
   if(date.getMonth() == (wMonth-1) && date.getDate() == (wDay+1)) return true; // is easter monday
}

var SPECIAL_DAYS = {
    0 : [ 1, 2 ],        // special days in January
    1 : [ 6 ],           // special days in Feb
    3 : [ 25 ], // special days in April
    11 : [ 25, 26 ]      // special days in December
}

function dateIsSpecial(year, month, day) {
    var m = SPECIAL_DAYS[month];
    if (!m) return false;
    for (var i in m) if (m[i] == day) return true;
    return false;
}

function dateStatusHandler(date, y, m, d) {
// alert(date+' '+y+' '+m+' '+d+' here');
    if(date.getDay() == 0){
      return true;
    } else if (dateIsSpecial(y, m, d)){
      return "disabled special";
    } else if (special_dates(date, y, m, d)){
      return "disabled spacial";
    } else if (EasterWestern(date)){
      return "disabled special";
    }
}
