Bw.Date =
{
	DEFAULT_DATE_FORMAT: "dd/mm/yyyy",
	WEEKS_STARTS_AT: 1,
	DAY_LABELS: [ "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche" ],
	SHORT_DAY_LABELS: [ "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim" ],
	MONTH_LABELS: [ "Janvier" ,"Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre" ]
};

Bw.Date.Format = 
{
	superclassName: null,
	selfclassName: "Bw.Date.Format",
	
	dfl_fmt: null,
	
	defaultFormat: function ()
	{
		if (this.dfl_fmt == null)
		{
			this.dfl_fmt = this.create();
		}
		return this.dfl_fmt;
	},
	
	create: function (fmt)
	{
		var obj = {};
		
		obj.fmt = (!fmt) ? Bw.Date.DEFAULT_DATE_FORMAT : fmt;
		
		Bw.Core.bootstrap (obj, "Bw.Date.Format");
		
		return obj;
	},
	
	initialize: function ()
	{
		this.act = [];
		
		var f = this.fmt;
		var a = this.act;
		var l = f.length;
		var prev = null;
		
		for (var i = 0; i < l; i++)
		{
			var c = f.charAt (i);
			
			if (c != prev)
			{
				var k = a.length;
				a[k] = new Array();
				a[k][0] = c;
				a[k][1] = i;
				a[k][2] = 1;
			}
			else
			{
				a[a.length-1][2]++;
			}
	
			prev = c;
		}
	},
	
	pad: function (v, len)
	{
		var l = v.length;
		if (l <= len) 
		{
			for (var i = l; i < len; i++)
			{
				v = '0' + v;
			}
			return v;
		}
	}
};

Bw.Date.Helpers = 
{	
	read: function (str, fmt)
	{
		if (!fmt) fmt = Bw.Date.Format.defaultFormat();

		var d = null;
		var m = null;
		var y = null;
		var c = fmt.act;
		var l = c.length;
	
		for (var i = 0; i < l; i++)
		{
			var a = c[i];
			var typ = a[0];
			var beg = a[1];
			var end = beg + a[2];
			
			var s = str.substring (beg, end);
			var n = new Number (s);
			n = n.valueOf();
			if (typ == 'd') d = n;
			else if (typ == 'm') m = n;
			else if (typ == 'y') y = n;
		}
	
		return new Date (y, m-1, d);
	},
	
	write: function (date, fmt)
	{
		if (!fmt) fmt = Bw.Date.Format.defaultFormat();

		var d = ''+(date.getDate());
		var m = ''+(date.getMonth() + 1);
		var y = ''+(date.getFullYear());
	
		var c = fmt.act;
		var l = c.length;
		
		var s = '';
		
		for (var i = 0; i < l; i++)
		{
			var a = c[i];
			var typ = a[0];
			var len = a[2];
			
			if (typ == 'd')
			{
				s += fmt.pad (d, len);
			} 
			else if (typ == 'm')
			{
				s += fmt.pad (m, len);
			} 
			else if (typ == 'y')
			{
				s += fmt.pad (y, len);
			}
			else
			{
				for (var j = 0; j < len; j++)
				{
					s += typ;
				}
			}
		}
		return s;
	},
	
	addMinutes: function (date, m)
	{
		date.setMinutes (date.getMinutes() + m);
		return date;
	},
	
	addHours: function (date, h)
	{
		date.setHours (date.getHours() + h);
		return date;
	},
	
	addDays: function (date, d)
	{
		date.setDate (date.getDate() + d);
		return date;
	},
	
	addMonths: function (date, m)
	{
		date.setMonth (date.getMonth() + m);
		return date;
	},
	
	addYears: function (date, y)
	{
		date.setFullYear (date.getFullYear() + y);
		return date;
	},
	
	prevWeek: function (date)
	{
		return this.addDays (date, -7);
	},
	
	nextWeek: function (date)
	{
		return this.addDays (date, 7);
	},
	
	weekStart: function (date)
	{
		var d = this.getDay (date);
		
		this.addDays (date, -d);
		
		date.setHours(0);
		date.setMinutes(0);
		date.setSeconds(0);
		date.setMilliseconds(0);

		return date;
	},
	
	weekEnd: function (date)
	{
		var d = this.getDay (date);
		
		this.addDays (date, 6 - d);
		
		date.setHours(23);
		date.setMinutes(59);
		date.setSeconds(59);
		date.setMilliseconds(999);

		return date;
	},
	
	monthStart: function (date)
	{
		date.setDate (1);
		date.setHours(0);
		date.setMinutes(0);
		date.setSeconds(0);
		date.setMilliseconds(0);
		
		return date;
	},
	
	monthEnd: function (date)
	{
		this.monthStart (date);
		this.addMonths (date, 1);
		this.addDays (date, -1);
		
		date.setHours(23);
		date.setMinutes(59);
		date.setSeconds(59);
		date.setMilliseconds(999);
		
		return date;
	},
	
	getDay: function (date)
	{
		var d = date.getDay() - Bw.Date.WEEKS_STARTS_AT;
		return (d < 0) ? 7 + d : d;
	},
	
	weeksInMonth: function (date)
	{
		var d = new Date (date);
		
		this.monthStart (d);
		var m = d.getMonth();
		
		var i = 0;
		while (d.getMonth() == m)
		{
			this.nextWeek (d);
			if (i == 0) this.weekStart (d);
			i++;
		}
			
		return i;
	}
};


