function PrevYear()
{
    if (SelectedYear>Begin)
        {
        SelectedYear--;
        GetEventDays();
        }
}
function NextYear()
{
    if (SelectedYear<End)
        {
        SelectedYear++;
        GetEventDays();
        }
}

function PrevMonth()
{
    if (!(SelectedYear<=Begin && SelectedMonth==1))
        {
        SelectedMonth--;
        if (SelectedMonth<=0)
            {
            SelectedYear--;
            SelectedMonth = 12;
            }
        GetEventDays();
        }
}
function NextMonth()
{
    if (!(SelectedYear>=End && SelectedMonth==12))
        {
        SelectedMonth++;
        if (SelectedMonth>=13)
            {
            SelectedYear++;
            SelectedMonth = 1;
            }
        GetEventDays();
        }
}

function GetEventDays()
{            
     if (document.all)
        {// IE + Firefox
        document.all["CalendarDiv"].innerHTML = "<img src='../images/loading.gif' border=0 alt='...'>";
        }
    else
        {                
        document.getElementById("CalendarDiv").innerHTML = "<img src='../images/loading.gif' border=0 alt='...'>";
        }
    xmlhttp=null;
    if (window.XMLHttpRequest)
      {// code for all new browsers
      xmlhttp=new XMLHttpRequest();
      }
    else if (window.ActiveXObject)
      {// code for IE5 and IE6
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    if (xmlhttp!=null)
      {
      xmlhttp.onreadystatechange=returnEvents;
      xmlhttp.open("GET",PageName + "?Month=" + SelectedMonth + "&Year=" + SelectedYear,true);
      xmlhttp.send(null);
      }
    else
      {
      alert("Your browser does not support XMLHTTP.");
      }	        
}

function returnEvents()
{  
    
    if (xmlhttp.readyState==4)
    {// 4 = "loaded"
    if (xmlhttp.status==200)
        {
        EventDays = xmlhttp.responseText;                                
        LoadCalendar(SelectedYear, SelectedMonth, SelectedDays, EventDays);                
        }
    }
}

function LoadCalendar(SelectedYear, SelectedMonth, SelectedDays, EventDays) {
    //alert(EventDays);
    var ReturnText = ("<table border=1 cellspacing=0 cellpadding=3 style='border-collapse: collapse;' borderColor='Black'>");
    // Loading Header            
    ReturnText = ReturnText + ("<tr>");
    if (Begin<SelectedYear)
        ReturnText = ReturnText + ("<td class=CalendarHeader><a href='javascript:PrevYear()'><<</a></td>");
    else
        ReturnText = ReturnText + ("<td class=CalendarHeader></td>");
    
    if ((Begin==SelectedYear && SelectedMonth==1) || (Begin>SelectedYear))
        ReturnText = ReturnText + ("<td class=CalendarHeader></td>");            
    else
        ReturnText = ReturnText + ("<td class=CalendarHeader><a href='javascript:PrevMonth()'><</a></td>");            
        
    ReturnText = ReturnText + ("<td colspan=3 class=CalendarHeader>" + Months[SelectedMonth-1] + " " + SelectedYear +  "</td>");
    
    if ((End==SelectedYear && SelectedMonth==12) || (End<SelectedYear))
        ReturnText = ReturnText + ("<td class=CalendarHeader></td>");            
    else
        ReturnText = ReturnText + ("<td class=CalendarHeader><a href='javascript:NextMonth()'>></a></td>");            
    
    if (End>SelectedYear)
        ReturnText = ReturnText + ("<td class=CalendarHeader><a href='javascript:NextYear()'>>></a></td>");            
    else
        ReturnText = ReturnText + ("<td class=CalendarHeader></td>");
    ReturnText = ReturnText + ("</tr>");
    
    
    ReturnText = ReturnText + ("<tr>");
    for (var i=0; i<WeekDay.length; i++)
    {        
        ReturnText = ReturnText + ("<td class=WeekDays>" + WeekDay[i] + "</td>");
    }
    ReturnText = ReturnText + ("</tr>");
                    
    var LastDay = GetLastDayOfMonth(SelectedMonth, SelectedYear);            
    var TempDate = new Date(SelectedYear,SelectedMonth -1,1);        
    var CalendarShift = TempDate.getDay();
            
    if (CalendarShift>0)
        ReturnText = ReturnText + ("<tr>");
    
    for (i=0; i<CalendarShift; i++)
    {        
        var TempOldDate = DateAdd(SelectedMonth + "/1/" + SelectedYear, "D",  i-CalendarShift);                        
        if (SelectedDays.indexOf("," + TempOldDate.getDate() + "-" + (parseInt(TempOldDate.getMonth())+1) + "-" + getYear(TempOldDate.getYear()) +  ",")>=0)        
            {
            ReturnText = ReturnText + ("<td class=SelectedOld>" + TempOldDate.getDate() + "</td>")
            }
        else
            {
            ReturnText = ReturnText + ("<td class=NotSelected>" + TempOldDate.getDate() + "</td>");
            }
    }
        
    var CurrentLocation = CalendarShift;
    
    for (var i=1; i<=LastDay; i++)
    {
        if (CurrentLocation>=7)
            {
            ReturnText = ReturnText + ("</tr>");
            CurrentLocation = 0;
            }
        if (CurrentLocation==0)
            {
            ReturnText = ReturnText + ("<tr>")
            }
                
        if (SelectedDays.indexOf("," + i + "-" + SelectedMonth + "-" + SelectedYear +  ",")>=0)        
            {
            if (isSelected(i, EventDays))
                {
                ReturnText = ReturnText + ("<td class=Selected style=\"cursor: hand\" onClick=\"LoadEvents("+i+", SelectedMonth, SelectedYear)\">")
                
                }
            else
                {
                ReturnText = ReturnText + ("<td class=Selected>");
                }            
            }
        else
            {
            if (isSelected(i, EventDays))
                {
                ReturnText = ReturnText + ("<td class=hasEvents style=\"cursor: hand\" onClick=\"LoadEvents("+i+", SelectedMonth, SelectedYear)\">")
                
                }
            else
                {
                    ReturnText = ReturnText + ("<td class=hasNoEvents  style=\"cursor: pointer\" onClick=\"LoadEvents(" + i + ", SelectedMonth, SelectedYear)\">");
                }
            }
        
        
        ReturnText = ReturnText + (i);
        
        
        ReturnText = ReturnText + ("</td>");
        CurrentLocation++;
            
    }
    for (i=0; i< 7-CurrentLocation; i++)
        {        
        var TempOldDate = DateAdd(SelectedMonth + "/" + LastDay + "/" + SelectedYear, "D",  i+1);  
        if (SelectedDays.indexOf("," + TempOldDate.getDate() + "-" + (parseInt(TempOldDate.getMonth())+1) + "-" + getYear(TempOldDate.getYear()) +  ",")>=0)        
            {
            ReturnText = ReturnText + ("<td class=SelectedOld>" + TempOldDate.getDate() + "</td>")
            }
        else
            {
            ReturnText = ReturnText + ("<td class=NotSelected>" + TempOldDate.getDate() + "</td>");
            }        
        }
    
    ReturnText = ReturnText + ("</tr>");        
    ReturnText = ReturnText + ("</table>");    
                                        
    if (document.all)
        {// IE + Firefox
        document.all["CalendarDiv"].innerHTML = ReturnText;
        }
    else
        {                
        document.getElementById("CalendarDiv").innerHTML = ReturnText;
        }
}

function GetLastDayOfMonth(Month, Year)
{            
    if (isDate(31, Month, Year))
        return 31;
    
    if (isDate(30, Month, Year))
        return 30;
    
    if (isDate(29, Month, Year))
        return 29;
    
    if (isDate(28, Month, Year))
        return 28;
}   

function isDate (day, month, year)
{	        
    // month argument must be in the range 1 - 12
    month = month - 1;  // javascript month range : 0- 11	        	        
    var tempDate = new Date(year,month,day);	        	        	        
    if ( (getYear(tempDate.getYear()) == year) && (month == tempDate.getMonth()) && (day == tempDate.getDate()) )
    {	
        return true;
    }	
    else
    {
        return false
    }
}

function isSelected(Day, SelectedDates)
{
if (SelectedDates.indexOf("," + Day + ",")>=0)
    return true;
else
    return false;
}
function getYear(d)
{ 
    return (d < 1000) ? d + 1900 : d;
}

function DateAdd(objDate, strInterval, intIncrement)
{
    if(typeof(objDate) == "string")
    {
        objDate = new Date(objDate);

        if (isNaN(objDate))
        {
            throw("DateAdd: Date is not a valid date");
        }
    }
    else if(typeof(objDate) != "object" || objDate.constructor.toString().indexOf("Date()") == -1)
    {
        throw("DateAdd: First parameter must be a date object");
    }

    if(
    strInterval != "M" && strInterval != "D" && strInterval != "Y" && strInterval != "h" && strInterval != "m" && strInterval != "uM" && strInterval != "uD" && strInterval != "uY" && strInterval != "uh" && strInterval != "um" && strInterval != "us")
    {
        throw("DateAdd: Second parameter must be M, D, Y, h, m, uM, uD, uY, uh, um or us");
    }

    if(typeof(intIncrement) != "number")
    {
        throw("DateAdd: Third parameter must be a number");
    }

    switch(strInterval)
    {
        case "M":
        objDate.setMonth(parseInt(objDate.getMonth()) + parseInt(intIncrement));
        break;

        case "D":
        objDate.setDate(parseInt(objDate.getDate()) + parseInt(intIncrement));
        break;

        case "Y":
        objDate.setYear(parseInt(objDate.getYear()) + parseInt(intIncrement));
        break;

        case "h":
        objDate.setHours(parseInt(objDate.getHours()) + parseInt(intIncrement));
        break;

        case "m":
        objDate.setMinutes(parseInt(objDate.getMinutes()) + parseInt(intIncrement));
        break;

        case "s":
        objDate.setSeconds(parseInt(objDate.getSeconds()) + parseInt(intIncrement));
        break;

        case "uM":
        objDate.setUTCMonth(parseInt(objDate.getUTCMonth()) + parseInt(intIncrement));
        break;

        case "uD":
        objDate.setUTCDate(parseInt(objDate.getUTCDate()) + parseInt(intIncrement));
        break;

        case "uY":
        objDate.setUTCFullYear(parseInt(objDate.getUTCFullYear()) + parseInt(intIncrement));
        break;

        case "uh":
        objDate.setUTCHours(parseInt(objDate.getUTCHours()) + parseInt(intIncrement));
        break;

        case "um":
        objDate.setUTCMinutes(parseInt(objDate.getUTCMinutes()) + parseInt(intIncrement));
        break;

        case "us":
        objDate.setUTCSeconds(parseInt(objDate.getUTCSeconds()) + parseInt(intIncrement));
        break;
    }
    return objDate;
}


