var MainContainer;
var CurrentDate = new Date();
CurrentDate.setDate(1);
var StartDate = new Date();
var EndDate = new Date();
var LastContentCall;
var ColLoc = 0;
var ContentLoc = 0;
var CalendarTable = "";
var Container1 = new Element('div', {
    "id" : "Container",
    "styles" : {
        "width" : "163px"
    }
});

// ---------------------------------------------------------------------------------
//  Calendar Init
// ---------------------------------------------------------------------------------
function CalendarInit(inCalendarTable) {
    CalendarTable = inCalendarTable;
    MainContainer = $("Calendar");
    BuildCalendar();
    Container1.setStyle("margin-left", "0");

}


// ---------------------------------------------------------------------------------
//  Build Calendar
// ---------------------------------------------------------------------------------
function BuildCalendar() {
    Container1.empty();
    Container1.setStyle("margin-left", -164);
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //  Reusable Elements
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    var DivClear = new Element("div", {
        "class" : "clear"
    });
    var DivDivider = new Element("div", {
        "class" : "Divider"
    });



    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //  TitleBar
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    var TitleBar = new Element("div", {
        "class" : "TitleBar"
    });

    var ArrowLeft = new Element("div", {
        "class" : "ArrowLeft"
    });
    var ArrowLeftImage = new Element("img", {
        "src" : "/_img/CalendarArrowLeft.jpg"
    });
    ArrowLeftImage.inject(ArrowLeft);

    var ArrowRight = new Element("div", {
        "class" : "ArrowRight"
    });
    var ArrowRightImage = new Element("img", {
        "src" : "/_img/CalendarArrowRight.jpg"
    });
    ArrowRightImage.inject(ArrowRight);

    var MonthName = new Element("div", {
        "class" : "MonthName"
    });
    MonthName.appendText(GetMonthName(CurrentDate) + " " + GetYear(CurrentDate));


    ArrowLeft.inject(TitleBar);
    MonthName.inject(TitleBar);
    ArrowRight.inject(TitleBar);

    TitleBar.inject(Container1);

    //Br.inject(Container1);
    DivClear.inject(Container1);

    var Body = new Element("div", {
        "class" : "Body"
    });
    DivClear.clone().inject(Body);



    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //  Week Headers
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    CCell = CreateCell("DayName","S","S");
    CCell.inject(Body);
    DivDivider.clone().inject(Body);
    CCell = CreateCell("DayName","M","M");
    CCell.inject(Body);
    DivDivider.clone().inject(Body);
    CCell = CreateCell("DayName","T","T");
    CCell.inject(Body);
    DivDivider.clone().inject(Body);
    CCell = CreateCell("DayName","W","W");
    CCell.inject(Body);
    DivDivider.clone().inject(Body);
    CCell = CreateCell("DayName","T","T");
    CCell.inject(Body);
    DivDivider.clone().inject(Body);
    CCell = CreateCell("DayName","F","F");
    CCell.inject(Body);
    DivDivider.clone().inject(Body);
    CCell = CreateCell("DayName","S","S");
    CCell.inject(Body);

    new Element("br", {
        "class" : "clear"
    }).inject(Body);
    DivClear.clone().inject(Body);


    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //  Handle First Week
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    var StartDay = CurrentDate.getDay();
    var LastMonth = DateAdd("m", -1, CurrentDate);
    var DaysInLastMonth = GetDaysInMonth(LastMonth);
    StartDate.setMonth(LastMonth.getMonth());
    StartDate.setDate(DaysInLastMonth - (StartDay - 1));
    if(LastMonth.getMonth() == 11) {
        StartDate.setFullYear(CurrentDate.getFullYear() - 1);
    } else {
        StartDate.setFullYear(CurrentDate.getFullYear());
    }
    StartDate.setMonth(LastMonth.getMonth());
    for (looper = 0; looper < StartDay; looper++) {
        ColLoc++;
        var DisplayDay = DaysInLastMonth - ((StartDay - 1) - looper);
        var DivID = (StartDate.getMonth() + 1).toString() + DisplayDay.toString();
        CCell = CreateCell("DifferentMonth", DisplayDay, DivID);
        CCell.inject(Body);
        if (ColLoc < 7) {
            DivDivider.clone().inject(Body);
        } else {
            new Element("br", {
                "class" : "clear"
            }).inject(Body);
            DivClear.clone().inject(Body);
            ColLoc = 0;
        }
    }
    for (looper = 1; looper < (7 - (StartDay-1)); looper++) {
        ColLoc++;
        var DivID = (CurrentDate.getMonth() + 1).toString() + looper.toString();
        CCell = CreateCell("ThisMonth", looper, DivID);
        CCell.inject(Body);
        if (ColLoc < 7) {
            DivDivider.clone().inject(Body);
        } else {
            new Element("br", {
                "class" : "clear"
            }).inject(Body);
            DivClear.clone().inject(Body);
            ColLoc = 0;
        }
    }
    NextDay = looper;
    DivClear.clone().inject(Body);

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //  Rest of the Month
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    DaysInMonth = GetDaysInMonth(CurrentDate);
    for (looper = NextDay; looper <= DaysInMonth; looper++) {
        ColLoc++;
        var DivID = (CurrentDate.getMonth() + 1).toString() + looper.toString();
        CCell = CreateCell("ThisMonth", looper, DivID);
        CCell.inject(Body);
        if (ColLoc < 7) {
            DivDivider.clone().inject(Body);
        } else {
            new Element("br", {
                "class" : "clear"
            }).inject(Body);
            DivClear.clone().inject(Body);
            ColLoc = 0;
        }
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //  Beginning of next Month
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    DisplayDay = 1;
    EndDate.setMonth(CurrentDate.getMonth() + 1);
    if(CurrentDate.getMonth() == 11) {
        EndDate.setFullYear(CurrentDate.getFullYear() + 1);
    } else {
        EndDate.setFullYear(CurrentDate.getFullYear());
    }
    for (looper = ColLoc; looper < 7; looper++) {
        ColLoc++;
        var DivID = (EndDate.getMonth() + 1).toString() + DisplayDay.toString();
        CCell = CreateCell("DifferentMonth", DisplayDay, DivID);
        DisplayDay ++;
        CCell.inject(Body);
        if (ColLoc < 7) {
            DivDivider.clone().inject(Body);
        } else {
            new Element("br", {
                "class" : "clear"
            }).inject(Body);
            DivClear.clone().inject(Body);
            ColLoc = 0;
        }
    }
    EndDate.setDate(DisplayDay);

    Body.inject(Container1);
    DivClear.clone().inject(Container1);



    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //  Main injection
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Container1.inject(MainContainer);


    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //  AddEvents
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ArrowLeft.addEvent("click", function() {
        SlideRight();
    });
    ArrowRight.addEvent("click", function() {
        SlideLeft();
    });

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //  Add Event Dates
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    var jsonURL = "/jsonTest.php?StartDate=" + (StartDate.getMonth() + 1) +
        "/" + StartDate.getDate() + "/" + StartDate.getFullYear() +
        "&EndDate=" + (EndDate.getMonth() + 1) +
        "/" + EndDate.getDate() + "/" + EndDate.getFullYear() +
        "&CalendarTable=" + CalendarTable;
    var request = new Request.JSON({
        url: jsonURL,
        onComplete: function(jsonObj) {
            if(jsonObj != null) {
                AddDates(jsonObj.CalDates);
            }
        }
    }).send();

}

var AddDates = function(CalDates) {
    CalDates.each(function(CalDate) {
        var DateCell = $(CalDate.CalID);
        if (DateCell) {
            var TheAnchor = new Element("a", {
                "href" : "javascript:;"
            });
            TheAnchor.appendText(CalDate.Display);
            var TheDiv = new Element("div", {
                "class" : CalDate.Venue
            });
            TheAnchor.inject(TheDiv);
            DateCell.empty();
            TheDiv.inject(DateCell);
            DateCell.addEvent("click", function() {
                GetContent(CalDate.Date);
            });
        }
    });
    //var tip = new Tips('a', {showDelay: 200, fixed: true, offsets: {"x" : 20, "y" : 0}});
};

function CreateCell(SpanClass, TheText, DivID) {
    var DivClass = "Cell";
    var CCell = new Element("div", {
        "class" : "Cell",
        "id" : DivID
    });

    var CSpan = new Element("span", {
        "class" : SpanClass
    });
    CSpan.appendText(TheText);
    CSpan.inject(CCell);
    return CCell;
}

// ---------------------------------------------------------------------------------
//  Slide functions
// ---------------------------------------------------------------------------------
function SlideLeft() {
    CurrentDate = DateAdd("m", 1, CurrentDate);
    BuildCalendar();
    var inFx = new Fx.Tween(Container1);
    inFx.start('margin-left', 164, 0);
}
function SlideRight() {
    CurrentDate = DateAdd("m", -1, CurrentDate);
    BuildCalendar();
    var inFx = new Fx.Tween(Container1);
    inFx.start('margin-left', -164, 0);

}

// ---------------------------------------------------------------------------------
//  GetContent
// ---------------------------------------------------------------------------------
function GetContent(inDate) {
    if (LastContentCall != inDate) {
        LastContentCall = inDate;
        var CurrentContentLoc = ContentLoc;
        ContentLoc++;
        var NextContentLoc = ContentLoc;
        var NewContent = new Element("div", {
            "class" : "NewContent",
            "id" : "nc" + NextContentLoc
        });
        var sContent = new Element("div", {
            "class" : "scrollContent",
            "id" : "id" + NextContentLoc
        });
        sContent.inject(NewContent);

        var Sbar = new Element("div", {
            "class" : "scrollbar"
        });
        var Knob = new Element("div", {
            "class" : "knob"
        });
        Knob.inject(Sbar);
        Sbar.inject(sContent, 'after');
        NewContent.inject($("CalendarContent"));
        var myajax = new Request.HTML({
            "url" : '/ajaxTest.php',
            "update" : sContent
        }).post("/ajaxTest.php?CalDate=" + inDate + "&CalendarTable=" + CalendarTable).chain(function(){
            var fx2 = new Fx.Tween(sContent);
            fx2.start("margin-left", 0).chain(function(){
                var myScrollbars = new Scrollbar(NewContent,{});
            });

        });
        var fx1 = new Fx.Tween($("id" + CurrentContentLoc));
        fx1.start("margin-left", 450).chain(function(){
            $("nc" + CurrentContentLoc).dispose();
        });
    }
}


// ---------------------------------------------------------------------------------
//  Date Functions
// ---------------------------------------------------------------------------------
function GetMonthName(inDate) {
    var MonthNames = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
    return MonthNames[inDate.getMonth()];
}

function GetYear(inDate) {
    var rv = inDate.getYear();
    if (rv < 1900) {
        rv += 1900;
    }
    return rv;
}

function GetDaysInMonth(inDate) {
    var TheMonth = inDate.getMonth();
    if (GetYear(inDate)/4 == (GetYear(inDate)/4).round()) {
        var arrDays = new Array(31,29,31,30,31,30,31,31,30,31,30,31);
    } else {
        var arrDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    }
    return arrDays[TheMonth];
}

function DateAdd(p_Interval, p_Number, p_Date){
    var dt = new Date(p_Date);
    p_Number = new Number(p_Number);

    switch(p_Interval.toLowerCase()){
        case "yyyy": {
            dt.setFullYear(dt.getFullYear() + p_Number);
            break;
        }
        case "q": {
            dt.setMonth(dt.getMonth() + (p_Number*3));
            break;
        }
        case "m": {
            dt.setMonth(dt.getMonth() + p_Number);
            break;
        }
        case "y":           // day of year
        case "d":           // day
        case "w": {     // weekday
            dt.setDate(dt.getDate() + p_Number);
            break;
        }
        case "ww": {    // week of year
            dt.setDate(dt.getDate() + (p_Number*7));
            break;
        }
        case "h": {
            dt.setHours(dt.getHours() + p_Number);
            break;
        }
        case "n": {     // minute
            dt.setMinutes(dt.getMinutes() + p_Number);
            break;
        }
        case "s": {
            dt.setSeconds(dt.getSeconds() + p_Number);
            break;
        }
        case "ms": {    // JS extension
            dt.setMilliseconds(dt.getMilliseconds() + p_Number);
            break;
        }
        default: {
            return "invalid interval: '" + p_Interval + "'";
        }
    }
    return dt;
}
