#!/bin/bash

ERROR()
{
  echo -e "\033[31mError!\033[0m Enter a valid month (1-12) and year (1-9999)."
  exit 1
}

if   [ -z $1 ]; then
     MONTH=`date +%m`
     [ $MONTH -le 9 ] && MONTH=${MONTH#0}
     YEAR=`date +%Y`
elif [ -z $2 ]; then
     [ $1 -le 12 ] && MONTH=$1 && YEAR=`date +%Y` || ERROR
elif [ -n $2 ]; then
     [ $1 -le 12 -a $2 -le 9999 ] && MONTH=$1 && YEAR=$2 || ERROR
fi

[ $(($YEAR%4)) -eq 0 ] && FEB_DAYS=29 || FEB_DAYS=28

if [ $YEAR -ge 1800 ]; then
   [ $(($YEAR%100)) -eq 0 ] && FEB_DAYS=28
   [ $(($YEAR%400)) -eq 0 ] && FEB_DAYS=29
fi

if   [ $MONTH = 1 ]; then
     echo -e "\033[9G\033[33mJanuary $YEAR\033[0m"
     DAYS=31
elif [ $MONTH = 2 ]; then
     echo -e "\033[8G\033[33mFebruary $YEAR\033[0m"
     DAYS=$FEB_DAYS
elif [ $MONTH = 3 ]; then
     echo -e "\033[10G\033[33mMarch $YEAR\033[0m"
     DAYS=31
elif [ $MONTH = 4 ]; then
     echo -e "\033[10G\033[33mApril $YEAR\033[0m"
     DAYS=30
elif [ $MONTH = 5 ]; then
     echo -e "\033[11G\033[33mMay $YEAR\033[0m"
     DAYS=31
elif [ $MONTH = 6 ]; then
     echo -e "\033[10G\033[33mJune $YEAR\033[0m"
     DAYS=30
elif [ $MONTH = 7 ]; then
     echo -e "\033[10G\033[33mJuly $YEAR\033[0m"
     DAYS=31
elif [ $MONTH = 8 ]; then
     echo -e "\033[9G\033[33mAugust $YEAR\033[0m"
     DAYS=31
elif [ $MONTH = 9 ]; then
     echo -e "\033[8G\033[33mSeptember $YEAR\033[0m"
     DAYS=30
elif [ $MONTH = 10 ]; then
     echo -e "\033[9G\033[33mOctober $YEAR\033[0m"
     DAYS=31
elif [ $MONTH = 11 ]; then
     echo -e "\033[8G\033[33mNovember $YEAR\033[0m"
     DAYS=30
elif [ $MONTH = 12 ]; then
     echo -e "\033[8G\033[33mDecember $YEAR\033[0m"
     DAYS=31
fi

echo -e "\033[33m---------------------------\033[0m"
echo -e "\033[32mSun Mon Tue Wed Thu Fri Sat\033[0m"
echo -e "\033[33m---------------------------\033[0m"

[ $MONTH -eq 01 ] && PREV_DAYS=0
[ $MONTH -eq 02 ] && PREV_DAYS=31
[ $MONTH -eq 03 ] && PREV_DAYS=$((31+$FEB_DAYS))
[ $MONTH -eq 04 ] && PREV_DAYS=$((62+$FEB_DAYS))
[ $MONTH -eq 05 ] && PREV_DAYS=$((92+$FEB_DAYS))
[ $MONTH -eq 06 ] && PREV_DAYS=$((123+$FEB_DAYS))
[ $MONTH -eq 07 ] && PREV_DAYS=$((153+$FEB_DAYS))
[ $MONTH -eq 08 ] && PREV_DAYS=$((184+$FEB_DAYS))
[ $MONTH -eq 09 ] && PREV_DAYS=$((215+$FEB_DAYS))
[ $MONTH -eq 10 ] && PREV_DAYS=$((245+$FEB_DAYS))
[ $MONTH -eq 11 ] && PREV_DAYS=$((276+$FEB_DAYS))
[ $MONTH -eq 12 ] && PREV_DAYS=$((306+$FEB_DAYS))
[ $YEAR -gt 1752 ] && PREV_DAYS=$(($PREV_DAYS-11))
[ $MONTH -gt 09 -a $YEAR -eq 1752 ] && PREV_DAYS=$(($PREV_DAYS-11))

PREV_YEARS=$(($YEAR-1))

if [ $YEAR -lt 1800 ]; then
   LEAP_DAYS=$(($PREV_YEARS/4))
else
   LEAP_DAYS=$((($PREV_YEARS/4)-(($PREV_YEARS/100)-17)+(($PREV_YEARS/400)-4)))
fi

TOTAL_DAYS=$(($PREV_YEARS*365+$LEAP_DAYS+$PREV_DAYS))
INTEGER=`echo "scale=1; $TOTAL_DAYS / 7" | bc`
[ $TOTAL_DAYS -eq 0 ] && SCALE=0 || SCALE=`echo $INTEGER | cut -d. -f2`

[ $SCALE -eq 1 ] && DAY=SUN && COLUMN=2
[ $SCALE -eq 2 ] && DAY=MON && COLUMN=6
[ $SCALE -eq 4 ] && DAY=TUE && COLUMN=10
[ $SCALE -eq 5 ] && DAY=WED && COLUMN=14
[ $SCALE -eq 7 ] && DAY=THU && COLUMN=18
[ $SCALE -eq 8 ] && DAY=FRI && COLUMN=22
[ $SCALE -eq 0 ] && DAY=SAT && COLUMN=26

for ((N=1; N <= $DAYS; N++))
do
  [ $N -le 9 ] && N=" $N"
  [ $COLUMN -eq 2 ] && COLOUR="\033[31m"
  echo -en "\033[${COLUMN}G${COLOUR}${N}\033[0m"
  unset COLOUR
  COLUMN=$((COLUMN+4))
  [ $N -eq 3 -a $MONTH -eq 9 -a $YEAR -eq 1752 ] && N=$((N+11))
  [ $COLUMN -gt 27 ] && echo -en "\n" && COLUMN=2
done

echo -e "\n\033[33m---------------------------\033[0m"
