/* Monthpicker 1.0a1 by Num :D
 *
 **/

var AJS = {
    update: function(l1, l2) {
        for(var i in l2)
            l1[i] = l2[i];
        return l1;
    }
}
AJS.Class = function(members) {
    var fn = function() {
        if(arguments[0] != 'no_init') {
            return this.init.apply(this, arguments);
        }
    }
    fn.prototype = members;
    AJS.update(fn, AJS.Class.prototype);
    return fn;
}
AJS.Class.prototype = {
    extend: function(members) {
        var parent = new this('no_init');
        for(k in members) {
            var prev = parent[k];
            var cur = members[k];
            if (prev && prev != cur && typeof cur == 'function') {
                cur = this._parentize(cur, prev);
            }
            parent[k] = cur;
        }
        return new AJS.Class(parent);
    },

    implement: function(members) {
        AJS.update(this.prototype, members);
    },

    _parentize: function(cur, prev) {
        return function(){
            this.parent = prev;
            return cur.apply(this, arguments);
        }
    }
}//end AJS.Class

;(function($){

Monthpicker = AJS.Class({
        el: null,
	id: null,
	init: function(el,opt){
            var mp = this;

            this.el = el;
            this.mpBox = $('<div class="mp-box" />').appendTo('body');
            this.yearBox = $('<div class="mp-year-box" />').appendTo(this.mpBox);
            this.monthBox = $('<div class="mp-month-box" />').appendTo(this.mpBox);
            this.buttonBox = $('<div class="mp-button-box" />').appendTo(this.mpBox);
            this.opt = {
                onSubmit: function(param){
                    var qpos = window.location.href.indexOf('?');
                    var url = (qpos == -1)
                            ? window.location.href
                            : window.location.href.substr(0,qpos);
                    var obj = {};
                    obj[mp.opt.yearVar] = param.year;
                    obj[mp.opt.monthVar] = param.month;
                    window.location = url + '?' + $.param(obj);
                },
                onCancel: function(){
                    if (mp.opt.plain){
                        mp.selectMonth(mp.opt.month);
                        mp.selectYear(mp.opt.year);
                    }else{
                        mp.mpBox.hide();
                    }
                }
            }
            $.extend(this.opt,opt);
            var mpBoxNumber = 'mpbox'+($.fn.Monthpicker.number++);
            el.attr('mpbox',mpBoxNumber);
            mp.mpBox.attr('id',mpBoxNumber);
            $.fn.Monthpicker.obj[mpBoxNumber] = this;
            mp.yearBox.html(mp.yearButtonHtml());

            if (mp.opt.type != 'year')
              mp.monthBox.html(mp.monthButtonHtml());
 //           mp.buttonBox.html(mp.buttonHtml());

            if (mp.opt.displayTag){
                el.html($.fn.Monthpicker[mp.opt.lang].monthNames[mp.opt.month-1]+', '+mp.opt.year);
            }
            $(document).ready(function(){
                mp.yearBox.find('a').click(function(e){
                    e.preventDefault();
                    if ($(this).hasClass('mp-year-select')){
                        mp.yearBox.find('a').removeClass('mp-year-select');
                    }else{
                        mp.yearBox.find('a').removeClass('mp-year-select');
                        $(this).addClass('mp-year-select');
                    }
                    if (mp.opt.type == 'year')
                      {
                        $('#'+mp.opt.to1).text(mp.yearBox.find('.mp-year-select').text());
//                        $('#'+mp.opt.to2).value = mp.yearBox.find('.mp-year-select').text();
                        document.getElementById(mp.opt.to2).value = mp.yearBox.find('.mp-year-select').text();

                        mp.opt.onCancel(mp);
                      }
                });
                mp.monthBox.find('a').click(function(e){
                    e.preventDefault();
                    if ($(this).hasClass('mp-month-select')){
                        mp.monthBox.find('a').removeClass('mp-month-select');
                    }else{
                        mp.monthBox.find('a').removeClass('mp-month-select');
                        $(this).addClass('mp-month-select');
                    }
                    var res = mp.monthBox.find('.mp-month-select').text() + " "+ mp.yearBox.find('.mp-year-select').text();
                    $('#'+mp.opt.to1).text(res);
//                    $('#'+mp.opt.to2).value = res;
                    document.getElementById(mp.opt.to2).value = res;

                    mp.opt.onCancel(mp);

                });
                mp.buttonBox.find('.mp-ok-button').click(function(e){
                    e.preventDefault();
                    var selYearEl = mp.yearBox.find('.mp-year-select');
                    var selMonthEl = mp.monthBox.find('.mp-month-select');
                    var selYear =  selYearEl.size() ? selYearEl.text() : '';
                    var selMonth = selMonthEl.size() ? selMonthEl.attr('href') : '';
                    $.extend(mp,{month:selMonth,year:selYear});
                    mp.opt.onCancel(mp);
//                    mp.opt.onSubmit(mp);
                });
                mp.buttonBox.find('.mp-cancel-button').click(function(e){
                    e.preventDefault();
                    mp.opt.onCancel(mp);
                });
            });
            if (mp.opt.plain){
                mp.show();
                mp.mpBox.addClass('mp-plain');
            }
            el.click(function(e){
                e.preventDefault();
                if (1)
                  mp.show();
                else
                  mp.opt.onCancel(mp);
            },function(){
               // mp.mpBox.hide();
            });
            mp.mpBox.hover(function(e){
            },function(e){
                mp.mpBox.hide();
            });

	},
        show: function(){
            var mp = this;
            $('.mp-box').not('.mp-plain').hide();
            mp.selectMonth(mp.opt.month);
            mp.selectYear(mp.opt.year);
            mp.mpBox.css({
                left: mp.el.offset().left,
                top: mp.el.offset().top + mp.el.height()
            });
            //console.log(parseInt(mp.mpBox.css('left'))+','+mp.mpBox.width()+','+screen.width);
            while (parseInt(mp.mpBox.css('left')) + mp.mpBox.width() >= screen.width-25){
                mp.mpBox.css('left',parseInt(mp.mpBox.css('left'))-25);
            }
            mp.mpBox.show();
        },
        selectMonth: function(month){
            var mp = this;
            mp.monthBox.find('a').removeClass('mp-month-select');
            mp.monthBox.find('a').each(function(e){
                if ($.trim($(this).attr('href')) == month){
                    $(this).addClass('mp-month-select');
                }
            });
        },
        selectYear: function(year){
            var mp = this;
            mp.yearBox.find('a').removeClass('mp-year-select');
            mp.yearBox.find('a').each(function(e){
                if ($.trim($(this).text()) == year){
                    $(this).addClass('mp-year-select');
                }
            });
        },
        yearButtonHtml: function(){
                var mp = this;
                var s = '';
                var start = mp.opt.startYear - (mp.opt.startYear % 10);
                var end = mp.opt.endYear - (mp.opt.endYear % 10) + 10;
                for(var i=start; i<end; i++){
                    if (i % 10 == 0){
                        if (i != start){
                            s += "<br clear='both' />";
                        }
                        s += '<span class="mp-year-header">';
                        if (i==start){
                            s += $.fn.Monthpicker[mp.opt.lang].yearTitle;
                        } else {
                            s += '&nbsp;';
                        }
                        s += '</span>';
                    }
                    if (i < mp.opt.startYear || i > mp.opt.endYear){
//                    s += '<span class="mp-hidden-year">&nbsp;</span>';
                    }else{
                    s += '<a href="#">'+i+'</a>';
                    }
                }
   s += "<br clear='both' />";
                return s;
        },
        monthButtonHtml: function(){
                var mp = this;
                var s = '<span class="mp-month-header">'+
                    $.fn.Monthpicker[mp.opt.lang].monthTitle+
                    '</span>';
                var months = $.fn.Monthpicker[mp.opt.lang].monthNames;
                for(i=0; i<12; i++){
                   s += '<a href="'+(i+1)+'">'+months[i]+'</a>';
                }  s += "<br clear='both' />";
                return s;
        },
        buttonHtml: function(){
            var mp = this;
            var s = ''; //'<button class="mp-ok-button" >OK</button>';
//                s+= '<button class="mp-cancel-button" >Cancel</button>';
            return s;
        }
});

    /************ PLUGIN CONSTRUCTOR *************/
    $.fn.Monthpicker = function(option) {
        if (typeof option == 'string'){
            var mpBoxNumber = $(this).attr('mpbox');
            if (option=='show'){
                $.fn.Monthpicker.obj[mpBoxNumber].show();
            }
            if (option=='hide'){
                $('#'+mpBoxNumber).hide();
            }
        }else{
            var opt = $.extend({}, $.fn.Monthpicker.defaults, option);
            return this.each(function(){
                new Monthpicker($(this),opt);
            });//end return each
        }
    };
    $.fn.Monthpicker.number = 0;
    $.fn.Monthpicker.obj = {};
    $.fn.Monthpicker.defaults = {
        monthVar: 'month',
        yearVar: 'year',
        lang: 'en',
        month: ((new Date()).getMonth()+1),
        year: (new Date()).getFullYear(),
        startYear: ((new Date()).getFullYear()-50),
        endYear: (new Date()).getFullYear(),
        displayTag: false,
        plain: false
    }
    $.fn.Monthpicker.en = {
        monthNames: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
        yearTitle: 'Год',
        monthTitle: 'Месяц'
    }

})(jQuery);

