/* (c) 2009 - Jean Luc BIELLMANN except getWeek() */

function calLug () {
	objCalLUG = this;
	this.now = new Date();
	this.cy = this.now.getFullYear();
	this.cm = this.now.getMonth();
	this.cd = this.now.getDate();
	this.weekday = new Array("Dim","Lun","Mar","Mer","Jeu","Ven","Sam");
	this.weekday_fr = new Array("Lun","Mar","Mer","Jeu","Ven","Sam","Dim");
}
calLug.prototype = {
	initDate : function (e) {
		for (var m=1;m<13;m++) {
			var input = E('input',{
				type:'button',
				'class':'month tiny',
				value:(m<10 ? '0'+m : m)
			}).observe('click',function (e) { objCalLUG.updM(e); });
			A($('calLugMonths'),input);
			if (m==6)
				A($('calLugMonths'),E('br'));
		}
		$('py').observe('click',function (e) { objCalLUG.decY(e); });
		$('ny').observe('click',function (e) { objCalLUG.incY(e); });
		$('pm').observe('click',function (e) { objCalLUG.decM(e); });
		$('nm').observe('click',function (e) { objCalLUG.incM(e); });
		this.setY(this.cy);
		this.setM(this.cm);
		this.setD(this.cd);
		this.updCal();
	},
	setY : function (y) {
		this.cy = y;
		$('cy').update(y);
	},
	setM : function (m) {
		objCalLUG.cm = parseInt(m,10);
		$$('input.month').each(function (input) {
			S(input,{'class':'month tiny'+(parseInt(input.value,10)==objCalLUG.cm+1 ? ' sel bold' :'')});
		});
	},
	setD : function (d) {
		this.cd = parseInt(d,10);
	},
	incY : function (e) {
		this.cy++;
		this.setY(this.cy);
		this.updCal();
	},
	decY : function (e) {
		this.cy--;
		this.setY(this.cy);
		this.updCal();
	},
	updY : function (e) {
		var obj = Event.element(e);
		this.setY(this.cy+(obj.id=='py' ? -1 : 1));
		this.updCal();
	},
	incM : function (e) {
		this.cm++;
		if (this.cm==12) {
			this.cm=0;
			this.setY(this.cy+1);
		}
		this.setM(this.cm);
		this.updCal();
	},
	decM : function (e) {
		this.cm--;
		if (this.cm==-1) {
			this.cm=11;
			this.setY(this.cy-1);
		}
		this.setM(this.cm);
		this.updCal();
	},
	updM : function (e) {
		var obj = Event.element(e);
		this.setM(parseInt(obj.value,10)-1);
		this.updCal();
	},	
	updD : function (e) {
		var obj = Event.element(e);
	},	
	getWeekDay : function (date) {
		return this.weekday[date.getDay()];
	},
	daysInMonth : function (m, y) {
		return 32 - new Date(y, m, 32).getDate();
	},
	getWeek : function (year,month,day) {
		//lets calc weeknumber the cruel and hard way :D
		//Find JulianDay 
		month += 1; //use 1-12
		var a = Math.floor((14-(month))/12);
		var y = year+4800-a;
		var m = (month)+(12*a)-3;
		var jd = day + Math.floor(((153*m)+2)/5) + 
			(365*y) + Math.floor(y/4) - Math.floor(y/100) + 
			Math.floor(y/400) - 32045;      // (gregorian calendar)
		//var jd = (day+1)+Math.Round(((153*m)+2)/5)+(365+y) + 
		//                 Math.round(y/4)-32083;    // (julian calendar)

		//now calc weeknumber according to JD
		var d4 = (jd+31741-(jd%7))%146097%36524%1461;
		var L = Math.floor(d4/1460);
		var d1 = ((d4-L)%365)+L;
		NumberOfWeek = Math.floor(d1/7) + 1;
		return NumberOfWeek;        
	},
	getCal : function (cy,cm) {
		var cal = {};
		var lastday = this.daysInMonth(cm, cy);
		var wstart = this.getWeek(cy,cm,1);
		var wend = this.getWeek(cy,cm,lastday);
		var d,cdate,week,wday;
		
		for (d=1;d<=lastday;d++) {
			cdate = new Date(cy,cm,d);
			week = this.getWeek(cy,cm,d);
			if (typeof(cal['w'+week])=='undefined')
				cal['w'+week] = {};
			wday = this.getWeekDay(cdate);
			//console.log(cdate+' '+week+' '+wday);
			cal['w'+week][wday] = d;
		}

		for (d=0;d>-7;d--) {
			cdate = new Date(cy,cm,d);
			//console.log(cy+','+cm+','+d+':'+this.getWeek(cy,cm,d)+'='+wstart+'?');
			if (this.getWeek(cy,cm,d)!=wstart)
				continue;
			wday = this.getWeekDay(cdate);
			cal['w'+wstart][wday] = d;
		}
	
		for (d=lastday+1;d<lastday+7;d++) {
			cdate = new Date(cy,cm,d);
			if (this.getWeek(cy,cm,d)!=wend)
				continue;
			wday = this.getWeekDay(cdate);
			cal['w'+wend][wday] = d;
		}

		//console.debug(cal);
		return cal;
	},
	updCal : function () {
		var table,thead,tbody,tr,td;
		var i;

		var cal = this.getCal(this.cy,this.cm);
		
		table = E('table',{'class':'year'});
		C(table,{'margin':'0 auto'});
		thead = E('thead');
		A(table,thead)
		tbody = E('tbody');
		A(table,tbody)
		tr = E('tr');
		td = E('td',{'class':'center',width:'40px'}).update('Sem');
		A(tr,td)
		td = E('td');
		for (i=0;i<this.weekday_fr.length;i++) {
			td = E('td').update(this.weekday_fr[i]);
			A(tr,td)
		}
		A(thead,tr)
		tr = E('tr');
		for (w in cal) {
			tr = E('tr');
			td = E('td',{'class':'week center tiny bold'}).update(w.replace(/w/,''));
			A(tr,td)
			for (i=0;i<this.weekday_fr.length;i++) {
				td = E('td',{'class':'center'});
				wday = this.weekday_fr[i];
				var d = cal[w][wday];
				var reald = new Date(this.cy,this.cm,d);
				var curnow = new Date(this.now.getFullYear(),this.now.getMonth(),this.now.getDate());
				var input = E('input',{
					type:'button', 
					id:'day'+this.YMD(this.cy,this.cm+1,d), 
					'class':'day tiny italic'+(reald.getMonth()==this.cm ? ' curm' : '')+(parseInt(reald-curnow,10)==0 ? ' curd' : ''), 
					value:reald.getDate()
				}).observe('click',function (e) { objCalLUG.updD(e); });
				A(td,input)
				//td.update(cal[w][wday]);
				A(tr,td)
			}
			A(tbody,tr)
		}	
		$('cal').update('');
		A($('cal'),table);	
		
		this.addEvents();
	},
	YMD : function (y,m,d) {
		m = parseInt(m,10);
		d = parseInt(d,10);
		return y+(m<10 ? '0'+m : m)+(d<10 ? '0'+d : d);
	},
	getIcalYear : function (ical) {
		return ical.substr(0,4);
	},
	getIcalMonth : function (ical) {
		return ical.substr(4,2);
	},
	getIcalDay : function (ical) {
		return ical.substr(6,2);
	},
	addEvents : function () {
		var tr,td,div,a,src,img;
		var k = 1;
		var nbevents = 0;
		$('events').update('');
		for (var i=0;i<calDatas.length;i++) {
			var data = calDatas[i];			
			if (this.getIcalYear(data[0])==this.cy && parseInt(this.getIcalMonth(data[0])-1,10)==parseInt(this.cm,10)) {
				var day = this.getIcalDay(data[0]);
				var id = 'day'+this.YMD(this.cy,this.cm+1,day);
				$(id).style.background='rgb(204, 255, 0)';
				tr = E('tr');
				td = E('td');
				a = E('a',{'href':'http://cdhf.net'});
				// http://www.cdhf.net/fr/villages/blasons/xxxM.png';
				src = 'img/heraldry/'+data[3].toLowerCase()+'M.png';
				img = E('img',{'src':src,'alt':'blason de la commune de '+data[3]});
				A(a,img);
				A(td,a);
				A(tr,td);
				//if (!img.style.offsetWidth) {
				//	img.src = 'img/heraldry/empty.png';
        //  img.alt = 'blason inconnu ?';
        //}
				td = E('td');
				C(td,{'padding':'2px 0;'});
				div = E('div',{'class':'boxradius10 '+(k++%2 ? 'hl60' : 'nothl60')}).update(data[2]+' - '+data[3]+'<br/>'+data[4]);
				C(div,{'height':'60px','width':'245px','font-size':'9pt','display':'table-cell','vertical-align':'middle'});
				A(td,div);
				A(tr,td);
				A($('events'),tr);
				nbevents++;
			}
		}
		if (!nbevents) {
			tr = E('tr');
			td = E('td');
			div = E('div',{'class':'boxradius10 '+(k++%2 ? 'hl60' : 'nothl60')}).update('Banquise calme - STOP.<br/>Rien à signaler - STOP.');
			C(div,{'height':'60px','width':'300px','font-size':'9pt','display':'table-cell','vertical-align':'middle'});
			A(td,div);
			A(tr,td);
			A($('events'),tr);		
		}
	}
}
var _calLug = new calLug();		
