﻿Date.prototype.add = function (sInterval, iNum){
  var dTemp = this;
  if (!sInterval || iNum == 0) return dTemp;
  switch (sInterval.toLowerCase()){
    case "ms":
      dTemp.setMilliseconds(dTemp.getMilliseconds() + iNum);
      break;
    case "s":
      dTemp.setSeconds(dTemp.getSeconds() + iNum);
      break;
    case "mi":
      dTemp.setMinutes(dTemp.getMinutes() + iNum);
      break;
    case "h":
      dTemp.setHours(dTemp.getHours() + iNum);
      break;
    case "d":
      dTemp.setDate(dTemp.getDate() + iNum);
      break;
    case "mo":
        //alert(dTemp.getMonth());
      dTemp.setMonth(dTemp.getMonth() + iNum);
        //alert(dTemp.getMonth());
      break;
    case "y":
      dTemp.setFullYear(dTemp.getFullYear() + iNum);
      break;
  }
  return dTemp;
}

function Calendar(container)
{
    var MonthNames = new Array('Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь');
    var WeekdayNames = new Array('вс','пн','вт','ср','чт','пт','сб');
    var DaysCount = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    
    var DayLinkTemplate = "<a href=\"/Date/{year}-{month}-{day}\">{day_number}</a>";
    var WeekDayTamplate = "<div class=\"week\">{weekday}</div>";
    var HolidayWeekdayTemplate = "<div class=\"week sb\">{weekday}</div>";
    var MonthNameTemplate = "<div class=\"monthTitle_text\">{MonthName}</div>";
    
    var CurrentMonth;
    var NextMonth;
    var PreviousMonth;
     
    
    this.Today = new Date();
    this.CurrentDate = new Date();
    
    this.GetMonthName = function(month)
    {
        return MonthNames[month];
    }
    this.GetWeekdayName = function(weekday)
    {
        return WeekdayNames[weekday];
    }
    
    this.InitCalendar = function()
    {
        var html = '';
        //Init Month header
        CurrentMonth = this.Today.getMonth();
        
        if(CurrentMonth == 11)
            NextMonth = 0;
        else
            NextMonth = CurrentMonth + 1;
            
        if(CurrentMonth == 0)
            PreviousMonth = 11;
        else
            PreviousMonth = CurrentMonth - 1;
            
        html = MonthNameTemplate.replace("{MonthName}", this.GetMonthName(CurrentMonth));
        $("#" + container + " .monthTitle").html(html);
        
        $("#btnNextMonth").bind("click",GetNextMonth);
        $("#btnPrevMonth").bind("click",GetPreviousMonth);
        
        //Init weekdays
        html = '';
        for(i=0; i<7; i++)
        {
            if(i == 6)
            {
                html += HolidayWeekdayTemplate.replace("{weekday}", this.GetWeekdayName(i));
            }
            else
            {
                html += WeekDayTamplate.replace("{weekday}", this.GetWeekdayName(i));
            }
        }
        $("#" + container + " .weekdays").html(html);
        
        //Init Days
        GenerateDates(this.Today);
    }
    
    this.InitCalendar();
    
    function GetNextMonth(e) {
        
        e.preventDefault();
        e.stopPropagation();
        e.stopImmediatePropagation();
        //calendar.CurrentDate.add("mo", 1);
        var dayMonthIndex = (calendar.CurrentDate.getMonth() + 1) > 11 ? 0 : calendar.CurrentDate.getMonth() + 1;
        calendar.CurrentDate.add("d", DaysCount[dayMonthIndex]);
        
        if(CurrentMonth == 11)
            CurrentMonth = 0;
        else
            CurrentMonth += 1;
        
        html = '';
        html = MonthNameTemplate.replace("{MonthName}", calendar.GetMonthName(CurrentMonth));
        $("#" + container + " .monthTitle").html(html);
            
        if(CurrentMonth == 11)
            NextMonth = 1;
        else
            NextMonth = CurrentMonth + 1;
            
        if(CurrentMonth == 0)
            PreviousMonth = 11;
        else
            PreviousMonth = CurrentMonth - 1;

        GenerateDates(calendar.CurrentDate);
    }
    
    function GetPreviousMonth(e) {
        e.preventDefault();
        e.stopPropagation();
        e.stopImmediatePropagation();
        //alert("Before: " + calendar.CurrentDate);
        var dayMonthIndex = calendar.CurrentDate.getMonth();
        calendar.CurrentDate.add("d", (-1 * DaysCount[dayMonthIndex]));
        //calendar.CurrentDate.add("mo", -1);
        //alert("After: " + calendar.CurrentDate);
        
        if(CurrentMonth == 0)
            CurrentMonth = 11;
        else
            CurrentMonth -= 1;
        
        html = '';
        html = MonthNameTemplate.replace("{MonthName}", calendar.GetMonthName(CurrentMonth));
        $("#" + container + " .monthTitle").html(html);
        
        if(CurrentMonth == 11)
            NextMonth = 0;
        else
            NextMonth = CurrentMonth + 1;
            
        if(CurrentMonth == 0)
            PreviousMonth = 11;
        else
            PreviousMonth = CurrentMonth - 1;
        
        GenerateDates(calendar.CurrentDate);
    }
    
    function GenerateDates(date)
    {
        var CurrentDaysCount = DaysCount[date.getMonth()];
        var html = '';
        var DaysHasEvents = GetDaysHasEvents(date.getMonth(), date.getFullYear());
        
        //alert(DaysHasEvents);
        if((date.getFullYear() % 4) == 0)
        {
            CurrentDaysCount += 1;
        }
        
        var DaysBeforeThisMonth = new Date(date.getFullYear(), date.getMonth(), 1, 0, 0, 0, 0).getDay();
        var DaysAfterThisMonth = 42 - (DaysBeforeThisMonth + CurrentDaysCount);
        
        //Print Previuos Month Days
        for(i=0; i < DaysBeforeThisMonth; i++)
        {
            if(((i+1) % 7) == 0 && i > 0)
            {
                html += "<div class=\"day_sub sb holyday\"></div>";
            }
            else
            {
                html += "<div class=\"dayB\"></div>";
            }
        }
        
        //Print Current Month Days
        for(i= DaysBeforeThisMonth; i < (DaysBeforeThisMonth + CurrentDaysCount); i++)
        {
            if(((i - DaysBeforeThisMonth) + 1) < 32)
            {
                var DayLink = "";
                var TodayClass = CompareDates(new Date(date.getFullYear(), date.getMonth(), (i - DaysBeforeThisMonth) + 1, 0, 0, 0, 0), new Date()) ? " today" : "";
                
                //Find out if the day has events
                if($(DaysHasEvents).index((i - DaysBeforeThisMonth) + 1) > -1)
                {
                    DayLink = DayLinkTemplate.replace("{day_number}", ((i - DaysBeforeThisMonth) + 1)).replace("{year}", date.getFullYear()).replace("{month}", (date.getMonth() + 1) < 10 ? "0" + (date.getMonth() + 1) : (date.getMonth() + 1)).replace("{day}", ((i - DaysBeforeThisMonth) + 1) < 10 ? "0" + ((i - DaysBeforeThisMonth) + 1) : ((i - DaysBeforeThisMonth) + 1));
                }
                else
                {
                    DayLink = (i - DaysBeforeThisMonth) + 1;
                }
                
                if(((i+1) % 7) == 0)
                {
                    
                    html += "<div class=\"day_sub sb" + (TodayClass == "" ? " holyday" : TodayClass) + "\"><div class=\"number\">" + DayLink + "</div></div>";
                }
                else
                {
                    html += "<div class=\"day" + TodayClass + "\"><div class=\"number\">" + DayLink + "</div></div>";
                }
            }
        }
        
        //Print Next Month Days
        for(i=(DaysBeforeThisMonth + CurrentDaysCount); i < 42; i++)
        {
            if(((i+1) % 7) == 0)
            {
                html += "<div class=\"day_sub sb holyday\"></div>";
            }
            else
            {
                html += "<div class=\"dayB\"></div>";
            }
        }
        
        $("#" + container + " .dates").html(html);
    }
    
    function GetDaysHasEvents(month, year)
    {
        var returnArray = new Array();
        var requestUrl = "/Handlers/GetShowDaysByMonth.ashx?year=" + year + "&month=" + (month + 1) + "&tile=" + Math.floor(Math.random()*9999999999);
        
        $.ajax({
          type: "GET",
          url: requestUrl,
          async: false,
          error: function(XMLHttpRequest, textStatus, errorThrown)
          {},
          success: function (data, textStatus) {
                $(data).find("day").each(
                    function()
                    {
                        returnArray.push(parseInt($(this).text()));
                    }
                );
            }
        });
        return returnArray;
    }
    
    function CompareDates(date1, date2)
    {
        if((date1.getFullYear() == date2.getFullYear()) && (date1.getMonth() == date2.getMonth()) && (date1.getDate() == date2.getDate()))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

