$(document).ready(function(){
	var jCont = $("#acrichive_calendar_cont");
	var daysCount;
	var startDate;
	var monthsI = ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"];
	var monthsR = ["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"];
	var datesCache = {d:{},w:{},m:{}};
	
	function formatWeek(w) {
		var s = w.start; var e = w.end;
		var sm = s.getMonth();		
		var em = e.getMonth();
		if(sm == em)
			return s.getDate() + " - " + e.getDate() + " " + monthsR[sm];
		else
			return s.getDate()+ " " + monthsR[sm] + " - " + e.getDate() + " " + monthsR[em];
	}
	
	function formatMonth(m) {
		if(m.count < 4)
			return "&nbsp;";
		return monthsI[m.d.getMonth()]+" "+m.d.getFullYear();
	}
	function itoa(i) {
		return i<10?'0'+i:i;
	}
	function dayUrl(d) {
		return d.getFullYear()+"-"+itoa(d.getMonth()+1)+"-"+itoa(d.getDate());
	}
	function monthUrl(d) {
		return d.getFullYear()+"-"+itoa(d.getMonth()+1);
	}
	function isDay(d) {
		var key = ""+d.getFullYear()+itoa(d.getMonth()+1)+itoa(d.getDate());
		return datesCache.d[key];
	}
	function isWeek(d) {
		var key = ""+d.getFullYear()+itoa(d.getMonth()+1)+itoa(d.getDate());
		return datesCache.w[key];
	}	
	function isMonth(d) {
		var key = ""+d.getFullYear()+itoa(d.getMonth()+1);
		return datesCache.m[key];
	}
	
	function backWeek(){
		startDate = new Date(startDate.getTime() - 7*24*3600*1000);
		update();
		return false;
	}
	
	function backMonth(){
		startDate = new Date(startDate.getTime() - daysCount*24*3600*1000);
		update();
		return false;
	}
	
	function nextWeek(){
		startDate = new Date(startDate.getTime() + 7*24*3600*1000);
		update();
		return false;
	}
	
	function nextMonth(){
		startDate = new Date(startDate.getTime() + daysCount*24*3600*1000);
		update();
		return false;
	}
	
	function update() {
		var i;
		//формируем строки
		var t = new Date(startDate);
		var dates = {days: [], weeks: [], months: [{d: new Date(t), count: 0}]};
		for(i=0; i<daysCount; i++) {
			dates.days.push(t);
			if(t.getDay() == 1) //пн
				dates.weeks.push({start: t});
			else if(t.getDay() == 0) //вс
				dates.weeks[dates.weeks.length-1].end = t;
			if(i != 0 && t.getDate() == 1)
				dates.months.push({d: t, count:1});
			else
				dates.months[dates.months.length-1].count++;
			
			t = new Date(t.getTime() + 24*3600*1000);
		}
		jCont.empty();
		var isCl, dom;
		for(i=0; i<dates.months.length; i++) {
			var m = dates.months[i];
			isCl = isMonth(m.d);
			dom = document.createElement(isCl?'a':'div');
			if(isCl) {
				$(dom).html('<font>'+formatMonth(m)+'</font><span class="round-l"></span><span class="round-r"></span>');
				dom.href = '?m='+monthUrl(m.d);
			} else
				$(dom).html('<font>'+formatMonth(m)+'</font><span class="round-ml"></span><span class="round-mr"></span>');
			dom.className = 'calendar-month';
			if($.browser.msie)
				dom.style.width = (m.count*25 - 2) + 'px';
			else
				dom.style.width = (m.count*25 - 16) + 'px';
			jCont.append(dom);
		}
		var now = new Date();
		for(i=0; i<dates.weeks.length; i++) {			
			isCl = isWeek(dates.weeks[i].start); 
			dom = document.createElement(isCl?'a':'div');
			var s = dates.weeks[i].start;
			var dt = now.getTime() - s.getTime();
			var isCur = dt > 0 && dt < 7*24*3600*1000;
			dom.className = isCur?'calendar-week':'calendar-week-active';
			if(isCl) {
				$(dom).html('<font>'+formatWeek(dates.weeks[i])+'</font><span class="round-l"></span><span class="round-r"></span>');
				dom.href = '?w='+dayUrl(s);
			}else
				$(dom).html('<font>'+formatWeek(dates.weeks[i])+'</font><span class="round-wl2"></span><span class="round-wr2"></span>');				
			jCont.append(dom);
		}
		for(i=0; i<dates.days.length; i++) {
			var d = dates.days[i];
			isCl = isDay(d);
			var t = d.getDay();
			var holy = t==0 || t==6; 
			dom = document.createElement(isCl?'a':'div');
			dom.innerHTML = d.getDate();
			if(isCl) {
				dom.href = '?d='+dayUrl(d);
				dom.className = holy ? 'c-day-won' : 'c-day-woff';
			} else 
				dom.className = holy ? 'c-day-non' : 'c-day-nn';
			dom.className += holy ? ' font-ae715c' : ' font-5b6e4f';
			jCont.append(dom);
		}
		dom = document.createElement('a'); 
		dom.href='#';
		dom.className = 'blog-cal-l1';
		dom.onclick = backMonth;
		jCont.append(dom);
		
		dom = document.createElement('a'); 
		dom.href='#';
		dom.className = 'blog-cal-r1';
		dom.onclick = nextMonth;
		jCont.append(dom);
		
		dom = document.createElement('a'); 
		dom.href='#';
		dom.className = 'blog-cal-l2';
		dom.onclick = backWeek;
		jCont.append(dom);
		
		dom = document.createElement('a'); 
		dom.href='#';
		dom.className = 'blog-cal-r2';
		dom.onclick = nextWeek;
		jCont.append(dom);
		
		$("a",jCont).focus(function(){this.blur();});
	}
	
	function init() {
		//корректировка ширины
		/*var width = jCont[0].offsetWidth;
		var weeksCount = Math.floor(width/DAY_W/7);
		daysCount = weeksCount*7;
		width = daysCount*DAY_W;
		;*/
		if(jCont[0].parentNode.offsetWidth >= 830) {
			jCont.css("width", 707);
			daysCount = 28;
		} else { 
			jCont.css("width", 530);
			daysCount = 21;
		}
		//определяем дату конца недели (воскресения)
		var t = new Date();
		if(calStart !== null) {
			var ds = calStart.split('-');
			t.setFullYear(parseInt(ds[0]),parseInt(ds[1])-1,parseInt(ds[2]));
		}
		var dn = t.getDay();
		var nAdd = dn==0?0:(7-dn);
		t = new Date(t.getTime() + nAdd*24*3600*1000);
		//стартовая дата
		startDate = new Date(t.getTime() - (daysCount-8)*24*3600*1000);
		//кешируем дату
		var count = allDates.length;
		var d;
		for(var i=0; i<count; i++) {
			d = "20"+allDates[i];
			datesCache.d[d] = true;
			datesCache.m[d.substr(0, 6)] = true;
			var t = new Date();
			t.setFullYear(d.substr(0, 4));
			t.setMonth(d.substr(4, 2)-1);
			t.setDate(d.substr(6, 2));
			var dow = t.getDay();
			t.setTime(t.getTime() - (dow==0?6:dow-1)*24*3600*1000);
			datesCache.w[""+t.getFullYear()+itoa(t.getMonth()+1)+itoa(t.getDate())] = true;
		}
	}
	
	init();
	update();
});
