Get your own free workspace
View
 

Moo_Calendar

Page history last edited by PBworks 4 years, 10 months ago

Moo.Calendar, a plugin of Mootools by Le Nhat Anh. 

 

Edit Info :

 

  • moo.calendar ver 1.00
  • no change

 

// BEGIN CODE

 

// By lenhatanh | nhatanh.voxfamilyvn.com | a plugin of mootools

var DateTime = new Class({

   

    DayofMonth: function(m,y) {

        var _ = [,31,,31,30,31,30,31,30,31,30,31,30,31];

        if(m==2) return y % 4 == 0 ? 29 : 28;

        else return _[m];

    },

   

    DatetoWeekday: function(d,m,y) {

        var d = new Date(y,m-1,d);

        _1 = d.getDay();

        _2 = d.getMonth();

        if(_2 == m-1) return _1!=0 ? _1 : 7 //Sunday is 7

        else return false;

    }

   

});

var Calendar = DateTime.extend({

   

    info: function(opt) {

        this.opt = {

            min_month: 1,

            min_year: 1,

            max_month: 12,

            max_year: 9999,

            position: 'after',

            onSelect: Class.empty,

            link_next: '>>',

            link_prev: '<<',

            weekday_text: 'Mon|Tue|Wed|Thu|Fri|Sat|Sun',

            month_text: 'January|February|March|April|May|June|July|August|September|October|November|December',

            auto_show: true

        };

        Object.extend(this.opt, opt || {});

       

        this.year = this.opt.year ? this.opt.year : this.opt.c_year;

        this.month = this.opt.month ? this.opt.month : this.opt.c_month;

    },

   

    initialize: function(opt) {

        this.info(opt);

        if(!this.opt.c_day || !this.opt.c_year || !this.opt.c_month) return;

        if(this.opt.auto_show) this.Create();

        else this.ready_show = false;

    },

   

    preCreate1: function() { //Header of calendar's html

        this.html1 = '<div class="'+ this.opt.css_title +'">';

       

        mon = this.opt.month_text.split('|');

        this.html1 += '<span id="' + this.opt.e_name + '_prev">' + this.opt.link_prev + '</span> '

        + '<span id="' + this.opt.e_name + '_moye">' + mon[this.month-1] + '.' + this.year + '</span>'

        + ' <span id="' + this.opt.e_name + '_next">' + this.opt.link_next + '</span></div>';

       

        day = this.opt.weekday_text.split('|');

        for(i=0;i<=6;i++) {

            this.html1 += '<div class="' + this.opt.css_day + '">' + day[i] + '</div>';

        }

    },

   

    preCreate2: function() { //Footer of calendar's html

        if(this.year == this.opt.c_year) {

            if(this.month == this.opt.c_month) _3 = this.opt.c_day;

            else if(this.month > this.opt.c_month) _3 = 0;

            else _3 = 32

        } else if(this.year < this.opt.c_year) _3 = 32;

        else _3 = 0;

       

        _7 = this.DatetoWeekday(1,this.month,this.year);       

        _4 = this.DayofMonth(this.month,this.year);

        _5 = _4 + _7 - 1;

        _6 = Math.ceil(_5 / 7) * 7;

       

        _8 = 1;

        var el = new Array()

        var el_v = new Array();

        this.html = '<div id="' + this.opt.e_name + '_allday">';

        for(i=1;i<=_6;i++) {

            if(i>=_7 && i<=_5) {

               

                id = this.opt.e_name + '_element_' + _8;

                el.push(id);

                el_v.push(_8);

                this.html += '<div id="' + id + '" class="';

                if(_8<_3)  this.html += this.opt.css_pastday;

                else if(_8==_3)  this.html += this.opt.css_currentday;

                else  this.html += this.opt.css_futureday;

                this.html += '">' + _8 + '</div>';

                _8++;

               

            } else this.html += '<div class="' + this.opt.css_emptyday + '"> </div>';

        }

        this.html += '</div>';

        this.el = el;

        this.el_v = el_v;

    },

   

    dayEve: function() { // Set event when you click any date

        this.el.each(function(e, i){

            $(e).addEvent('click', function(){

                if(!this.opt.auto_show) this.hide();

                this.opt.onSelect([this.month,this.el_v[i],this.year], this);

            }.bind(this));

        }, this);

    },

       

    Create: function() {

        if(!$(this.opt.e_name)) {

            var _1 = new Element(this.opt.e_name);

            _1.id = this.opt.e_name;

        }

        else _1 = $(this.opt.e_name);

       

        this.preCreate1();

        this.preCreate2();

        _1.addClass(this.opt.css_calendar);

        _1.setStyles({display: 'block', opacity: 0});

        _1.setHTML(this.html1+this.html);

        if(!this.opt.auto_show) {

            y = $(this.opt.p_name).getTop() + 5;

            x = $(this.opt.p_name).getLeft() + 5;

            _1.setStyles({position: 'absolute', top: y + 'px', left: x + 'px'});

            _1.setStyle('z-index', '1000');

            _1.injectInside(document.body).effect('opacity').custom(0,1);

        } else {

            _1.inject(this.opt.p_name, this.opt.position).effect('opacity').custom(0,1);

        }

       

        this.dayEve();

        $(this.opt.e_name + '_prev').addEvent('click', function(){this.preMon()}.bind(this));

        $(this.opt.e_name + '_next').addEvent('click', function(){this.nexMon()}.bind(this));

       

        this.ready_show = true;

    },

   

    fixPos: function() {

            y = $(this.opt.p_name).getTop() + 5;

            x = $(this.opt.p_name).getLeft() + 5;

            $(this.opt.e_name).setStyles({top: y + 'px', left: x + 'px'});

    },

   

    fixCal: function() {

        $(this.opt.e_name + '_moye').setHTML(mon[this.month-1] + '.' + this.year);

       

        this.preCreate2();

        $(this.opt.e_name + '_allday').setHTML(this.html);

       

        this.dayEve();

    },

   

    hide: function() {

        if(!this.ready_show) return;

        else {

            $(this.opt.e_name).effect('opacity').custom(1,0);

            this.ready_show = false;

        }

    },

   

    show: function() {

        if(!$(this.opt.e_name)) {

            this.Create();

            this._1stclick = 1;

            document.addEvent('click', function(e) {

                this.fixPos();

                if(this._1stclick) {

                    this._1stclick = 0;

                } else {

                    var p = $(this.opt.e_name).getCoordinates();

                    var e = new Event(e);

                    if(p.left > e.page.x || p.right < e.page.x || p.top > e.page.y || p.bottom < e.page.y) {

                        this.hide();

                        this._1stclick = 1;

                    }

                }

            }.bind(this));

        } else {

            if(this.ready_show) return;

            else {

                $(this.opt.e_name).effect('opacity').custom(0,1);

                this.ready_show = true;

                this._1stclick = 1;

            }

        }

    },

   

    preMon: function () {

        if(this.year==this.opt.min_year) {

            if(this.month ==this.opt.min_month) return;

            else this.month--;

        } else {

            if(this.month==1) {

                this.month=12;

                this.year--;

            } else this.month--;

        }

        this.fixCal();

    },

   

    nexMon: function () {

        if(this.year==this.opt.max_year) {

            if(this.month ==this.opt.max_month) return;

            else this.month++;

        } else {

            if(this.month==12) {

                this.month=1;

                this.year++;

            } else this.month++;

        }

        this.fixCal();

    }

});

 

// END CODE

Comments (0)

You don't have permission to comment on this page.