// testado em IE5,IE6 e Firefox
function EDCal(id_prefix, cls_prefix, year, month)
{
	this.id_prefix = id_prefix;
	this.cls_prefix = cls_prefix;
	this.year = year;
	this.month = month;
}

EDCal.prototype.id_prefix             = null;
EDCal.prototype.cls_prefix            = null;
EDCal.prototype.year                  = null;
EDCal.prototype.month                 = null;
EDCal.prototype.first_day_index       = 0;
EDCal.prototype.day_names             = ['M', 'T', 'W', 'T', 'F', 'S', 'S'];
EDCal.prototype.month_names           = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
EDCal.prototype.can_select_month_year = false;
EDCal.prototype.html_outer_table      = '';
EDCal.prototype.html_prev_month       = '';
EDCal.prototype.html_next_month       = '';
EDCal.prototype.html_inner_table      = '';
EDCal.prototype.func_pre_prev_month   = null;
EDCal.prototype.func_post_prev_month  = null;
EDCal.prototype.func_pre_next_month   = null;
EDCal.prototype.func_post_next_month  = null;
EDCal.prototype.func_select_month     = null;
EDCal.prototype.func_select_year      = null;
EDCal.prototype.func_click            = null;
EDCal.prototype.func_write            = null;
EDCal.prototype.func_write_ext        = null;

var edcal_mdays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
function edcal_weekday(year, month, fdi)
{
	return (((EDCal_DaysSince1904(year, month) % 7) + [4, 3, 2, 1, 0, 6, 5][fdi]) % 7);
};

function edcal_select(id, value)
{
	var obj = document.getElementById(id);
	if (obj)
		for (var i = 0;i < obj.options.length;i++)
			if (obj.options[i].value == value)
			{
				obj.selectedIndex = i;
				return;
			}
}

function EDCal_DaysSince1904(year, month)
{
	var s = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
	var t = (Math.floor(((year - 1904) / 4)) * 1461);
	
	if ((year % 4) != 0)
		t += (366 + ((year % 4) - 1) * 365 + s[month - 1]);
	else
	{
		t += s[month - 1];
		if (month > 2)
			t++
	}
	return t;
};

function EDCal_WriteDoc(doc, edcal)
{
	if (typeof(edcal) != 'string')
		return false;
	
	with (eval(edcal))
	{
		if (id_prefix == null || cls_prefix == null || year == null || month == null)
			return false;
		
		if (year<1904)
			year=1904;
		else if (year>2099)
			year=2099;

		doc.write('<script>');
		
		// function clear()
		doc.write('function '+id_prefix+'clear(){var i; for (i=0;i<42;i++) document.getElementById(\''+id_prefix+'CDay\'+i+\'TDID\').innerHTML=\' \';};');

		// function update()
		doc.write('function '+id_prefix+'update(){var y='+edcal+'.year,m='+edcal+'.month;var d,i=edcal_weekday(y,m,'+edcal+'.first_day_index);var j=i+edcal_mdays[m-1];if (y%4==0&&m==2) j++;');
		doc.write('for (d=1;i<j;d++,i++) document.getElementById(\''+id_prefix+'CDay\'+i+\'TDID\').innerHTML='+(func_write==null?(func_write_ext==null?'d':edcal+'.func_write_ext(y,m,d,(i%7),\''+id_prefix+'\')'):edcal+'.func_write(y,m,d,\''+id_prefix+'\')')+';');
		if (can_select_month_year)
			doc.write('edcal_select(\''+id_prefix+'CMonthSELID\',m);edcal_select(\''+id_prefix+'CYearSELID\',y);');
		else
			doc.write('document.getElementById(\''+id_prefix+'CMonthTDID\').innerHTML='+edcal+'.month_names[m-1]+\' \'+y;');
		doc.write('};');

		// function prevm()
		doc.write('function '+id_prefix+'prevm(evt){');
		if (func_pre_prev_month != null)
			doc.write('if ('+edcal+'.func_pre_prev_month(\''+id_prefix+'\')) {');
		doc.write('if (evt.shiftKey) {if ('+edcal+'.year--<=1904) '+edcal+'.year=1904;}');
		doc.write('else if ('+edcal+'.month--<=1) {'+edcal+'.month=12;if ('+edcal+'.year--<=1904) '+edcal+'.year=1904;};'+id_prefix+'clear();'+id_prefix+'update();');
		if (func_post_prev_month != null)
			doc.write(edcal+'.func_post_prev_month(\''+id_prefix+'\');');
		if (func_pre_prev_month != null)
			doc.write('};');
		doc.write('};');

		// function nextm()
		doc.write('function '+id_prefix+'nextm(evt){');
		if (func_pre_next_month != null)
			doc.write('if ('+edcal+'.func_pre_next_month(\''+id_prefix+'\')) {');
		doc.write('if (evt.shiftKey) {if ('+edcal+'.year++>=2099) '+edcal+'.year=2099;}');
		doc.write('else if ('+edcal+'.month++>=12) {'+edcal+'.month=1;if ('+edcal+'.year++>=2099) '+edcal+'.year=2099;};'+id_prefix+'clear();'+id_prefix+'update();');
		if (func_post_next_month != null)
			doc.write(edcal+'.func_post_next_month(\''+id_prefix+'\');');
		if (func_pre_next_month != null)
			doc.write('};');
		doc.write('};');

		if (can_select_month_year)
		{
			// funcion selectm()
			doc.write('function '+id_prefix+'selectm(evt,obj){var m=obj.selectedIndex+1;');
			if (func_select_month != null)
				doc.write('if ('+edcal+'.func_select_month(m+1,\''+id_prefix+'\')) {');
			doc.write(edcal+'.month=m;'+id_prefix+'clear();'+id_prefix+'update();');
			if (func_select_month != null)
				doc.write('} else edcal_select(\''+id_prefix+'CMonthSELID\','+edcal+'.month);');
			doc.write('};');

			// funcion selecty()
			doc.write('function '+id_prefix+'selecty(evt,obj){var y=parseInt(obj.options[obj.selectedIndex].value);');
			if (func_select_year != null)
				doc.write('if ('+edcal+'.func_select_year(y,\''+id_prefix+'\')) {');
			doc.write(edcal+'.year=y;'+id_prefix+'clear();'+id_prefix+'update();');
			if (func_select_year != null)
				doc.write('} else edcal_select(\''+id_prefix+'CYearSELID\','+edcal+'.year);');
			doc.write('};');
		}

		// function click()
		if (func_click != null)
			doc.write('function '+id_prefix+'click(id_td){var id=parseInt(id_td.substring('+(id_prefix.length+4)+',id_td.length));if (!isNaN(id)&&id>=0&&id<=41){var y='+edcal+'.year,m='+edcal+'.month;var d,i=edcal_weekday(y,m,'+edcal+'.first_day_index);var j=i+edcal_mdays[m-1];if (y%4==0&&m==2) j++;if (id>=i&&id<j) '+edcal+'.func_click(y,m,id-i+1,\''+id_prefix+'\');};};');
		
		doc.write('<'+'/script>');

		// TABLE
		doc.write('<table '+(html_outer_table==null?'':html_outer_table)+' class="'+cls_prefix+'COuterTableClass"><tr><td class="'+cls_prefix+'CPrevTDClass" onclick="'+id_prefix+'prevm(event);">'+html_prev_month+'</td>');
		doc.write('<td id="'+id_prefix+'CMonthTDID" class="'+cls_prefix+'CMonthTDClass">');
		
		if (can_select_month_year)
		{
			doc.write('<select id="'+id_prefix+'CMonthSELID" class="'+cls_prefix+'CMonthSELClass" onchange="'+id_prefix+'selectm(event,this);">');
			for (var i = 1;i <= 12;i++)
				doc.write('<option value="'+i+'">'+month_names[i - 1]+'</option>');
			doc.write('</select><select id="'+id_prefix+'CYearSELID" class="'+cls_prefix+'CYearSELClass" onchange="'+id_prefix+'selecty(event,this);">');
			for (var i = 2099;i >= 1904;i--)
				doc.write('<option value="'+i+'">'+i+'</option>');
			doc.write('</select>');
		}

		doc.write('</td><td class="'+cls_prefix+'CNextTDClass" onclick="'+id_prefix+'nextm(event);">'+html_next_month+'</td></tr>');
		doc.write('<tr><td width="100%" class="'+cls_prefix+'CInnerTableTDClass" colspan=3><table class="'+cls_prefix+'CInnerTableClass"><tr>');
		for (var i = 0;i < 7;i++)
			doc.write('<td class="'+cls_prefix+'CWDay'+((i+first_day_index)%7>4?'N':'W')+'TDClass">'+day_names[(i+first_day_index)%7]+'</td>');
		doc.write('</tr>');

		for (var j = 0;j < 6;j++)
		{
			doc.write('<tr>');
			for (var i = 0;i < 7;i++)
				doc.write('<td id="'+id_prefix+'CDay'+(j*7+i)+'TDID" class="'+cls_prefix+'CDay'+((i+first_day_index)%7>4?'N':'W')+'TDClass"'+(func_click==null?'':' onclick="'+id_prefix+'click(this.id);"')+'></td>');
			doc.write('</tr>');
		}

		doc.write('</table></td></tr></table>');
		eval(id_prefix+'clear();'+id_prefix+'update();');
	}
	return true;
}
function EDCal_Write(edcal)
{
	return EDCal_WriteDoc(document,edcal);
};
