﻿// Copyright (c) 2010 Graphic Vision NeuroInformatics, Inc.
// Version 3.00


Masada_300.Calendar = function(config)
{
    var This = this;
    var Container = this.Element = $$('div');
    Container.style.display = 'none';
    //Container.style.width = '800px';
    var Header = Container.appendChild($$('div'));
    Header.style.backgroundColor = '#bb9595';
    var Btn = Header.appendChild($$('img'));
    Btn.style.margin = '2px 0 0 5px';
    Btn.src = 'images/buttons/TodayBtn_60x22.png';
    Btn = Header.appendChild($$('img'));
    Btn.style.margin = '2px 0 0 470px';
    Btn.src = 'images/buttons/DayBtn_40x22.png';
    Btn = Header.appendChild($$('img'));
    Btn.style.margin = '2px 0 0 5px';
    Btn.src = 'images/buttons/WeekBtn_60x22.png';
    Btn = Header.appendChild($$('img'));
    Btn.style.margin = '2px 0 0 5px';
    Btn.src = 'images/buttons/MonthBtn_60x22.png';
    Btn.onclick = function() { alert('click'); }
    Btn = Header.appendChild($$('img'));
    Btn.style.margin = '2px 0 0 5px';
    Btn.src = 'images/buttons/5DayBtn_50x22.png';

    Header.style.height = '28px';
    var CalDiv = Container.appendChild($$('div'));
    CalDiv.style.cssFloat = CalDiv.style.styleFloat = 'left';

    var PickDiv = Container.appendChild($$('div'));
    PickDiv.style.backgroundColor = 'white';
    PickDiv.style.height = '500px';
    PickDiv.style.cssFloat = CalDiv.style.styleFloat = 'left';

    var Mode = 'Week';

    var Month = function(month, year)
    {
        var ThisMonth = this;
        this.Weeks = [];
        var Week = function(date)
        {
            var ThisWeek = this;
            this.Days = [];
            var Day = function(date)
            {
                this.IsInMonth = false;
                if (date.getMonth() == month) this.IsInMonth = true;
                this.ShortDate = Masada_300.ExtractDate(date, true);
                this.Date = Masada_300.ExtractDate(date);
                this.OfWeek = ThisWeek;
                this.DayOfWk = date.getDay();
                this.DayOfMth = date.getDate();
                this.WeekOfMth = ThisMonth.Weeks.length;
            }
            for (var i = 0; i < 7; i++)
            {
                var DayOfMonth = date.getDate();
                var NewDay = new Day(date);
                ThisWeek.Days.push(NewDay);
                date.setDate(DayOfMonth + 1);
            }
        }
        var DateStart = new Date(year, month, 1);
        var CursorDate = new Date(year, month, 1);
        var DayOfWeekStart = DateStart.getDay();
        CursorDate.setDate(-(DayOfWeekStart - 1));
        do
        {
            this.Weeks.push(new Week(CursorDate));
            //alert(CursorDate.getMonth());
        }
        while (CursorDate.getMonth() == month)

    }

    var CalendarWeek = function(config)
    {
        var This = this;
        var DayLabel = ['Sun', 'Mon', 'Tues', 'Wed', 'Thu', 'Fri', 'Sat'];

        var CalendarEvent = function()
        {
            this.StartTime = null;
            this.EndTime = null;
            this.Div = null;
        }

        var Events = [];
        Events[0] = new Array();
        Events[1] = new Array();
        Events[2] = new Array();
        Events[3] = new Array();
        Events[4] = new Array();
        Events[5] = new Array();
        Events[6] = new Array();

        var Container = $$('div');

        var HdrTbl = new Masada_300.Table().Visible(true);
        Container.appendChild(HdrTbl.Element);
        var WeekDiv = Container.appendChild($$('div'));
        WeekDiv.style.display = 'none';
        WeekDiv.style.overflow = 'scroll';

        var CalTbl = new Masada_300.Table().Visible(true);
        WeekDiv.appendChild(CalTbl.Element);
        WeekDiv.style.height = '475px';

        this.Load = function(week)
        {
            HdrTbl.Clear();
            CalTbl.Clear();
            var Row = HdrTbl.AddRow();
            for (var i = 0; i < 7; i++)
            {
                var DayLbl = Row.AddCell(80, true).Element;
                DayLbl.style.fontSize = '11pt';
                DayLbl.style.border = '2px inset gray';
                DayLbl.style.textAlign = 'center';
                DayLbl.style.backgroundColor = '#a0a0a0';
                DayLbl.innerHTML = DayLabel[i] + ' ' + week.Days[i].ShortDate;
            }
            var DayLbl = Row.AddCell(13, true).Element;
            DayLbl.style.border = '2px inset gray';
            DayLbl.innerHTML = '&nbsp;';
            DayLbl.style.backgroundColor = '#a0a0a0';


            Row = CalTbl.AddRow();


            for (var i = 0; i < 7; i++)
            {
                var DayLbl = Row.AddCell(80, true).Element;
                DayLbl.style.border = '2px solid gray';
                DayLbl.style.fontWeight = 'bold';
                for (var j = 0; j < 25; j++)
                {
                    var Div = DayLbl.appendChild($$('div'));
                    Div.onclick = function() { alert(this.Event.StartTime); }
                    var Event = Div.Event = new CalendarEvent();
                    Event.StartTime = 'Today';
                    Div.style.backgroundColor = '#eecccc';
                    Events[i].push(Event);
                    if (j % 2) Div.style.backgroundColor = '#ffeeee';
                    var Style = Div.style;
                    Style.cssFloat = Style.styleFloat = 'left';
                    Style.border = 'solid 1px gray';
                    // Style.height = '30px';
                    Style.width = '100%';
                    Style.fontSize = '10pt';
                    Style.textAlign = 'left';
                    Div.innerHTML = "04:30-6:15<br/>Tom Dually<br/>what now";
                }
            }
        }

        this.BindTo = function(parent)
        {
            parent.appendChild(Container);
            WeekDiv.style.display = 'block';
            return This;
        }
    }
    var WeekCal = new CalendarWeek().BindTo(CalDiv);

    var CalendarMonth = function(config)
    {
        var This = this;
        var CurrentDate = new Date();
        var DayCells = new Array(32);
        this.OnDateSelectClick = null;

        var CalWidth = config.getAttribute('Width');
        var CalHeight = config.getAttribute('Height');
        var Styles = config.selectSingleNode('Styles');

        var HeaderyStyle = new Masada_300.Style(Styles.selectSingleNode("Style[@Class='Header']"));
        var MouseOverCellStyle = new Masada_300.Style(Styles.selectSingleNode("Style[@Class='MouseOverCell']"));
        var MouseOutCellStyle = new Masada_300.Style(Styles.selectSingleNode("Style[@Class='MouseOutCell']"));
        var TableStyle = new Masada_300.Style(Styles.selectSingleNode("Style[@Class='Table']"));
        var SelectedDayStyle = new Masada_300.Style(Styles.selectSingleNode("Style[@Class='SelectedDay']"));
        var LeadingTrailerStyle = new Masada_300.Style(Styles.selectSingleNode("Style[@Class='LeadingTrailerDays']"));
        var DayStyle = new Masada_300.Style(Styles.selectSingleNode("Style[@Class='Days']"));
        var DayCellStyle = new Masada_300.Style(Styles.selectSingleNode("Style[@Class='DayCell']"));
        var DateCellSizeStyle = new Masada_300.Style(Styles.selectSingleNode("Style[@Class='DateCellSize']"));
        var MonthNavDefaultStyle = new Masada_300.Style(Styles.selectSingleNode("Style[@Class='MonthNavDefault']"));
        var MonthNavOverStyle = new Masada_300.Style(Styles.selectSingleNode("Style[@Class='MonthNavOver']"));

        var CalendarDiv = $$('div');
        CalendarDiv.style.width = CalWidth + 'px';
        CalendarDiv.style.display = 'none';
        CalendarDiv.style.backgroundColor = 'black';

        var MonthLabel = ['January', 'February', 'March', 'April', 'May', 'June',
            'July', 'August', 'September', 'October', 'November', 'December'];

        //DayLabel = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
        //DayLabel = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
        var DayLabel = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];

        var HdrTbl = new Masada_300.Table().Visible(true);
        HdrTbl.Element.style.width = CalWidth + 'px';
        CalendarDiv.appendChild(HdrTbl.Element);
        var Row = HdrTbl.AddRow();
        HeaderyStyle.Set(Row.Element);

        var LftArw = Row.AddCell().Element;
        LftArw.onmouseover = function() { MonthNavOverStyle.Set(this); }
        LftArw.onmouseout = function() { MonthNavDefaultStyle.Set(this); }
        LftArw.style.padding = '0 3px';
        LftArw.style.width = '20px';
        var LftBtn = $$('span');
        LftBtn.style.fontWeight = 'bold';
        LftBtn.innerHTML = "&lt;";
        LftArw.appendChild(LftBtn);
        LftBtn.onclick = function() { AdjustMonth(-1); }

        var TitleDiv = $$('div');
        TitleDiv.style.fontSize = '11pt';
        TitleDiv.style.fontWeight = 'bold';
        TitleDiv.style.color = 'black';
        TitleDiv.style.textAlign = 'center';
        TitleDiv.style.width = '120px';

        var MonthDdl = new Masada_300.Ddl(80, 20).BindTo(Row.AddCell().Element);
        MonthDdl.Element.onchange = function() { ResetCalendar(); }
        MonthDdl.Element.style.fontSize = '8pt';
        MonthDdl.Add("January").Add("February").Add("March").Add("April").Add("May").Add("June");
        MonthDdl.Add("July").Add("August").Add("September").Add("October").Add("November").Add("December");

        var YearDdl = new Masada_300.Ddl(55, 20).BindTo(Row.AddCell().Element);
        YearDdl.Element.onchange = function() { ResetCalendar(); }
        YearDdl.Element.style.fontSize = '8pt';
        for (var i = 0; i < 20; i = i + 1)
        {
            YearDdl.Add(2005 + i);
        }

        var RgtArw = Row.AddCell().Element;
        RgtArw.onmouseover = function() { MonthNavOverStyle.Set(this); }
        RgtArw.onmouseout = function() { MonthNavDefaultStyle.Set(this); }
        RgtArw.style.padding = '0 3px';
        RgtArw.style.width = '20px';
        RgtBtn = $$('span');
        RgtBtn.style.width = '100%';
        RgtBtn.style.fontWeight = 'bold';
        RgtBtn.innerHTML = "&gt;";
        RgtArw.appendChild(RgtBtn);
        RgtBtn.onclick = function() { AdjustMonth(1); }

        var ResetCalendar = function()
        {
            var Year = YearDdl.Selection();
            var Mth = MonthDdl.Index();
            CurrentDate = new Date(Year, Mth, 1);
            BuildCalendar(new Month(Mth, Year));
        }

        var AdjustMonth = function(adjust)
        {
            var CurrentMonth = CurrentDate.getMonth();
            var NewMonth = (CurrentMonth + adjust) % 12;
            var Year = CurrentDate.getFullYear() + parseInt((CurrentMonth + adjust) / 12);
            if (NewMonth < 0)
            {
                NewMonth += 12;
                Year += -1;
            }
            MonthDdl.Index(NewMonth);
            YearDdl.Selection(Year + '');
            CurrentDate = new Date(Year, NewMonth, 1);
            BuildCalendar(new Month(NewMonth, Year));
            return This;
        }

        var CalTbl = CalendarDiv.appendChild($$('table'));
        TableStyle.Set(CalTbl);
        CalTbl.cols = '7';
        var CalBody = CalTbl.appendChild($$('tbody'));

        var BuildCalendar = function(calMonth)
        {
            while (CalBody.hasChildNodes())
            {
                CalBody.removeChild(CalBody.firstChild);
            }

            var HdrCell = CalBody.appendChild($$('tr')).appendChild($$('td'));
            HdrCell.colSpan = '7';

            var WeekRow = CalBody.appendChild($$('tr'));
            var DayCell = null;
            for (i = 0; i < 7; i++)
            {
                var Cell = WeekRow.appendChild($$('td'));
                DayCellStyle.Set(Cell);
                Cell.innerHTML = DayLabel[i];
            }

            WeekRow = CalBody.appendChild($$('tr'));
            LeadingTrailerStyle.Set(WeekRow);

            for (var i = 0; i < calMonth.Weeks.length; i++)
            {
                for (var j = 0; j < 7; j++)
                {
                    var Day = calMonth.Weeks[i].Days[j];
                    var DayCell = DayCells[Day.DayOfMth] = WeekRow.appendChild($$('td'));
                    DayCell.Day = Day;
                    if (Day.IsInMonth)
                    {
                        DayStyle.Set(DayCell);
                        DateCellSizeStyle.Set(DayCell);

                        DayCell.innerHTML = Day.DayOfMth.toString();

                        DayContent = DayCell.appendChild($$('div'));
                        DayContent.style.fontSize = '7pt';
                        DayCell.onmouseover = function() { MouseOverCellStyle.Set(this); }
                        DayCell.onmouseout = function() { MouseOutCellStyle.Set(this); }

                        DayCell.onclick = function()
                        {
                            if (This.OnDateSelectClick) This.OnDateSelectClick(this);
                        }
                    }
                    else
                    {
                        //DayCell.innerHTML = '&nbsp';
                        DayCell.innerHTML = Day.DayOfMth.toString();
                        LeadingTrailerStyle.Set(DayCell);
                        DateCellSizeStyle.Set(DayCell);
                    }
                }
                WeekRow = CalBody.appendChild($$('tr'));
            }


            var FtrCell = CalBody.appendChild($$('tr')).appendChild($$('td'));
            FtrCell.colSpan = '7';
            var day = CurrentDate.getDate();
            DayCells[day].onmouseout = function()
            {
                //SelectedDayStyle.Set(this);
            }
            DayCells[day].onmouseout();
        }

        AdjustMonth(0);

        this.BindTo = function(parent)
        {
            parent.appendChild(CalendarDiv);
            CalendarDiv.style.display = 'block';
            return This;
        }
    }

    var DateSelect = new CalendarMonth(config).BindTo(PickDiv);
    DateSelect.OnDateSelectClick = function(obj) { WeekCal.Load(obj.Day.OfWeek); } //alert(obj.Day.WeekOfMth); };



    this.BindTo = function(parent)
    {
        parent.appendChild(Container);
        Container.style.display = 'block';
        return This;
    }

}
