var $__bCalInst = null;
function CreateBennerCalendar(resultFieldName,formNameToSubmit,calType)
{
	$__bCalInst = null;
	$__bCalInst = new BennerCalendar(resultFieldName,formNameToSubmit,calType);
	return $__bCalInst;
}
BennerCalendar = function(resultFieldName,formNameToSubmit,calType)
{
	this._calType = calType;
	this._calPnlTarget=null;
	this._calOpenned = false;
	this._formNameToSubmit = formNameToSubmit;
	if (resultFieldName != null)
		this._calPnlTarget = document.getElementsByName(resultFieldName)[0];
}
BennerCalendar.prototype.dateConfirm = function(oEvent,oScope,type) 
{
	var dateValue;
	if (document.all)
		dateValue = oEvent.srcElement.getAttribute("dateValue");
	else
		dateValue = oEvent.target.getAttribute("dateValue");

	if (type == 1 && oScope._calType == 0)
		oScope.setDate(oScope,dateValue,0);
	else
	{
		oScope._calPnlTarget.value = dateValue;

		if (oScope._calType == 1)
			oScope._calPnlTarget.value = text_formatMonthYear(oScope._calPnlTarget.value);
		else
			oScope._calPnlTarget.value = text_formatDayMonthYear(oScope._calPnlTarget.value);
			
		if (oScope._formNameToSubmit != null)
			document.forms[oScope._formNameToSubmit].submit()
		oScope.hide();
		oScope = null;
	}
}
BennerCalendar.prototype.createTitleCalendar = function(date,type)
{
	var fn = this.setDate;
	var oScope = this;

	var divRight = CreateDiv(""); 
	setStyleFloat(divRight,"right");
	addTextNode(divRight, ">");
	
	var divLeft = CreateDiv(""); 
	setStyleFloat(divLeft,"left");
	addTextNode(divLeft,"<");
	
	var divText = CreateDiv(""); 
	divText.style.textAlign = "center";
	if (type == 1)
		addTextNode(divText, date.getUTCFullYear());
	else
	{
		var typeDate = Date.toDDMMYYYY(date);
		var funcType = function(oEvent){fn.call(EventUtil.getEvent(),oScope,typeDate,1);};
		var lnk = CreateHRef(null, null, "dtNavMonthLink2");
		EventUtil.addEventHandler(lnk, "click", funcType);
		addTextNode(lnk, Date.monthNames[date.getUTCMonth()] + " / " + date.getUTCFullYear());
		divText.appendChild(lnk);
	}

	var divTitle = CreateDiv("bx_hdr");
	divTitle.style.paddingRight = "8px";

	var dateAux;
	if (type == 1)
	{
		dateAux = new Date(date.getUTCFullYear(),6,15);
		dateAux = dateAux.addYears(1);
	}
	else
	{
		dateAux = new Date(date.getUTCFullYear(),date.getUTCMonth(),15);
		dateAux = dateAux.addMonths(1);
	}
	var nextDate = Date.toDDMMYYYY(dateAux);
	var funcNext = function(oEvent){fn.call(EventUtil.getEvent(),oScope,nextDate,type);};
	var href = CreateHRef(divRight, null, "dtNavLink");
	EventUtil.addEventHandler(href, "click", funcNext);
	divTitle.appendChild(href);
	
	if (type == 1)
	{
		dateAux = new Date(date.getUTCFullYear(),6,15);
		dateAux = dateAux.addYears(-1);
	}
	else
	{
		dateAux = new Date(date.getUTCFullYear(),date.getUTCMonth(),15);
		dateAux = dateAux.addMonths(-1);
	}
	var priorDate = Date.toDDMMYYYY(dateAux);
	var funcPrior = function(oEvent){fn.call(EventUtil.getEvent(),oScope,priorDate,type);};
	href = CreateHRef(divLeft, null, "dtNavLink");
	EventUtil.addEventHandler(href, "click", funcPrior);
	divTitle.appendChild(href);
	
	divTitle.appendChild(divText);
	return divTitle;
}
BennerCalendar.prototype.createBodyCalendar = function(date,type)
{
	var div = CreateDiv("");
	div.id = "bodyCalendar";

	var table = document.createElement("TABLE");
	table.setAttribute("border", "0");
	table.setAttribute("width", "177px");
	table.setAttribute("cellSpacing", "0");
	table.setAttribute("cellPadding", "0");
	if (type == 1)
		table.style.margin = "4px 2px 2px 2px";
	else
		table.style.margin = "2px";
	
	var tbody = document.createElement("TBODY");
	table.appendChild(tbody);
	
	if (type == 1)
		this.createYearBody(date,tbody);
	else
		this.createMonthBody(date,tbody);
	
	div.appendChild(table);
	return div;
}
BennerCalendar.prototype.createYearBody = function(date,tbody)
{
	var fn = this.dateConfirm;
	var oScope = this;
	var fnClick = function(oEvent){fn.call(EventUtil.getEvent(),EventUtil.getEvent(),oScope,1);}; 

	var month = 0;
	for(var i=0;i<4;i++)
	{
		tbody.insertRow(i);
		for(var k=0;k<3;k++)
		{
			tbody.rows[i].insertCell(k); 

			var href = CreateHRef(null,null,"dtDayLink");
			addTextNode(href, Date.monthNames[month].toString());
			if (this._calType == 1)
				href.setAttribute("dateValue",(month+1)+"/"+date.getUTCFullYear());
			else
				href.setAttribute("dateValue","01/"+(month+1)+"/"+date.getUTCFullYear());
			EventUtil.addEventHandler(href, "click", fnClick);
			tbody.rows[i].cells[k].appendChild(href);
			if (k < 2)
				tbody.rows[i].cells[k].className = "dtYearCalCell";
			else
				tbody.rows[i].cells[k].className = "dtYearCalCellRight";
			month++;
		}
	}

}
BennerCalendar.prototype.createMonthBody = function(date,tbody)
{
	tbody.insertRow(0);
	for(var i=0;i<7;i++)
	{
		tbody.rows[0].insertCell(i); 
		addTextNode(tbody.rows[0].cells[i], Date.weekShortDays[i].toString());
		tbody.rows[0].cells[i].className = "dtWeek2";
	}

	var cal = new CalendarMatrix();
	cal.prepare(date);
	
	var fn = this.dateConfirm;
	var oScope = this;
	var fnClick = function(oEvent){fn.call(EventUtil.getEvent(),EventUtil.getEvent(),oScope,0);};

	for (var y=0;y<cal._allRows.length;y++) 
	{
		tbody.insertRow(y+1);
		for(var k=0;k<cal._allRows[y].length;k++)
		{
			tbody.rows[y+1].insertCell(k); 
			
			var href = CreateHRef(null,null,"dtDayLink");
			addTextNode(href, cal._allRows[y][k].Day);
			href.setAttribute("dateValue",cal._allRows[y][k].Value);
			
			EventUtil.addEventHandler(href, "click", fnClick);

			tbody.rows[y+1].cells[k].appendChild(href);
			tbody.rows[y+1].cells[k].className = this.renderCalendarDay(cal._allRows[y][k]);
		}
	}
}
BennerCalendar.prototype.renderCalendarDay = function(day)
{
	if (day.Value == Date.toDDMMYYYY(new Date()))
		return "dtToday";
	else if (day.IsSelected)
		return "dtDaySel";
	else if ((day.IsWeekend) && (day.IsCurrentMonth))
		return "dtDayWeekend";
	else if ((day.IsWeekend) && (!day.IsCurrentMonth))
		return "dtDayOuterWeekend";
	else if (!day.IsCurrentMonth)
		return "dtDayOuter";
	else
		return "dtDay";
}

BennerCalendar.prototype.open = function(strDate)
{
	var oEvent = EventUtil.getEvent();
	this.initCalendar(this,strDate);
	this.show();
}
BennerCalendar.prototype.openInPos = function(strDate,x,y)
{
	var oEvent = EventUtil.getEvent();
	this.initCalendar(this,strDate);
	this.showInPos(x,y);
}
BennerCalendar.prototype.initCalendar = function(oScope,strDate)
{
	var strEditDate = strDate;
	if (oScope._calPnlTarget != null) 
		strEditDate = oScope._calPnlTarget.value;
	if (oScope._calType == 1)
		strEditDate = "01/" + strEditDate;
	if (oScope._calPnlTarget== null)
		alert('Erro inesperado: Campo não encontrado!');
	var date = null, arrDate = null;
	arrDate = strEditDate.split('/');
	date = new Date(arrDate[2], arrDate[1]-1, arrDate[0]); 
	if (!Date.isValidDate(arrDate[0],arrDate[1]-1,arrDate[2]))
	{
		arrDate = strDate.split('/');
		date = new Date(arrDate[2], arrDate[1]-1, arrDate[0]); 
		if (!Date.isValidDate(arrDate[0],arrDate[1]-1,arrDate[2]))
			date = new Date();
	}
	oScope.setDate(oScope,Date.toDDMMYYYY(date),oScope._calType);
}
BennerCalendar.prototype.setDate = function(oScope,strDate,type)
{
	oScope.checkCalendarPanel();

	var arrDate = strDate.split('/');
	var date = new Date(arrDate[2], arrDate[1]-1, arrDate[0]); 
	if (!Date.isValidDate(arrDate[0],arrDate[1]-1,arrDate[2]))
		date = new Date();

	var calendarPanel = document.getElementById("__calPnlIn");
	while(calendarPanel.childNodes.length > 0)
		calendarPanel.removeChild(calendarPanel.childNodes[0]);
	calendarPanel.appendChild(oScope.createTitleCalendar(date,type));
	calendarPanel.appendChild(oScope.createBodyCalendar(date,type));
}
BennerCalendar.prototype.calPnl_keyDown = function(oScope)
{	
	oScope.hide();
	oScope = null;
}
BennerCalendar.prototype.calPnl_mouseDown = function(oEvent,oScope)
{	
	var sender = oEvent.srcElement;
	if (sender == null)
		sender = oEvent.target;
	if (sender && oScope._calOpenned)
	{
		if (!oScope.clickInsideOfCalendar(sender))
		{
			oScope.hide();
			oScope = null;
		}
	}
}
BennerCalendar.prototype.clickInsideOfCalendar = function(sender)
{
	var cal = document.getElementById("__calPnlOut");
	if (cal != null)
		return searchNodeInside(cal, sender);
}
BennerCalendar.prototype.createRoundedPanel = function(parent)
{
	if (window.event)
	{
		var iframe = document.createElement("IFRAME");;
		iframe.style.width = "181px";
		iframe.id = "__calPnlOutFrame";
		iframe.style.position = "absolute";
		iframe.style.visibility = "hidden";
		iframe.style.height = "184px";
		iframe.style.zindex = "10";
		parent.appendChild(iframe);
	}

	var BRBbox = CreateDiv("B_RB_box");
	BRBbox.style.width = "181px";
	BRBbox.id = "__calPnlOut";
	BRBbox.style.position = "absolute";
	BRBbox.style.visibility = "hidden";
	BRBbox.style.width = "181px";

	var bx_ml = CreateDiv("bx_ml"); BRBbox.appendChild(bx_ml);
	var bx_mr = CreateDiv("bx_mr"); bx_ml.appendChild(bx_mr);
	var bx_mt = CreateDiv("bx_mt"); bx_mr.appendChild(bx_mt);
	var bx_mb = CreateDiv("bx_mb"); bx_mt.appendChild(bx_mb);
	var bx_bl = CreateDiv("bx_bl"); bx_mb.appendChild(bx_bl);
	var bx_br = CreateDiv("bx_br"); bx_bl.appendChild(bx_br);
	var bx_tl = CreateDiv("bx_tl"); bx_br.appendChild(bx_tl);
	var bx_tr = CreateDiv("bx_tr"); bx_tl.appendChild(bx_tr);
	bx_tr.style.width = "181px";
	bx_tr.id = "__calPnlIn";
	parent.appendChild(BRBbox);
	return bx_tr;
}
BennerCalendar.prototype.checkCalendarPanel = function()
{
	var cal = document.getElementById("__calPnlOut");
	if (cal == null)
		this.createRoundedPanel(document.body);
}
BennerCalendar.prototype.show = function(tag)
{
	this.showInPos(findPosX(this._calPnlTarget), findPosY(this._calPnlTarget) + this._calPnlTarget.offsetHeight + 2);
}
BennerCalendar.prototype.showInPos = function(x,y)
{
	var div = document.getElementById("__calPnlOut");
	div.style.visibility = "visible";
	div.style.left = x + "px";
	div.style.top = y + "px";

	if (window.event)
	{
		var divFrame = document.getElementById("__calPnlOutFrame");
		divFrame.style.visibility = "visible";
		divFrame.style.left = x + "px";
		divFrame.style.top = y + "px";
	}

	this._calOpenned = true;
	var fnKDown = this.calPnl_keyDown;
	var fnMDown = this.calPnl_mouseDown;
	var oScope = this;
	var keyDown = function(oEvent){fnKDown.call(oEvent,oScope);};
	var mouseDown = function(oEvent){fnMDown.call(oEvent,oEvent,oScope);};
	EventUtil.addEventHandler(document, "keydown", keyDown);
	EventUtil.addEventHandler(document, "mousedown", mouseDown);
	
	if (this._calPnlTarget != null && this._calPnlTarget.type != "hidden")
		this._calPnlTarget.focus();
}
BennerCalendar.prototype.hide = function()
{
	var div = document.getElementById("__calPnlOut");
	div.style.visibility = "hidden";

	if (window.event)
		document.getElementById("__calPnlOutFrame").style.visibility = "hidden";

	if (this._calPnlTarget != null && this._calPnlTarget.type != "hidden")
		this._calPnlTarget.focus();

	this._calPnlTarget = null;
	this._calOpenned = false;
}

function CalendarMatrixItem(weekend)
{
	this.IsWeekend = weekend;
	this.Day = 0;
	this.Value = 0;
	this.IsCurrentMonth = false;
	this.IsSelected = false;
}
function CalendarMatrix()
{
	var _allRows = new Array();
}
CalendarMatrix.prototype.prepare = function(date)
{
	this.prepareMatrix();
	this.prepareLastMonth(date);
	this.prepareDays(date);
}
CalendarMatrix.prototype.prepareMatrix = function()
{
	this._allRows = null;
	this._allRows = new Array();
	var row;
	for(var i=0;i<6;i++)
	{
		row = new Array();
		for(var x=0;x<7;x++)
		{
			var day = new CalendarMatrixItem((x==0)||(x==6));
			row.push(day);
		}
		this._allRows.push(row);
	}
}
CalendarMatrix.prototype.prepareLastMonth = function(date)
{
	var currMonth = date.getUTCMonth()+1;
	date = date.addDays((date.getUTCDate()-1)*-1);
	var backDays = date.getUTCDay();
	backDays = (backDays * -1);
	date = date.addDays(backDays);
	var col = 0;
	var item;
	while (((date.getUTCMonth()+1) < currMonth) || ((currMonth == 1) && ((date.getUTCMonth()+1) != 1)))
	{
		item = this._allRows[0][col];
		item.Day = date.getUTCDate();
		item.Value = Date.toDDMMYYYY(date);
		item.IsCurrentMonth = false;
		date = date.addDays(1)
		col++;
	}
}
CalendarMatrix.prototype.prepareDays = function(date)
{
	var currMonth = date.getUTCMonth()+1;
	date = date.addDays((date.getUTCDate() -1) * -1);
	
	var x = 0; 
	var y = 0;
	var weekDay = 0;

	var day;
	while (y < this._allRows.length) 
	{
		x = 0;
		while (x < this._allRows[y].length) 
		{
			weekDay = date.getUTCDay();
			if (weekDay == x)
			{
				day = this._allRows[y][x];
				day.Day = date.getUTCDate();
				day.Value = Date.toDDMMYYYY(date);
				day.IsCurrentMonth = (date.getUTCMonth()+1 == currMonth);
				date = date.addDays(1);
			}
			x++;
		}
		y++;
	}
}
CalendarMatrix.prototype.select = function(date)
{
	for (var y=0;y<this._allRows.length;y++) 
	{
		for (var x=0;x<this._allRows[y].length;x++) 
		{
			this._allRows[y][x].IsSelected = (this._allRows[y][x].Value == date);
		}
	}
}