var ___s = null;

(function($) {
$.fn.calendarpicker = function(s) {
	var s = $.extend({
		delay: 250,
		years: [2011, 2012, 2013, 2014, 2015],
		months: ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],
		links: [],
		hd: []
	}, s);
		
	
	
	var c = {
		it: null,
		ms: null,
		ys: null,
		render: null,
		c: 0
	};
	
	var now = new Date();
    
    return this.each(function(i,e){
    	var ce = now.getYear() - 111;
    	if ($.browser.msie && $.browser.version.split('.')[0] <= 8) ce += 111 - 2011;
    	
    	c.it = $(this);
    	c.ms = _create_select(s.months, 'month', now.getMonth());
    	c.ys = _create_select(s.years, 'years', ce);
    	
    	___s = c.ms;
    	
    	var tmp = $('<div class="select"></div>');
    	c.it.append(tmp);
    	tmp.append(c.ms).append(c.ys);
    	
    	c.ms.change(_render)
    	c.ms.change(function(){
    		current_month = $(this).val();
    		$('.calendar-slider a.hidden.selectmonth').click();
    		c.it.find('.calendar-slider.m span').text($(this).find('option:selected').text());
    	});
    	c.ys.change(_render)
    	c.ys.change(function(){
    		current_year = parseInt($(this).val()) + 2011;
    		$('.calendar-slider a.hidden.selectmonth').click();
    		c.it.find('.calendar-slider.y span').text($(this).find('option:selected').text());
    	});
    	
    	c.render = $('<div class="render"></div>')
    	c.it.append(c.render);
    	
    	c.ms.hide();
    	c.ys.hide();
    	c.it.find('.calendar-slider.m span').text(c.ms.find('option:selected').text());
    	c.it.find('.calendar-slider.y span').text(c.ys.find('option:selected').text());
    	
    	c.it.find('.calendar-slider.m .left').click(function(){
    		var i = parseInt(c.ms.val()) - 1;
    		if (i < 0){
    			i = 11;
    			c.it.find('.calendar-slider.y .left').click();
    		}
    		c.ms.find('option:selected').attr('selected', false);
    		c.ms.find('option').eq(i).attr('selected', 'selected');
    		c.ms.change();
    		return false;
    	});
    	
    	c.it.find('.calendar-slider.m .right').click(function(){
    		var i = parseInt(c.ms.val()) + 1;
    		if (i > 11){
    			i = 0;
    			c.it.find('.calendar-slider.y .right').click();
    		}
    		c.ms.find('option:selected').attr('selected', false);
    		c.ms.find('option').eq(i).attr('selected', 'selected');
    		c.ms.change();
    		return false;
    	});
    	
    	c.it.find('.calendar-slider.y .left').click(function(){
    		var i = parseInt(c.ys.val()) - 1;
    		if (i < 0) i = 4;
    		c.ys.find('option:selected').attr('selected', false);
    		c.ys.find('option').eq(i).attr('selected', 'selected');
    		c.ys.change();
    		//c.ms.find('option:selected').change();
    		return false;
    	});
    	
    	c.it.find('.calendar-slider.y .right').click(function(){
    		var i = parseInt(c.ys.val()) + 1;
    		if (i > 4) i = 0;
    		c.ys.find('option:selected').attr('selected', false);
    		c.ys.find('option').eq(i).attr('selected', 'selected');
    		c.ys.change();
    		//c.ms.find('option:selected').change();
    		return false;
    	});
    	
    	_render();
    	
    	c.ms.change();
    	c.ys.change();
    });
    
    function _create_select(arr, clas, sel){
    	//sel = parseInt(sel);
    	var ss = '<select class="'+clas+'">';
    	var si = -1;
    	var i = 0;
    	$.each(arr, function(key, value) {
    		if (key == sel) si = i;
    		i++;
		    ss += '<option value ="'+key+'">'+value+'</option>';
		});
    	
    	ss += '</select>';
    	ss = $(ss);
    	ss.find('option').eq(si).attr('selected', 'selected');
    	return ss;
    }
    
    function _render(){
    	var month = parseInt(c.ms.val());
    	var year = parseInt(c.ys.val()) + 2011;
    	
    	var selected = new Date(year, month, 1);
    	
    	c.c = 0;
    	c.render.html('');
    	//if (selected.getDay()+1 > 0)
    		_render_fill(selected);
    	
    	
    	for (var i=1; i<=daysInMonth(month, year); i++){
    		_add_link(i, month, year);
    	}
    	
    	var selected = new Date(year, month, daysInMonth(month, year));
    	
    	if (selected.getDay() != 0)
    		_render_fill_after(selected);
    }
    
    function _render_fill(d){
    	var day = d.getDay();
    	if (day == 0) day = 7;
    	var month = d.getMonth()-1;
    	var year = d.getYear();
    	
    	if (month == -1) {month = 11; year--;}
    	
    	for (var i=daysInMonth(month, year)-day+2; i<=daysInMonth(month, year); i++){
    		_add_link(i, month, year, 'gray');
    	}
    }
    
    function _render_fill_after(d){
    	var day = d.getDay();
    	var month = d.getMonth()+1;
    	var year = d.getYear();
    	if (month == 12) {month = 0; year++;}
    	
    	for (var i=1; i<=7-day; i++){
    		_add_link(i, month, year, 'gray');
    	}
    }
    
    function _add_link(day, month, year, any){
    	c.c++;
    	
    	// Ищем ссылку среди активных
    	var is_link = false;
    	$.each(s.links, function(k, v) {
    		if (v[2] == day && v[1] == month && v[0] == year) is_link = true;
		});
		
    	// Ищем праздник среди активных
    	var is_hd = false;
    	var ttl = '';
    	$.each(s.hd, function(k, v) {
    		if (v[2] == day && v[1] == month && v[0] == year){
    			is_hd = true;
    			ttl = v[3];
    		}
		});
    	
    	var lnk = day+'.'+(parseInt(month)+1)+'.'+year;
    	
    	if (is_link)
    		var tmp = $('<a href="/news.php?DATE='+lnk+'">'+day+'</a>');
    	else
    		var tmp = $('<a href="#" class="empty-day">'+day+'</a>');
    		
    	if (is_hd) {
			tmp.addClass('holyday');
			tmp.attr('title', ttl);
		}
    	
    	if (any != null) tmp.addClass(any);
    	
    	var dayofweek = new Date(year, month, day).getDay();
    	//if (dayofweek == 0 && any == null)	tmp.addClass('sunday');
    	//if (dayofweek == 6 && any == null)	tmp.addClass('saturday');
    	if (c.c == 6 && any == null) {tmp.addClass('sunday');}
    	if (c.c == 7 && any == null) {tmp.addClass('saturday'); c.c=0;}
    	
    	//tmp.text(dayofweek);
    	
    	c.render.append(tmp);
    }
    
	function daysInMonth(month, year) {
		month++;
		var m = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
		
		if(month != 2)
			return m[month - 1];
		if(year % 4 != 0)
			return m[1];
		if(year % 100 == 0 && year % 400 != 0)
			return m[1];
		return m[1] + 1;
	}

}})(jQuery);
