﻿var EventCalendarManager = Class.create({
    initialize: function(params) {
        this.params = params;
        this.currentView = params.initialView;
        this.eventID = params.eventID;
        this.tag = params.tag;

        if (params.isAdmin) {
            $('liAddEvent').show();
            $('liEmail').show();
        }
        if (this.eventID.length != '') {
            this.currentView = 'event';
        }

        this.isEmployee = params.isEmployee;

        this.currentViewEl == null;
        this.loader = new EventCalendarContentLoader(params);
        this.startDate = params.startDate;
        this.setDate(params.startDate);

        this.setupObservers();
        this.showInitialView();

        if (this.tag.length > 0) {
            this.showTag();
        }

    },
    setupObservers: function() {
        Event.observe('btnSelectDay', 'click', this.btnSelectDay_Click.bindAsEventListener(this));
        Event.observe('btnSelectWeek', 'click', this.btnSelectWeek_Click.bindAsEventListener(this));
        Event.observe('btnSelect2Week', 'click', this.btnSelect2Week_Click.bindAsEventListener(this));
        Event.observe('btnSelectMonth', 'click', this.btnSelectMonth_Click.bindAsEventListener(this));

        Event.observe('twoweek-next', 'click', this.twoweek_Next_Click.bindAsEventListener(this));
        Event.observe('twoweek-prev', 'click', this.twoweek_Prev_Click.bindAsEventListener(this));
        Event.observe('week-next', 'click', this.weekNext_Click.bindAsEventListener(this));
        Event.observe('week-prev', 'click', this.weekPrev_Click.bindAsEventListener(this));
        Event.observe('day-next', 'click', this.dayNext_Click.bindAsEventListener(this));
        Event.observe('day-prev', 'click', this.dayPrev_Click.bindAsEventListener(this));

        Event.observe('print-btn', 'click', this.btnPrint_Click.bindAsEventListener(this));
        Event.observe('clear-tag-btn', 'click', this.clearTag.bindAsEventListener(this));

        if (this.isEmployee) {
            Event.observe('ddlCategory', 'change', this.refresh.bindAsEventListener(this));

            Event.observe('cbPublic', 'change', this.refresh.bindAsEventListener(this));
            Event.observe('cbInternal', 'change', this.refresh.bindAsEventListener(this));
            $('cbInternal').checked = true;
        }
        if (this.params.isAdmin) {
            Event.observe('ancEmail', 'click', this.ancEmail_Click.bindAsEventListener(this));
        }
    },
    setDate: function(newDate) {
        this.startDate = newDate;
        this.loader.resetStatus();
        DateHelper.updateWeekRanges(this.startDate);
        $$('#dayview h2 span')[0].update(DateHelper.formatForOutput(this.startDate));
    },
    showTag: function(tag) {
        $('tag-label').select('label')[0].innerHTML = this.tag;
        $('tag-label').show();
    },
    setNewTag: function(tag) {
        this.tag = tag;
        this.loader.tag = tag;
        $('tag-label').select('label')[0].innerHTML = this.tag;
        $('tag-label').show();
        this.refresh(null);
    },
    clearTag: function(ev) {
        if (ev) Event.stop(ev);
        this.tag = '';
        this.loader.tag = '';
        $('tag-label').hide();
        this.refresh(null);
    },
    refresh: function(ev) {
        if (ev) Event.stop(ev);

        switch (this.currentView) {
            case 'day':
                this.loader.loadDayContent(this.startDate);
                break;
            case 'week':
                this.loader.loadWeekContent(this.startDate);
                break;
            case 'twoweek':
                this.loader.loadTwoWeekContent(this.startDate);
                break;
            case 'month':
                this.loader.loadMonthContent(this.startDate);
                break;
            case 'event':
                this.generateEventDetail(params.eventID);
                break;
        }

    },
    btnSelectDay_Click: function(ev) {
        Event.stop(ev);
        this.setupButtonState('day');
        this.loader.loadDayContent(this.startDate);
        this.showView('dayview');
    },
    btnSelectWeek_Click: function(ev) {
        Event.stop(ev);
        this.setupButtonState('week');
        this.loader.loadWeekContent(this.startDate);
        this.showView('weekview');
    },
    btnSelect2Week_Click: function(ev) {
        Event.stop(ev);
        this.setupButtonState('twoweek');
        this.loader.loadTwoWeekContent(this.startDate);
        this.showView('twoweekview');
    },
    btnSelectMonth_Click: function(ev) {
        if (ev) Event.stop(ev);
        this.setupButtonState('month');
        this.loader.loadMonthContent(this.startDate);
        this.showView('monthview');
    },
    twoweek_Next_Click: function(ev) {
        this.setDate(DateHelper.DateAdd('d', 7, this.startDate));
        this.btnSelect2Week_Click(ev);
    },
    twoweek_Prev_Click: function(ev) {
        this.setDate(DateHelper.DateAdd('d', -7, this.startDate));
        this.btnSelect2Week_Click(ev);
    },
    weekNext_Click: function(ev) {
        this.setDate(DateHelper.DateAdd('d', 7, this.startDate));
        this.btnSelectWeek_Click(ev);
    },
    weekPrev_Click: function(ev) {
        this.setDate(DateHelper.DateAdd('d', -7, this.startDate));
        this.btnSelectWeek_Click(ev);
    },
    dayNext_Click: function(ev) {
        this.setDate(DateHelper.DateAdd('d', 1, this.startDate));
        this.btnSelectDay_Click(ev);
    },
    dayPrev_Click: function(ev) {
        this.setDate(DateHelper.DateAdd('d', -1, this.startDate));
        this.btnSelectDay_Click(ev);
    },
    showView: function(which) {
        if ($(which) == this.currentViewEl) return;
        
        /*
        $(which).style.left = '675px';
        var speed = 1.2;
        
        new Effect.Morph(this.currentViewEl, { 
        style: 'left: -675px;',
        duration: speed }
        );
        new Effect.Morph(which, { 
        style: 'left: 0px;',
        duration: speed}
        );
        */
        
        $(this.currentViewEl).style.left = '-675px';
        $(which).style.left = '0px';
        

        this.view = which;
        this.currentViewEl = $(which);
    },
    setupButtonState: function(which) {
        if ($('btnSelectMonth').hasClassName('monthon')) {
            $('btnSelectMonth').removeClassName('monthon');
        }
        if ($('btnSelect2Week').hasClassName('twoweekon')) {
            $('btnSelect2Week').removeClassName('twoweekon');
        }
        if ($('btnSelectWeek').hasClassName('weekon')) {
            $('btnSelectWeek').removeClassName('weekon');
        }
        if ($('btnSelectDay').hasClassName('dayon')) {
            $('btnSelectDay').removeClassName('dayon');
        }
        $('print-btn').show();
        if ($('ancEmail')) {
            $('ancEmail').show();
        }
        switch (which) {
            case 'day':
                $('btnSelectDay').addClassName('dayon');
                break;
            case 'week':
                $('btnSelectWeek').addClassName('weekon');
                break;
            case 'twoweek':
                $('btnSelect2Week').addClassName('twoweekon');
                break;
            case 'month':
                $('btnSelectMonth').addClassName('monthon');
                $('print-btn').hide();

                if ($('ancEmail')) {
                    $('ancEmail').hide();
                }
                break;
        }
        this.currentView = which;
    },
    showInitialView: function() {
        //day, week, 2week, month, event
        var initialViewEl = 'day';
        this.setupButtonState(this.currentView);
        switch (this.currentView) {
            case 'day':
                initialViewEl = 'dayview';
                this.loader.loadDayContent(this.startDate);
                break;
            case 'week':
                initialViewEl = 'weekview';
                this.loader.loadWeekContent(this.startDate);
                break;
            case 'twoweek':
                initialViewEl = 'twoweekview';
                this.loader.loadTwoWeekContent(this.startDate);
                break;
            case 'month':
                initialViewEl = 'monthview';
                this.loader.loadMonthContent(this.startDate);
                break;
            case 'event':
                this.generateEventDetail(this.eventID);
                initialViewEl = 'event' + this.eventID;
                break;
        }
        if ($(initialViewEl)) {
            $(initialViewEl).style.left = '0px';
            this.currentViewEl = $(initialViewEl);
        }

    },
    generateEventDetail: function(eventID) {
        new SingleEventDetail(eventID);
    },
    btnPrint_Click: function() {
        var qs = '?view=' + this.currentView +
			'&startDate=' + DateHelper.formatForQuery(this.startDate) +
			'&tag=' + this.tag +
			'&eventID=' + this.eventID +
			'&public=' + this.loader.getPublicChecked() +
			'&internal=' + this.loader.getInternalChecked() +
			'&category=' + this.loader.getCategory() +
			'&header=' + this.currentViewEl.select('h2 span')[0].innerHTML;

        var newWindow = window.open('/event-calendar/print/' + qs, 'print', 'width=800,height=600,scrollbars=1,status=1,location=1,menubar=1');
        newWindow.print();
    },
    ancEmail_Click: function(ev) {
        Event.stop(ev);
        var qs = '?view=' + this.currentView +
			'&startDate=' + DateHelper.formatForQuery(this.startDate) +
			'&tag=' + this.tag +
			'&eventID=' + this.eventID +
			'&public=' + this.loader.getPublicChecked() +
			'&internal=' + this.loader.getInternalChecked() +
			'&category=' + this.loader.getCategory() +
			'&header=' + this.currentViewEl.select('h2 span')[0].innerHTML;

        var newWindow = window.open('/event-calendar/email/' + qs, 'email', 'width=800,height=600,scrollbars=1,status=1,location=1,menubar=1');

    }
});
