
var Calendar_Class = function(){

    this.init();
    
};

Calendar_Class.prototype.init = function(){

    this.container = $(document.body);
    
    this.daysSingle = ["S", "M", "T", "W", "T", "F", "S"];
    
    this.daysShort = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
    
    this.daysLong = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
    
    this.activeDays = "daysSingle";
    
    var present = new Date();
    
    this.presentDate = new Date((present.getMonth() + 1) + "/" + present.getDate() + "/" + present.getFullYear());
    
    this.currentDate = this.presentDate.getDate();
    
    this.currentMonth = this.presentDate.getMonth();
    
    this.currentYear = this.presentDate.getFullYear();
    
    this.currentDay = this.presentDate.getDay();
    
    this.daysLeading = this._getLeading();
    
    this.daysTrailing = this._getTrailing();
    
    this.monthDays = [31, (this.currentYear % 4 ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    
    this.monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    
    this.monthsLong = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    
    this.activeMonth = "monthsLong";
    
};

Calendar_Class.prototype._getLeading = function(){

    var monthFirst = new Date((this.currentMonth + 1) + "/1/" + this.currentYear);
    
    var monthFirstDay = monthFirst.getDay();
    
    return monthFirstDay;
    
    
};

Calendar_Class.prototype._getTrailing = function(){

    var monthLast = new Date((this.currentMonth + 2) + "/1/" + this.currentYear);
    
    var monthLastOffset = new Date((monthLast.getMonth() + 1) + "/" + (monthLast.getDate() - 1) + "/" + monthLast.getFullYear());
    
    var monthLastDay = monthLastOffset.getDay();
    
    return 6 - monthLastDay;
    
};

Calendar_Class.prototype.build = function(){

    var container = $("div#calendar");
    
    if (container.length == 0) {
    
        this.container.append("<div id='calendar'></div>");
        
    }
    else {
        container.html("");
    }
    
    var calendar = $("div#calendar");
    
    this._buildTitle();
    this._buildHeader();
    this._buildBody();
    
    
};

Calendar_Class.prototype._buildTitle = function(){

    var calendar = $("div#calendar");
    
    if (this.activeDays == "daysLong") {
        calendar.css({
            "width": "721px"
        });
    }
    else 
        if (this.activeDays == "daysShort") {
            calendar.css({
                "width": "371px"
            });
        }
        else 
            if (this.activeDays = "daysSingle") {
                calendar.css({
                    "width": "231px"
                });
            }
    
    calendar.append("<div id='calendarTitle'>" + this[this.activeMonth][this.currentMonth] + " " + this.currentYear + "</div>");
    
};

Calendar_Class.prototype._buildHeader = function(){

    var calendar = $("div#calendar");
    
    var i, len;
    
    var rElements = [];
    
    rElements.push("<div id='calendarHeader' class='hasLayout'>");
    
    for (i = 0, len = this[this.activeDays].length; i < len; i++) {
    
        var activeDay = this[this.activeDays][i];
        
        rElements.push("<div class='calendarDays'>" + activeDay + "</div>");
        
    }
    
    rElements.push("</div>");
    
    calendar.append(rElements.join(""));
    
};

Calendar_Class.prototype._buildBody = function(){

    var calendar = $("div#calendar");
    
    var rElements = [];
    
    rElements.push("<div id='calendarBody' class='hasLayout'>");
    
    /* Get Leading */
    var i, len;
    
    for (i = 0, len = this.daysLeading; i < len; i++) {
    
        rElements.push("<div class='days daysLeading'>&nbsp;</div>");
        
    }
    
    /* Get Month */
    for (i = 0, len = this.monthDays[this.currentMonth]; i < len; i++) {
    
        var testDate = (this.currentMonth + 1) + "/" + (i + 1) + "/" + this.currentYear;
        var currentDate = (this.currentMonth + 1) + "/" + this.currentDate + "/" + this.currentYear;
        
        if (testDate == currentDate) {
        
            rElements.push("<div class='days currentDay' date='current' day='" + testDate + "'>" + (i + 1) + "</div>");
            
        }
        else {
        
            rElements.push("<div class='days' date='none' day='" + testDate + "'>" + (i + 1) + "</div>");
            
        }
        
    }
    
    /* Get Trailing */
    
    for (i = 0, len = this.daysTrailing; i < len; i++) {
    
        rElements.push("<div class='days daysTrailing'>&nbsp;</div>");
        
    }
    
    rElements.push("</div>");
    
    calendar.append(rElements.join(""));
    
    var divDays = $("div.days");
    var cssObj = {};
    
    for (i = 0, len = divDays.length; i < len; i++) {
    
        var divDay = $(divDays[i]);
        
        var iDay = new Date($(divDay)[0].getAttribute("day"));
        
        var iDayTime = iDay.getTime();
        var presentDayTime = this.presentDate.getTime();
        
        if (iDayTime < presentDayTime) {
            $(divDays[i]).css({
                "color": "#999999"
            });
        }
        
        cssObj = this._getDayCSS(i);
        
        var isCurrent = $(divDay)[0].getAttribute("date") == "current" ? true : false;
        
        if (!$(divDay).hasClass("daysTrailing") && !$(divDay).hasClass("daysLeading") && !isCurrent) {
            $(divDays[i]).css(cssObj);
        }
        
    }
    
};

Calendar_Class.prototype._getDayCSS = function(index){

    var oObj = {};
    
    if (index % 7 == 0 || index % 7 == 6) {
    
        oObj = {
            "background-color": "#F4F4F4"
        };
        
    }
    
    return oObj;
    
};

Calendar_Class.prototype.show = function(){
    this.build();
    
    /*if (common.browser == "msie") {
        $("div#calendar div").css({
            "position": "relative",
            "left": "15px"
        });
    }*/
    
    $("div#calendar").show();
    
};

Calendar_Class.prototype.hide = function(){

    $("div#calendar").hide();
    
};

var calendar = new Calendar_Class();

calendar.show();
