var calendar = {
    
    day_ms : 86400000,
    ov : 4,
    pms : 2,
    menst_min_per : 30,
    mounths : {
    0 : 'Января',
    1 : 'Февраля',
    2 : 'Марта',
    3 : 'Апреля',
    4 : 'Мая',
    5 : 'Июня',
    6 : 'Июля',
    7 : 'Августа',
    8 : 'Сентября',
    9 : 'Октября',
    10 : 'Ноября',
    11 : 'Декабря'
    },
    
    mark : function(cycle,last_date,menst)
    {
    	if(cycle<=menst) return false;
    	jQuery("#datepicker").datepicker('destroy');
    	jQuery.datepicker.setDefaults(jQuery.datepicker.regional['ru']);
        jQuery("#datepicker").datepicker({numberOfMonths: 12, nextText: '', prevText: ''});
    	var self = this,
    	this_time = new Date,
    	utc_last = Date.UTC(last_date.year, last_date.month, last_date.date),
    	cycle_num = Math.ceil(366/(cycle)),
    	day_class = new Array();
    	if(this_time.getMonth()>last_date.month || this_time.getFullYear()>last_date.year)
    	{
    		var coof = Math.ceil((this_time.getTime()-(utc_last+self.day_ms))/(cycle*self.day_ms + menst*self.day_ms));
            utc_last = utc_last + (cycle*self.day_ms + menst*self.day_ms)*coof;
    	}
    	var utc_first = utc_last - ((menst-1)*self.day_ms);
        var first_date = new Date(utc_first);
        if(first_date.getMonth()<this_time.getMonth()) {
            first_date = new Date(this_time.getFullYear(),this_time.getMonth(),1);
            utc_first = first_date.getTime();
        }
        var first_cycle_day = Math.ceil((utc_last - utc_first)/self.day_ms)+1;

        var ov_start = cycle-14;
        if(ov_start<0 || ov_start<=menst)
        {   
            ov_start=0;
            var first_empty = 0;
            if(cycle-menst<2) self.pms = 0;
            var second_empty = cycle - menst - self.pms;
            self.ov = 0;
        }
        else
        {
            var first_empty = cycle - 14 - menst;
            var second_empty = 14-self.ov-self.pms;
        }
        if(menst>0)
        {
        	 var menst_min = Math.round(menst/100*self.menst_min_per);
        	 menst = menst - menst_min;
        }
        else var menst_min = 0;
        var cycle_date = first_date;
        for($i=0;$i<=cycle_num;$i++)
        {
        	if(first_cycle_day)
        	{
            	var arr_month;
            	for($ii=0;$ii<(first_cycle_day);$ii++)
            	{
            		arr_month = cycle_date.getMonth()-this_time.getMonth();
                    if(arr_month<=0 && (this_time.getFullYear() != cycle_date.getFullYear())) arr_month = 11 + arr_month;
            		if(arr_month < old_array_month) continue;
            		if(!day_class[arr_month]) day_class[arr_month] = new Array();
            		if((first_cycle_day-$ii)>menst_min)day_class[arr_month][cycle_date.getDate()]= 'menst';
            		else day_class[arr_month][cycle_date.getDate()]= 'menst_min';
            		cycle_date = new Date(cycle_date.getTime() + self.day_ms);
            		var old_array_month = arr_month;
            	}
                first_cycle_day = false;
        	}
        	for($ii=0;$ii<(first_empty);$ii++)
            {
            	arr_month = cycle_date.getMonth()-this_time.getMonth();
                if(arr_month<=0 && (this_time.getFullYear() != cycle_date.getFullYear())) arr_month = 11 + arr_month;
            	if(arr_month < old_array_month) continue;
            	if(!day_class[arr_month]) day_class[arr_month] = new Array();
                day_class[arr_month][cycle_date.getDate()]= '';
                cycle_date = new Date(cycle_date.getTime() + self.day_ms);
                var old_array_month = arr_month;
            }
            for($ii=0;$ii<(self.ov);$ii++)
            {
                arr_month = cycle_date.getMonth()-this_time.getMonth();
                if(arr_month<=0 && (this_time.getFullYear() != cycle_date.getFullYear())) arr_month = 11 + arr_month;
                if(arr_month < old_array_month) continue;
                if(!day_class[arr_month]) day_class[arr_month] = new Array();
                day_class[arr_month][cycle_date.getDate()]= 'ov';
                cycle_date = new Date(cycle_date.getTime() + self.day_ms);
                var old_array_month = arr_month;
            }
            for($ii=0;$ii<(second_empty);$ii++)
            {
                arr_month = cycle_date.getMonth()-this_time.getMonth();
                if(arr_month<=0 && (this_time.getFullYear() != cycle_date.getFullYear())) arr_month = 11 + arr_month;
                if(arr_month < old_array_month) continue;
                if(!day_class[arr_month]) day_class[arr_month] = new Array();
                day_class[arr_month][cycle_date.getDate()]= '';
                cycle_date = new Date(cycle_date.getTime() + self.day_ms);
                var old_array_month = arr_month;
            }
            for($ii=0;$ii<(self.pms);$ii++)
            {
                arr_month = cycle_date.getMonth()-this_time.getMonth();
                if(arr_month<=0 && (this_time.getFullYear() != cycle_date.getFullYear())) arr_month = 11 + arr_month;
                if(arr_month < old_array_month) continue;
                if(!day_class[arr_month]) day_class[arr_month] = new Array();
                day_class[arr_month][cycle_date.getDate()]= 'pms';
                cycle_date = new Date(cycle_date.getTime() + self.day_ms);
                var old_array_month = arr_month;
            }
            for($ii=0;$ii<(menst);$ii++)
            {
                arr_month = cycle_date.getMonth()-this_time.getMonth();
                if(arr_month<=0 && (this_time.getFullYear() != cycle_date.getFullYear())) arr_month = 11 + arr_month;
                if(arr_month < old_array_month) continue;
                if(!day_class[arr_month]) day_class[arr_month] = new Array();
                day_class[arr_month][cycle_date.getDate()]= 'menst';
                cycle_date = new Date(cycle_date.getTime() + self.day_ms);
                var old_array_month = arr_month;
            }
            for($ii=0;$ii<(menst_min);$ii++)
            {
                arr_month = cycle_date.getMonth()-this_time.getMonth();
                if(arr_month<=0 && (this_time.getFullYear() != cycle_date.getFullYear())) arr_month = 11 + arr_month;
                if(arr_month < old_array_month) continue;
                if(!day_class[arr_month]) day_class[arr_month] = new Array();
                day_class[arr_month][cycle_date.getDate()]= 'menst_min';
                cycle_date = new Date(cycle_date.getTime() + self.day_ms);
                var old_array_month = arr_month;
            }
        	
        };
        for(var i in day_class) {
            if (!day_class.hasOwnProperty(i)) continue;
             for(var ii in day_class[i])
             {
             	if (!day_class[i].hasOwnProperty(ii)) continue;
             	jQuery('.ui-datepicker-group').eq(i).find('td:has(a)').eq(ii-1).addClass(day_class[i][ii]);
             }
       }
       return true;
    },
    optiMonth : function(cont)
    {
    	var self = this;
    	var select = '',
    	this_date = new Date(),
        this_month = this_date.getMonth(),
        months = new Array();
    	for(i=3;i>-2;i--)
    	{
            var month = this_month-i;
            if(month<0) 
            {
            	month = 12+month;
                var text = self.mounths[month] + ' ' + (this_date.getFullYear()-1);
                month = month + '-' + (this_date.getFullYear()-1);
            }
            else if(month>11) 
            {
                month = month-12;
                var text = self.mounths[month] + ' ' + (this_date.getFullYear()+1);
                month = month + '-' + (this_date.getFullYear()+1);
            }
            else 
            {
                var text = self.mounths[month] + ' ' + (this_date.getFullYear());
                month = month + '-' + (this_date.getFullYear());
            }
    		select +='<option value="' + month + '"';
    		select +='>' + text + '</option>';
    	}
    	jQuery('#monthAndYearCalendar',cont).append(select);
    	jQuery('#monthAndYearCalendar',cont).hide().show(100, function(){jQuery('#monthAndYearCalendar option[value='+this_date.getMonth()+'-'+this_date.getFullYear()+']',cont).attr('selected','selected')});
    },
    validate : function(cont)
    {
    	var self = this;
    	var m_y = jQuery('#monthAndYearCalendar').val();
    	var s = m_y.split('-');
    	var day = jQuery.trim(jQuery('#firstCalendar').val());
    	var month = s[0];
    	var year =  s[1];
    	var cycle =  jQuery.trim(jQuery('#durCalendar').val());
    	var menst =  jQuery.trim(jQuery('#durMCalendar').val());
    	
    	if(cycle == '' || day == '' || menst == '') 
    	{
    	   alert('Ошибка:\nВсе поля обязательны для заполнения');
    	   return false;
    	}
    	day = parseFloat(day);
        month = parseFloat(month);
        year =  parseFloat(year);
        cycle =  parseFloat(cycle);
        menst =  parseFloat(menst);
    	if (menst>=cycle)
    	{
    	   alert('Ошибка:\nПродолжительность месячных должна быть меньше цикла');
           return false;
    	}
    	var valid_int = new Date(year,month,day);
    	if(year!=valid_int.getFullYear() || month!=valid_int.getMonth() || day!=valid_int.getDate())
    	{
    	   alert('Ошибка:\nДата введена не корректно');
           return false;
    	}
    	var last_date = Date.UTC(year,month,day);
    	last_date = last_date + (menst-1)*self.day_ms;
    	last_date = new Date(last_date);
        last_date['date'] = last_date.getDate();
        last_date['month'] = last_date.getMonth();
        last_date['year'] = last_date.getFullYear();
    	if(self.mark(cycle,last_date,menst)){self.setCookies(cycle,last_date,menst);}
    },
    onlyInt : function(e)
    {
         var key = (typeof e.charCode == 'undefined' ? e.keyCode : e.charCode);
         if (e.ctrlKey || e.altKey || key < 58)    return true;
         else    return false;
    },
    onlyIntCh : function(element)
    {
         if(parseFloat(jQuery(element).val())) jQuery(element).val(parseFloat(jQuery(element).val()));
         else    jQuery(element).val('');
    },
    setCookies : function(cycle,last_date,menst)
    {
          var self = this;
          var date = new Date();
          var opt = date.setTime(date.getTime() + (366 * self.day_ms));
          jQuery.cookie('cycle', cycle, opt);
          last_date = last_date['date'] + '-' + last_date['month'] + '-' + last_date['year'];
          jQuery.cookie('last_date', last_date, opt);
          jQuery.cookie('menst', menst, opt);
    },
    getCookies : function()
    {
          var self = this;
          if(jQuery.cookie('cycle'))
          {
          	var cycle = parseFloat(jQuery.cookie('cycle'));
          	jQuery('#durCalendar').val(cycle);
          	var last_date = jQuery.cookie('last_date');
            var s = last_date.split('-');
          	var last_date = new Array();
          	last_date['date'] = parseFloat(s[0]);
            last_date['month'] = parseFloat(s[1]);
            last_date['year'] = parseFloat(s[2]);
            jQuery('#firstCalendar').val(last_date['date']);
            jQuery('#monthAndYearCalendar').val(last_date['month']+'-'+last_date['year']);
          	menst = parseFloat(jQuery.cookie('menst'));
          	jQuery('#durMCalendar').val(menst);
          	self.mark(cycle,last_date,menst);
          	
          }
    }
};

jQuery(function() {
        jQuery.datepicker.setDefaults(jQuery.datepicker.regional['ru']);
        jQuery("#datepicker").datepicker({numberOfMonths: 12, nextText: '', prevText: ''});
        
        calendar.optiMonth('#formCalendar');
        jQuery('#subMCalendar').click(function(){return calendar.validate()});
        jQuery('#formCalendar input').keypress(function(e){return calendar.onlyInt(e);}).blur(function(){return calendar.onlyIntCh(this);});
        calendar.getCookies();
    });
