var Calendar = {

    events : {},

    eventGroups : {},

    id : {
        month : "calendar.id.month",
        datestr : "calendar.id.datestr"
    },

    aaddLink : true,

    data : {

    daysInMonth : [31,28,31,30,31,30,31,31,30,31,30,31],
    months : ["January","February","March","April","May","June","July","August","September","October","November","December"],
    dateSelected : null

    },

    console : {

        id : "calendar.console",

        out : function (str) {
            document.getElementById(Calendar.console.id).innerHTML = str;
        }

    },


    populateWithMonth : function(month, year) {
        var currentDate = new Date();
        currentDate.setMonth(month);
        currentDate.setFullYear(year);
        currentDate.setDate(1);
        Calendar.currentDate = currentDate;
        Calendar.redrawMonth();
    },

    rollMonth : function(forwards) {
        Calendar.dateSelected = null;
        if (forwards) {
            Calendar.currentDate.setMonth(Calendar.currentDate.getMonth() + 1);
        } else {
            Calendar.currentDate.setMonth(Calendar.currentDate.getMonth() - 1);
        }
        Calendar.redrawMonth();
    },

    dateChoosen : function(elm, output) {
        Calendar.selectDate(elm);
        if (output) {
            var str = "";
            var events = Calendar.events[elm.eventId];
            if (events) {
                for (var i = 0; i < events.length; i++) {
                    str += events[i].name + " " + events[i].startTime + "<br>";
                }
            } else {
                str += "No events";
            }
            Calendar.console.out(str);
        }
    },

    selectDate : function(elm) {
        if (Calendar.dateSelected) {
            Calendar.deselectDate(Calendar.dateSelected);
        }
        elm.className = "cellselected";
        Calendar.dateSelected = elm;
    },

    deselectDate : function(elm) {
        elm.className = "cell";
    },

    addEventToDay : function (parent, eventObj, color, addLink) {
        var div = document.createElement("div");
        if (eventObj.id) {
            div.innerHTML = "<a href=\"event/?id="+eventObj.id+"\">"+eventObj.name+"</a>";
        } else {
            div.innerHTML = eventObj.name;
        }
        div.className = "cellentry";
//        div.style.backgroundColor = color;
        div.parent = parent;
        div.eventObj = eventObj;
        if (addLink) {
            div.onclick = function(e) {
                var ent = window.event || e;
                ent.returnValue = false;
                ent.cancelBubble = true;
                Calendar.console.out(Calendar.buildEventString(this.eventObj));
                Calendar.dateChoosen(this.parent, false);
            }
        }
        parent.appendChild(div);
    },

    buildEventString : function (eventObj) {

        var str = "";
        str += "Event: <a class=\"link\" href=\"admin.calendar.event.edit.action?event.eventId=" + eventObj.id + "\">" + eventObj.name + "</a><br/>";
        str += "Location: " + eventObj.location + "<br/>";
        str += "Start Time: " + eventObj.startTime + "<br/>";
        str += "End Time: " + eventObj.endTime + "<br/>";
        str += "Description: " + eventObj.description + "<br/>";
        str += "Tags: " + eventObj.tags + "<br/>";
        str += "<a class=\"link\" href=\"admin.calendar.event.viewattendees.action?event.eventId=" + eventObj.id + "\">View Attendees</a><br/>";

        return str;
    },

    getDateSelected : function () {

        if (Calendar.dateSelected) {

            return Calendar.dateSelected.dateValue;

        }
    },


    redrawMonth : function(date) {
        var startDate = date ? date : Calendar.currentDate;
        var cal = document.getElementById(Calendar.id.month);

        //set the title
        document.getElementById(Calendar.id.datestr).innerHTML = Calendar.data.months[startDate.getMonth()] + " " + startDate.getFullYear();
        var offset = startDate.getDay() - 1;
        //sunday at the end of the week
        if (offset < 0) {
            offset = 6;
        }
        var day = 1;

        for (var i = 1; i < 7; i++) {
            var row = cal.rows[i];
            for (var j = 0; j < 7; j++) {
                var cell = row.cells[j];

                if (j == 0) {
                    cell.className = "first cell";
                } else {
                    cell.className = "cell";
                }
                cell.eventId = "";
                cell.innerHTML = "";
                if (i == 1 && j < offset) {
                    continue;
                } else {
                    if (day <= Calendar.data.daysInMonth[startDate.getMonth()]) {
                        cell.eventId = Calendar.encodeId(day, startDate);
                        Calendar.addEventToDay(cell, {name:day}, "", false);
                        if (Calendar.events[cell.eventId]) {
                            for (var k = 0; k < Calendar.events[cell.eventId].length; k++) {
                                var eventObj = Calendar.events[cell.eventId][k];
                                Calendar.addEventToDay(cell, eventObj, Calendar.getEventGroupColor(eventObj.eventGroupId), Calendar.addLink);
                            }
                        }
                    }
                    day++;
                }
            }
        }
    },

    //takes the data and encodes it into an id
    encodeId : function(day, startDate) {
        return "event_" + day + "_" + (startDate.getMonth() + 1 + "_" + startDate.getFullYear());
    },

    getEventGroupColor : function (id) {
        return Calendar.eventGroups["eventGroup_" + id].color;
    }

};
