/* (c) 2009 Jean Luc BIELLMANN - GR - contact@grouperessources.com */

function Cal () {
	objCal = this;
	this.date = new Date();
	this.targetElement = '';
	this.id = '';
}
Cal.prototype = {
	create : function (year,month,day) {
		// 0 to avoid errors on month < 31 days...
		d = new Date(0);
		d.setDate(day);
		d.setMonth(month-1);
		d.setFullYear(year); 
		return d;  
	},
	init : function (year,month,day) {
		objCal.date = objCal.create(year,month,day);
		I($('cal_year'),year);
		objCal.buildMonths();
	},
	today : function () {
		objCal.date = new Date();
		I($('cal_year'),objCal.date.getFullYear());
		objCal.buildMonths();
	},
	chgYear : function (offset) {
		var o = objCal.date.getFullYear()+(offset=='+1' ? 1 : -1);
		I($('cal_year'),o.toString());
		objCal.date = objCal.create(o,objCal.date.getMonth()+1,objCal.date.getDate());
		objCal.buildMonths();
	},
	chgMonth :function (month) {
		var o = $('jscalmonths').getElementsByTagName('input');
		for (var i=0;i<o.length;i++) {
			o[i].setAttribute('class',o[i]==month ? 'month sel' : 'month');
			if (o[i]==month) objCal.date.setMonth(i);
		}
		objCal.buildDays();
	},
	exists : function (year,month,day) {
		if (!day || !month || !year)
			return false;
		var monthsLength = objCal.getMonthsLength(year);
		return day > monthsLength[month-1] ? false : true;
	},
	leapYear : function (year) {
		return (year/4 == parseInt(year/4)) ? true : false;
	},
	getMonthsLength : function (year) {
		var monthsLength = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
		if (objCal.leapYear(year))
			monthsLength[1] = 29;
		return monthsLength;
	},
	setMonth : function (e) {
		var input = Event.element(e);
		if (input) 
			objCal.chgMonth(input);
	},
	setDay : function (e) {
		var input = Event.element(e);
		if (input) 
			objCal.set(input);
	},
	buildMonths : function () {
		var tr = '';
		var monthFr = new Array('Jan','Fév','Mar','Avr','Mai','Jui','Jul','Aoû','Sep','Oct','Nov','Déc');
		// remove old buttons
		var childnodes = $('jscalmonths').childNodes;
		for (var n=childnodes.length-1;n>=0;n--)
			$('jscalmonths').removeChild(childnodes[n]);
		// build new one
		for (i=1;i<13;i++) {
			if (i==1 || i==7) {
				tr = E('tr');
				A($('jscalmonths'),tr);
			}
			var td = E('td');
			A(tr,td);
			var s = i<10 ? '0'+i : i.toString();
			var input = E('input',{type:'button',id:'month'+s,'class':'month',value:monthFr[i-1]});
			//input.setAttribute('onclick','_cal.chgMonth(this)');
			input.style.width='35px'; /* bloody IE 6 !!! */
			A(td,input);
			Event.observe(input,'click',objCal.setMonth);
			//input.onclick = function { objCal.chgMonth(input); }
			if (i==objCal.date.getMonth()+1)
				S(input,{'class':'month sel'});
		}
		objCal.buildDays();
	},
	buildDays : function () {
		// remove old buttons
		var childnodes = $('jscaldays').childNodes;
		for (var n=childnodes.length-1;n>=0;n--)
			$('jscaldays').removeChild(childnodes[n]);
		// retrieve vars
		var year = objCal.date.getFullYear();
		var month = objCal.date.getMonth()+1;
		var day = 1;
		//alert(year+' '+month+' '+day);
		var first_day = this.create(year,month,day);
		var numrow = 0;
		var monthsLength = objCal.getMonthsLength(year);
		var last_day = monthsLength[month-1];
		var tr = E('tr');
		A($('jscaldays'),tr);
		var dn = new Array(1,2,3,4,5,6,0);
		var i = 0;
		var started = 0;
		var today = new Date();
		do {
			var td = E('td');
			if (dn[i]==first_day.getDay()) // 0 is sunday...)
				started = 1;	
			if (started) {
				var txt = day.toString();
				var input = E('input',{type:'button','class':'day',name:'day[]',value:(txt.length==1 ? '0'+txt : txt)});
				input.style.width='30px'; /* bloody IE 6 !!! */
				//input.setAttribute('onclick','_cal.set(this)');
				A(td,input);
				Event.observe(input,'click',objCal.setDay);
				if (day==today.getDate() && month==today.getMonth()+1 && year==today.getFullYear())
					S(input,{'class':'day sel'});
				if (day==last_day)
					started = 0;	
				day++;	
			}
			A(tr,td);
			i++;
			if (i%7==0) {
				tr = E('tr');
				A($('jscaldays'),tr);
			}
		} while (day<=last_day || (day>last_day && i%7));
	},
	setTarget : function (targetElement) {
		objCal.targetElement = targetElement;
	},
	set : function (input) {
		objCal.date.setDate(input.value);
		objCal.send();
	},
	send : function () {
		var value = objCal.read();
		$(objCal.id).value = value;
		objCal.hide();
		//slotJsCal(value);
	}, 	  	
	read : function () {
		var d = parseInt(objCal.date.getDate());
		d  = d<10 ? '0'+d.toString() : d.toString(); 
		var m = parseInt(objCal.date.getMonth())+1;
		m  = m<10 ? '0'+m.toString() : m.toString(); 
		var y = objCal.date.getFullYear();
		return d+'/'+m+'/'+y.toString();
	},
	hide : function (e) {
		$('jscal').hide();		
	},
	show : function (id) {
		var pos = $(id).cumulativeOffset();
		objCal.id = id;
		//alert(pos.left+' '+pos.top);
		$('jscal').style.left = parseInt(pos.left+$(id).offsetWidth+40)+'px';
		$('jscal').style.top = pos.top+'px';
		$('jscal').show();
		objCal.today();		
	}
}
var _cal = new Cal();

