// JavaScript Document
function jsCalendar(){
	try{
		this.name = 'jsCalendar1';
		this.parent = null;
		this.width = null;
		this.today = null;
		this.initial_date = '01/01/1900';	
		this.doc_enginer = null;
		this.display_events = null;
		
		//Retorna o nome do mes
		function MonthName(month,abbreviate){
			var monthName = new Array(12);
			monthName[0] = 'Janeiro';
			monthName[1] = 'Fevereiro';
			monthName[2] = 'Março';
			monthName[3] = 'Abril';
			monthName[4] = 'Maio';
			monthName[5] = 'Junho';
			monthName[6] = 'Julho';
			monthName[7] = 'Agosto';
			monthName[8] = 'Setembro';
			monthName[9] = 'Outubro';
			monthName[10] = 'Novembro';
			monthName[11] = 'Dezembro';		
			if(abbreviate==true){
				return monthName[month].substr(0,3);
			}else{
				return(monthName[month]);
			}		
		}
		
		//Retorna o numero parte da data (dia, mes, ano e dia da semana)
		function DatePart(strDate, strPart){
			var $Date = new Date(strDate);
			switch(strPart){
				case 'd': return $Date.getDate(); break;
				case 'm': return $Date.getMonth(); break;
				case 'y': return $Date.getFullYear(); break;
				case 'w': return $Date.getDay();break;
				default : return $Date.toLocaleDateString(); break;
			}
		}
	
		//Retorna o nome do dia da semana (Completo ou abriviado)
		function WeekdayName(strWeekday, abbreviate){
			var d=new Date();
			var weekday=new Array(7);
			weekday[0]="Domingo";
			weekday[1]="Segunda-feira";
			weekday[2]="Terça-feira";
			weekday[3]="Quarta-feira";
			weekday[4]="Quinta-feira";
			weekday[5]="Sexta-feira";
			weekday[6]="Sabado";
			if (abbreviate==true){
				return weekday[strWeekday].substr(0,3);
			}else{
				return weekday[strWeekday];
			}
		}
		
		//Retorna a diferença de um intervalo entra datas
		function DateDiff(date1, date2, interval){
			var Date1 = new Date(date1);
			var Date2 = new Date(date2);
			var t1 = Date1.getTime();
			var t2 = Date2.getTime();
			var t1Y = Date1.getFullYear();
			var t2Y = Date2.getFullYear();
			var t1M = Date1.getMonth();
			var t2M = Date2.getMonth();
			switch(interval){
				case 'd' : return parseInt((t2-t1)/(24*3600*1000)); break;
				case 'w' : return parseInt((t2-t1)/(24*3600*1000*7));break
				case 'm' : return (t2M+12*t2Y)-(t1M+12*t1Y); break;
				case 'y' :return Date2.getFullYear()-Date1.getFullYear(); break;
			}		
		}
		
		function totalDaysInMonth(m,y){
			var m1, m2, y1, y2
			if (m>=12){
				m1=12
				y1=y;
				m2=1
				y2=parseInt(y)+1;
			}else{
				m1=m
				y1=y;
				m2= parseInt(m)+1;
				y2=y;
			}
			return DateDiff(m1+"/01/"+y1, m2+"/01/"+y2, 'd');
		}
		
		function loadDescptionEvent(fx){
			call(fx);
		}
		
		function getPos(elemID){
			var offsetTrail = document.getElementById(elemID);
			var offsetLeft = 0;
			var offsetTop = 0;
			while (offsetTrail) {
					offsetLeft += offsetTrail.offsetLeft;
					offsetTop += offsetTrail.offsetTop;
					offsetTrail = offsetTrail.offsetParent;
			}
			if (navigator.userAgent.indexOf("Mac") != -1 && 
					typeof document.body.leftMargin != "undefined") {
					offsetLeft += document.body.leftMargin;
					offsetTop += document.body.topMargin;
			}
			return {left:offsetLeft, top:offsetTop};
		}	
		
		//altera data do calendario
		function setdate(navID, calendID, new_date, doc_eng, dsp_events){		
			//Obter o mes e ano para setar a data
			var $date = new Date();
			var $d = $date.getDate();
			var $m = DatePart(new_date, 'm');
			var $y = DatePart(new_date, 'y');		
			
			//carrega as datas do mes e ano corrente que tem eventos
			var oAjax = new Ajax.instance();		
			oAjax.onreadystatechange = function(){			
				if(oAjax.readyState == 4)	{ 
					event_day	= eval(oAjax.responseText);
				}
			}
			with (oAjax){
				open("GET", unescape(doc_eng + '?return=date&m=' + (parseInt($m)+1) + '&y=' + $y), false);
				send(null);
			}		
			
			//escreve o nome do mes no titulo do caliendario
			var navCalendar = document.getElementById(navID);
			var dspMonthYear = navCalendar.getElementsByTagName('td')[1];
			dspMonthYear.innerHTML = MonthName($m) + ' de ' + $y;		
			
			//tabela calendario
			var tblCalendar = document.getElementById(calendID);
			
			//prideiro dia da semana da data indicada
			var firstWeekday = DatePart($m+1 + '/1/' + $y, 'w');
			var totDay = totalDaysInMonth($m+1, $y);
			
			var curDay = 1; //contador de dias do mes
			var evDay = this.event_day; //dias que contem eventos;
			var css = ''; // estilo		
			
			//redefine valores das celulas da tabela calendario
			var cellDay = tblCalendar.getElementsByTagName('td');
			for (i=0;i<cellDay.length;i++){
				if (i>=firstWeekday && i<parseInt(totDay+firstWeekday)){
					cellDay[i].innerHTML = curDay;				
					cellDay[i].onclick = function(){								
						if (dsp_events)	Ajax.load(doc_eng + '?date=' + this.innerHTML + '/' + (parseInt($m)+1) + '/' + $y, document.getElementById(dsp_events));
					}
					//diferencia as celulas
					if (event_day){
						for (j=0;j<=event_day.length;j++){
							var isEv = DatePart(event_day[j], 'd');
							if(isEv==curDay){
								css = "jsCalendEventDay";
								break;
							}else{
								//descada o dia atual
								css = (curDay==$d) ? "jsCalendToday" : "";							
							}
						}			
					}else{
						//destaca o dia atual
						css = (curDay==$d) ? "jsCalendToday" : "";
					}	
					curDay ++;
				}else{
					css = 'jsCalendNoDay';
					cellDay[i].innerHTML = '';
				}
				cellDay[i].className = css;			
			}	
			//carrega e
			if (dsp_events)	Ajax.load(doc_eng + '?date=' + $d + '/' + (parseInt($m)+1) + '/' + $y, document.getElementById(dsp_events));
			return false;
		}
	
		//cria o elemento encapsulador do objeto calendário
		this.conteiner_calendar=function(){
			var boxCalendar = document.createElement('div');
			with(boxCalendar){
				setAttribute('id', this.name + '_box');
				setAttribute('class', 'jsCalendBox');
				className = 'jsCalendBox';
			}
			return {id:boxCalendar.id, self:boxCalendar}
		}
		
		//monta a tabela onde o calendário sera exibido
		this.table_calendar=function(){
			var $W = this.width; //largura do calendário
			var tblCalendar = document.createElement('table');
			with(tblCalendar){
				setAttribute('id', this.name);
				setAttribute('class', 'jsCalendTable');
				className = 'jsCalendTable';
				style['width'] = $W;			
			}
			
			//insere linhas
			var tblCalendarTR = tblCalendar.insertRow(-1);				
			//monta as celulas do calendário		
			for(i=0;i<35;i++){
				if(i%7==0 && i>0) var tblCalendarTR = tblCalendar.insertRow(-1); //nova linha na tabela;
				//celulas adjacentes
				var tblCalendarTD = tblCalendarTR.insertCell(-1);				
			}
			return {id:tblCalendar.id, self:tblCalendar}
		}
		
		//navegador do calendário
		this.nav_calendar=function(calendID){		
			var navName = this.name + '_nav';
			var today = this.today;
			var $d = DatePart(today, 'd');
			var $m = DatePart(today, 'm');
			var $y = DatePart(today, 'y');		
			var $doc_eng = this.doc_enginer;
			var $dsp_event = this.display_events;
			
			//table
			var $nav = document.createElement('table');				
					$nav.setAttribute('id', navName);
					$nav.className = 'jsCalendarNav';
					$nav.style['width'] = this.width;
			
			//linha
			var $navTr = $nav.insertRow(-1);
					$nav.className = 'jsCalendarNavRow';
					
			//celulas de mes anterior
			var $navTdPrev = $navTr.insertCell(0);
					$navTdPrev.setAttribute('id', this.name + 'navPrev');
					$navTdPrev.style['width'] = '14%';
					$navTdPrev.innerHTML = '&lt;';
					$navTdPrev.onclick = function(){ 
						//define o mes de exibicao					
						if($m-1<1){	$m=12; $y--; }else{	$m--; }
						setdate(navName, calendID, $m + '/1/' + $y, $doc_eng, $dsp_event);					
					};
					
			//celular exibir mes
			var $navTdMonth = $navTr.insertCell(1);
					$navTdMonth.setAttribute('id', this.name + 'navMonth');
					$navTdMonth.colSpan=5;
					
			//celula próoximo mes
			var $navTdNext = $navTr.insertCell(2);
					$navTdNext.setAttribute('id', this.name + 'navNext');
					$navTdNext.style['width'] = '14%';
					$navTdNext.innerHTML = '&gt;';
					$navTdNext.onclick = function(){ 
						//define o mes de exibicao					
						if($m+1>12){ $m=1; $y++; }else{ $m++; }
						setdate(navName, calendID, $m + '/1/' + $y, $doc_eng, $dsp_event);					
					};
			
			//insere linhas
			var $navTr = $nav.insertRow(-1);	
					$navTr.className = 'jsCalendWeekdayRow';
			//monta as celulas do calendário		
			for(i=0;i<7;i++){
				//celulas adjacentes
				var $navTD = $navTr.insertCell(-1);
				$navTD.innerHTML = WeekdayName(i, true);
			}			
			return {id:$nav.id, self:$nav}
		}
		
		//cria o calendario
		this.create=function(){
			var parentId = this.conteiner_calendar();
			var navCalendar = this.nav_calendar(this.name);
			var tableCalendar = this.table_calendar();		
			document.getElementById(this.parent).appendChild(parentId.self);
			document.getElementById(parentId.id).appendChild(navCalendar.self);
			document.getElementById(parentId.id).appendChild(tableCalendar.self);
			setdate(navCalendar.id, tableCalendar.id, this.today, this.doc_enginer, this.display_events);
		}	
	}catch(err){
		alert(err);
	}
}
