﻿var Calendar = Class.create();
Calendar.prototype = {
    initialize: function (element, options) {
        this.element = element;
        this.isShowing = this.element.visible;
        this.setOptions(options);
        //find the close button
        closeBtns = this.element.select(this.options.close);
        openBtns = $$(this.options.open);
        // sink events
        Event.observe(window, 'resize', this.onResize.bindAsEventListener(this));
        Event.observe(window, 'scroll', this.onResize.bindAsEventListener(this));
        closeBtns.each(function (btn, index) {
            Event.observe(btn, 'click', this.onHide.bindAsEventListener(this));
        } .bind(this));
        openBtns.each(function (btn, index) {
            Event.observe(btn, 'click', this.onShow.bindAsEventListener(this));
        } .bind(this));
        this.center();
    },
    setOptions: function (options) {
        this.options = {
            close: '.close a',
            open: 'img.calendar',
            days: '.day',
            content: '.content',
            pad: 20
        };
        Object.extend(this.options, options || {});
    },
    doStyle: function () {
        var content = this.element.select(this.options.content);
        var days = this.element.select(this.options.days);
        content.each(function (e, index) {
            var dim = e.getDimensions();
            days.each(function (d, index) {
                d.style.height = (dim.height - this.options.pad) + 'px';
            } .bind(this));
        } .bind(this));
    },
    onShow: function (e) {
        this.element.show();
        this.doStyle();
        Event.stop(e);
    },
    onHide: function (e) {
        this.element.hide();
        Event.stop(e);
    },
    onResize: function () {
        this.center();
    },
    center: function () {
        var width = 0;
        var height = 0;
        var scrollY = 0;
        if (typeof (window.innerWidth) == 'number') {
            width = window.innerWidth;
            height = window.innerHeight;
        }
        else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
            width = document.documentElement.clientWidth;
            height = document.documentElement.clientHeight;
        }
        else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
            width = document.body.clientWidth;
            height = document.body.clientHeight;
        }
        if (document.documentElement && document.documentElement.scrollTop) {
            scrollY = document.documentElement.scrollTop;
        }
        else if (document.body && document.body.scrollTop) {
            scrollY = document.body.scrollTop;
        }
        else if (window.pageYOffset) {
            scrollY = window.pageYOffset;
        }
        else if (window.scrollY) {
            scrollY = window.scrollY;
        }
        var elementDimensions = Element.getDimensions(this.element);
        var setX = (width - elementDimensions.width) / 2;
        var setY = (height - elementDimensions.height) / 2 + scrollY;
        setX = (setX < 0) ? 0 : setX;
        setY = (setY < 0) ? 0 : setY;
        this.element.style.left = setX + "px";
        this.element.style.top = setY + "px";
    }
}

// Calendar invoke helper method
Element.addMethods({
    calendar: function (element) {
        new Calendar(element);
    }
});
