
function $(id) {
	return document.getElementById(id);
}

/* As próximas funções exigem que as seguintes variáveis já estejam definidas (no header do html):
   firstDate, lastDate, lastHour
   yesterday
   selectedDate, selectedTab
   holidays[]
*/

var firstDay   = getDayFromDate(firstDate);
var firstMonth = getMonthFromDate(firstDate);
var firstYear  = getYearFromDate(firstDate);

var lastDay   = getDayFromDate(lastDate);
var lastMonth = getMonthFromDate(lastDate);
var lastYear  = getYearFromDate(lastDate);

var selectedDay   = getDayFromDate(selectedDate);
var selectedMonth = getMonthFromDate(selectedDate);
var selectedYear  = getYearFromDate(selectedDate);

var archive=(location.href.indexOf('datas')!=-1)?true:false;

/* funções iniciais e definições de variáveis */
if (isDayOff(selectedDate)) {
	var dayHours=[12,23];
} else {
	var dayHours=[10,17,23];
}

function makeAll() {
	/* agrupamento de funções para preencher uma página de visualização de arquivo */
	makeHeader();
	makeHome();
	makeLastCalendars(selectedDate);
}

function makeHeader() {
	/* cria a navegação superior do arquivo (data e horários) */
	content  = '';
	content += '<div id="box_header">';
	content += '<div id="box_header">';
	content += '<div id="h_data">'+getLongDate(selectedDay,selectedMonth,selectedYear)+'</div>';
	content += '<div id="h_tabs">';
	content += '<div id="tab1" class="t_unselected"><a href="javascript:loadTab(1);">'+dayHours[0]+'h</a></div>';
	lastTab=1;
	if (isDayOff(selectedDate)) {
		/* feriado ou fim-de-semana */
		if (selectedDate == lastDate) {
			/* é feriado, e o dia visitado é o último dia de publicação */
			if (lastHour == 23) {
				content += '<div id="tab2" class="t_unselected"><a href="javascript:loadTab(2);">'+dayHours[1]+'h</a></div>';
				lastTab=2;
			} else {
				lastTab=1;
			}
		} else {
			/* é feriado, mas não é o último dia de publicação */
			content += '<div id="tab2" class="t_unselected"><a href="javascript:loadTab(2);">'+dayHours[1]+'h</a></div>';
			lastTab=2;
		}
	} else {
		/* dia útil */
		if (selectedDate == lastDate) {
			/* dia útil, e o dia visitado é o último dia de publicação */
			if (lastHour == 17) {
				content += '<div id="tab2" class="t_unselected"><a href="javascript:loadTab(2);">'+dayHours[1]+'h</a></div>';
				lastTab=2;
			} else if (lastHour == 23) {
				content += '<div id="tab2" class="t_unselected"><a href="javascript:loadTab(2);">'+dayHours[1]+'h</a></div>';
				content += '<div id="tab3" class="t_unselected"><a href="javascript:loadTab(3);">'+dayHours[2]+'h</a></div>';
				lastTab=3;
			}
		} else {
			/* dia útil, mas não é o último dia de publicação */
			content += '<div id="tab2" class="t_unselected"><a href="javascript:loadTab(2);">'+dayHours[1]+'h</a></div>';
			content += '<div id="tab3" class="t_unselected"><a href="javascript:loadTab(3);">'+dayHours[2]+'h</a></div>';
			lastTab=3;
		}
	}
	content += '</div>';
	content += '<div id="h_line"></div>';
	content += '</div>';
	$('area_header').innerHTML = content;
	selectedHour = (selectedTab==0||selectedTab>lastTab)?lastTab:selectedTab;
	setSelected(selectedHour);
}

function makeHome() {
	/* cria um elemento iframe para receber a home, e preenche com o dia selecionado */
	pageName = selectedDate+'home_'+dayHours[selectedHour-1]+'.jhtm';
	$('area_iframe').innerHTML = '<iframe id="homeuol" name="homeuol" src="'+pageName+'" frameborder="0" scrolling="no" onLoad="fixHeight();"></iframe>';
}

function makeLastCalendars(cDate) {
	/* cria os calendários da lateral utilizando makeCalendar() */
	calsContent = '';
	cal = new Calendar(getMonthFromDate(cDate), getYearFromDate(cDate));
	calsContent += cal.getContent();
	previousCDate = getPrevious(cDate,1);
	if ( haveCalendar(previousCDate) ) {
		oneCal = new Calendar(getMonthFromDate(previousCDate), getYearFromDate(previousCDate));
		calsContent += oneCal.getContent();
	}
	$('area_calendar').innerHTML = calsContent;
}

function makeYearCalendar() {
	/* cria o calendário anual utilizando makeCalendar() */
  	content = '';
	cnt = 0;
	for (currentYear=lastYear; currentYear>=firstYear; currentYear--) {
		if (currentYear == lastYear) {
			if (currentYear == firstYear)
				initialMonth = firstMonth;
			else
				initialMonth = 1;
			finalMonth = lastMonth;
		} else if (currentYear == firstYear) {
			initialMonth = firstMonth;
			if (currentYear == lastYear)
				finalMonth = lastMonth;
			else
				finalMonth = 12;
		} else {
			initialMonth = 1;
			finalMonth = 12;
		}
		for(m=finalMonth; m>=initialMonth; m--) {
			cnt++;
			cal = new Calendar(m, currentYear);
			content += cal.getContent();
			if (cnt%3==0)
				content += '<div style="clear:both;"></div>';
			else
				content += '<div class="cspacer"></div>';
		}
	}
	$('year_calendars').innerHTML = content;
}

function loadTab(num) {
	pageName = selectedDate+'home_'+dayHours[num-1]+'.jhtm';
	$('homeuol').src = pageName;
	setSelected(num);
}

function setSelected(num) {
	$('tab1').className = 't_unselected';
	lst=1;
	if ($('tab2')) {
		$('tab2').className = 't_unselected';
		lst=2;
	}
	if ($('tab3')) {
		$('tab3').className = 't_unselected';
		lst=3;
	}
	if (num == 0) num = lst;
	$('tab'+num).className = 't_selected';
}

function fixHeight() {
	$('homeuol').style.height = homeuol.document.body.scrollHeight+15;
}

/* funções de apoio para manipulação de datas e strings */
var monthNames = ["[null]", "janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"];

var weekDaysNames = ["Domingo", "Segunda-feira", "Terça-feira", "Quarta-feira", "Quinta-feira", "Sexta-feira", "Sábado"];

function getLongDate(day,month,year) {
	/* recebe o dia, mês e ano e retorna a data por extenso */
	return ( weekDaysNames[getWeekDayNumber(day,month,year)-1] + ", " + day + " de " + monthNames[month] + " de "+year );
}

function haveCalendar(cDate) {
	iDate = firstYear+pad(firstMonth);
	fDate = lastYear+pad(lastMonth);
	cDateNoDay = cDate.substring(0,6);
	if ( cDateNoDay >= iDate  &&  cDateNoDay <= fDate )
		return (true);
	return (false);
}

function isDayOff(somedate) {
	/* recebe uma data no formato yyyymmdd e retorna true para feriados ou finais de semana */
	if (inArray(somedate, holidays) || isWeekend(somedate)) return true;
	return false;
}

function inArray(needle,haystack) {
	for (hi in haystack)
		if (haystack[hi] == needle) return true;
	return false;
}

function isWeekend(somedate) {
	_y = getYearFromDate(somedate);
	_m = getMonthFromDate(somedate);
	_d = getDayFromDate(somedate);
	_w = getWeekDayNumber(_d,_m,_y);
	if (_w==1 || _w==7) return true;
	return false;
}

function pad(i) {
      return i=(i<10)?"0"+i:i;
}

/* objeto Calendar */
function Calendar(month,year) {
	//alert(month+","+year);
	this.month = month;
	this.year = year;
	this.dinitial = getInitialDay(month,year); // dia inicial que existe arquivo no mês
	this.dinitialw = getWeekDayNumber(1,month,year); // dia da semana que o mês inicia (1=domingo,...)
	this.dfinal = getLastDay(month,year); // ultima dia de arquivo do mês
	this.dnum = monthDays(month,year); // dias totais no mês
	this.getContent = getCalendar;
}

function getCalendar() {
	/* retorna a string de código do calendário ao objeto */
	content='';
	content += '<div class="cal">';
	content += '<div class="cal_month">'+monthNames[this.month]+'/'+this.year+'</div>';
	total_pos = this.dnum+(this.dinitialw-1);
	total_lines = Math.ceil(total_pos/7);
	day=0;
	for(y=1; y<=total_lines; y++) {
		for(x=1; x<=7; x++) {
			if ( (y==1 && x<this.dinitialw) || (y==total_lines && x>total_pos-((y-1)*7)) ) {  // posição não tem dia
				content += '<div class="cal_days_none"></div>';
			} else {  // posição será preenchida
				day++;
				if ( (day<this.dinitial) || (day>this.dfinal) ) {  // dia existe, mas não existe arquivo
					content += '<div class="cal_days_off">'+pad(day)+'</div>';
				} else  { // dia existe, arquivo existe
					dlink = this.year.toString()+pad(this.month)+pad(day);
					if (dlink == selectedDate)
						content += '<div class="cal_days_today"><a href="/ultnot/arquivohome/index.jhtm?d='+this.year+pad(this.month)+pad(day)+'">'+pad(day)+'</a></div>';
					else
						content += '<div class="cal_days"><a href="/ultnot/arquivohome/index.jhtm?d='+this.year+pad(this.month)+pad(day)+'">'+pad(day)+'</a></div>';
				}
			}
		}
		
	}
	content += '</div>';
	if (!archive)
		content += '<div style="clear:both;"></div>';
	return(content);
	
}

function getInitialDay (month,year) {
	/* recebe  um mês e ano, e retorna o primeiro dia que tem arquivo da home */
	if (year < firstYear || year > lastYear)
		return (32);
	if (year > firstYear && year < lastYear)
		return (1);
	if (year == firstYear)
		if (month > firstMonth)
			return(1);
		else if (month == firstMonth)
			return(firstDay);
		else 
			return(32);
	if (year == lastYear)
		if (month > lastMonth)
			return(32);
		else 
			return(1);
}

function getLastDay (month,year) {
	/* recebe  um mês e ano, e retorna o último dia que tem arquivo da home */
	if (year < firstYear || year > lastYear)
		return (0);
	if (year > firstYear && year < lastYear)
		return (monthDays(month,year));
	if (year == lastYear)
		if (month > lastMonth)
			return(0);
		else if (month == lastMonth)
			return(lastDay);
		else 
			return(monthDays(month,year));
	if (year == firstYear)
		if (month < firstMonth)
			return(0);
		else 
			return(monthDays(month,year));

}

function getWeekDayNumber(day,month,year) {
	/* recebe o dia, mês e ano e retorna o número equivalente ao dia da semana */
	_a = Math.floor((14 - month)/12);
	_y = year - _a;
	_m = month + 12*_a - 2;
	_d = (day + _y + Math.floor(_y/4) - Math.floor(_y/100) + Math.floor(_y/400) + Math.floor((31*_m)/12)) % 7;
	return (_d+1);
}

function getYearFromDate(cDate) {
	/* retorna o ano a partir da data no formato yyyymmdd */
	return (parseInt(cDate.toString().substring(0,4),10));
}

function getMonthFromDate(cDate) {
	/* retorna o mês a partir da data no formato yyyymmdd */
	return (parseInt(cDate.toString().substring(4,6),10));
}

function getDayFromDate(cDate) {
	/* retorna o dia a partir da data no formato yyyymmdd */
	return (parseInt(cDate.toString().substring(6,8),10));
}

function monthDays(month,year) {
	/* recebe o mês e o ano, a retorna a quantidades de dias no mês */
	if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
		return 31;
	else if (month != 2)
		return 30;
	else if (((year % 4) == 0 && (year % 100)!=0) || (year % 400)==0)
		return 29;
	else
		return 28;
}

function getPrevious(cDate,n) {
	year = getYearFromDate(cDate);
	month = getMonthFromDate(cDate);
	day = getDayFromDate(cDate);
	m = month-n;
	if ( m<1 ) {
		m = m+12;
		year = year-1;
	} else if ( m>12 ) {
		m = m-12;
		year = year+1;
	}
	return(year.toString()+pad(m)+pad(day));
}
