function MyDate(year, month, day) {
	this.year = year;
	this.month = month;
	this.day = day;

	this.daysOfMonth = function (year, month) {
		var days = new Hash();
	
		days.setItem(1,31);  days.setItem(2,28);  days.setItem(3,31);
		days.setItem(4,30);  days.setItem(5,31);  days.setItem(6,30);
		days.setItem(7,31);  days.setItem(8,31);  days.setItem(9,30); 
		days.setItem(10,31); days.setItem(11,30); days.setItem(12,31);

		if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
			days.setItem(2,29);
		return days.getItem(month);
	}
	
	this.setMyDateDBFormat = function (dateDB){
		a = dateDB.split('-');
		this.year = a[0];
		this.month = a[1];
		this.day = a[2];
	}
	
	this.prevMonth = function () {
		if(this.month == 1) {
			this.year--; this.month = 12;
		} else {
			this.month--;
		}
	}

	this.nextMonth = function () {
		if(this.month == 12) {
			this.year++; this.month = 1;
		} else {
			this.month++;
		}
	}

	this.dateAdd = function (n) {
		this.day += n;
		while(this.day <=0 || this.day > this.daysOfMonth(this.year, this.month)) {
			if(this.day <= 0){
				this.prevMonth();
				this.day += this.daysOfMonth(this.year, this.month);
			} else {
				this.day -= this.daysOfMonth(this.year, this.month);
				this.nextMonth();
			}
		}
	}

	this.MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	this.DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');

	this.LZ = function (x) {return(x<0||x>9?"":"0")+x}

// ------------------------------------------------------------------
// The format string consists of the following abbreviations:
// 
// Field        | Full Form          | Short Form
// -------------+--------------------+-----------------------
// Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
// Month        | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
//              | NNN (abbr.)        |
// Day of Month | dd (2 digits)      | d (1 or 2 digits)
// Day of Week  | EE (name)          | E (abbr)
// Hour (1-12)  | hh (2 digits)      | h (1 or 2 digits)
// Hour (0-23)  | HH (2 digits)      | H (1 or 2 digits)
// Hour (0-11)  | KK (2 digits)      | K (1 or 2 digits)
// Hour (1-24)  | kk (2 digits)      | k (1 or 2 digits)
// Minute       | mm (2 digits)      | m (1 or 2 digits)
// Second       | ss (2 digits)      | s (1 or 2 digits)
// AM/PM        | a                  |
//
// NOTE THE DIFFERENCE BETWEEN MM and mm! Month=MM, not mm!
// Examples:
//  "MMM d, y" matches: January 01, 2000
//                      Dec 1, 1900
//                      Nov 20, 00
//  "M/d/yy"   matches: 01/20/00
//                      9/2/00
//  "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
// ------------------------------------------------------------------
	this.formatDate = function formatDate(format) {
		
		var date = new Date();
		date.setFullYear(this.year);
		date.setMonth(this.month-1);
		date.setDate(this.day);
		date.setHours(0);
		date.setMinutes(0);
		date.setSeconds(0);
		date.setMilliseconds(0);
		
		format=format+"";
		var result="";
		var i_format=0;
		var c="";
		var token="";
		var y=date.getYear()+"";
		var M=date.getMonth()+1;
		var d=date.getDate();
		var E=date.getDay();
		var H=date.getHours();
		var m=date.getMinutes();
		var s=date.getSeconds();
		var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
		// Convert real date parts into formatted versions
		var value=new Object();
		if (y.length < 4) {y=""+(y-0+1900);}
		value["y"]=""+y;
		value["yyyy"]=y;
		value["yy"]=y.substring(2,4);
		value["M"]=M;
		value["MM"]=this.LZ(M);
		value["MMM"]=this.MONTH_NAMES[M-1];
		value["NNN"]=this.MONTH_NAMES[M+11];
		value["d"]=d;
		value["dd"]=this.LZ(d);
		value["E"]=this.DAY_NAMES[E+7];
		value["EE"]=this.DAY_NAMES[E];
		value["H"]=H;
		value["HH"]=this.LZ(H);
		if (H==0){value["h"]=12;}
		else if (H>12){value["h"]=H-12;}
		else {value["h"]=H;}
		value["hh"]=this.LZ(value["h"]);
		if (H>11){value["K"]=H-12;} else {value["K"]=H;}
		value["k"]=H+1;
		value["KK"]=this.LZ(value["K"]);
		value["kk"]=this.LZ(value["k"]);
		if (H > 11) { value["a"]="PM"; }
		else { value["a"]="AM"; }
		value["m"]=m;
		value["mm"]=this.LZ(m);
		value["s"]=s;
		value["ss"]=this.LZ(s);
		while (i_format < format.length) {
			c=format.charAt(i_format);
			token="";
			while ((format.charAt(i_format)==c) && (i_format < format.length)) {
				token += format.charAt(i_format++);
				}
			if (value[token] != null) { result=result + value[token]; }
			else { result=result + token; }
			}
		return result;
	}
}

/* metodos que devem ser adaptados para o objeto, caso necessario.
this.dateSub = function (date1, date2) {
	var n = date1.day - date2.day;
	var date3;
	var sign = 1;

	if(date1.year < date2.year || 
		date1.year == date2.year && date1.month < date2.month ){
		sign = -1;
		date3 = date1;
		date1 = date2;
		date2 = date3;
	}
	while(!(date1.year == date2.year && date1.month == date2.month)) {
		n += daysOfMonth(date2.year, date2.month);
		nextMonth(date2);
	}
	return sign * n;
}

this.subDates = function () {
	var year1 = parseInt(document.subDate.year1.value);
	var month1 = parseInt(document.subDate.month1.value);
	var day1 = parseInt(document.subDate.day1.value);
	var year2 = parseInt(document.subDate.year2.value);
	var month2= parseInt(document.subDate.month2.value);
	var day2 = parseInt(document.subDate.day2.value);

	var date1 = new myDate(year1, month1, day1);
	var date2 = new myDate(year2, month2, day2);
	var errmsg = "";

	if( year1 < 1900 || year2 < 1900 )
		errmsg += "invalid year input; year(1900-)\n";
	if( month1 <= 0 || month1 > 12 ||
		month2 <= 0 || month2 > 12 )
		errmsg += "invalid month input; month(1-12)\n";
	if( day1 <= 0 || day1 > daysOfMonth(year1, month1) ||
		day2 <= 0 || day2 > daysOfMonth(year2, month2) )
		errmsg += "invalid day input; day(1-31)\n";
	if( errmsg ) {
		alert(errmsg);
	} else {
		document.subDate.days.value = dateSub(date1, date2);
	}
}

this.addDates = function () {
	var year1 = parseInt(document.addDate.year1.value);
	var month1 = parseInt(document.addDate.month1.value);
	var day1 = parseInt(document.addDate.day1.value);
	var days = parseInt(document.addDate.days.value);
	var date1 = new myDate(year1, month1, day1);
	var errmsg = "";

	if( year1 < 1900 )
		errmsg += "invalid year input; year(1900-)\n";
	if( month1 <= 0 || month1 > 12 )
		errmsg += "invalid month input; month(1-12)\n";
	if( day1 <= 0 || day1 > daysOfMonth(year1, month1) )
		errmsg += "invalid day input; day(1-31)\n";
	if( errmsg ) {
		alert(errmsg);
	} else {
		dateAdd(date1, days);
		document.addDate.year2.value = date1.year;
		document.addDate.month2.value = date1.month;
		document.addDate.day2.value = date1.day;
	}
}
*/
