var dow = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday' ];
var months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];
var mon;
var mainCalendarData;
var d = new Date();
var month = ( (d.getMonth() + 1) > 12) ? ( (d.getMonth() + 1) - 12) : (d.getMonth() + 1) ;
var year = d.getFullYear();

Event.observe(window, 'load', function() {
//	setMonthHeader();
//	loadCalendar([month, year], 'calendarList', true);
//	loadCalendar(getNextMonth(month), 'nextMonth', true);
// 	loadCalendar(getTwoMonths(month), 'twoMonths', false);
});

function timeOutCall(monthNumber){
	if ($('calendarList').descendants().size() < 1 ||
		$('nextMonth').descendants().size ()  < 1   ||
		$('twoMonths').descendants().size()  < 1 ){
			showError(monthNumber);
		}
}

function showError(monthNumber){
	Effect.Fade('loading', { duration: 0.1}); 
		if (monthNumber == month){  
			Effect.Appear ('error', { duration: 0.3} ); 
		} 
}

function loadCalendar(dateData, rootDiv, fullDisplay){
	
	if (dateData){
		var monthNumber = dateData[0];
		var yearNumber = dateData[1];
	}
	var url = "../cgi-bin/ical-app.cgi";

	if (monthNumber != null && yearNumber != null) {
		url += "?month=" + monthNumber + "&year=" + yearNumber;
	}
	
	var timer = setTimeout("timeOutCall(" + monthNumber + ")", 10000);
	
	new Ajax.Request (url,
					  { method: 'get',
						onLoading: function() {
						new Effect.Appear('loading', {
							duration: 1.2
						});  new Effect.Pulsate ('loadingText', {duration: 3} ); 
						},
						onSuccess: function(transport){
							Effect.Fade ('loading', { duration: 0.2 } );  
							response = transport.responseText;
							createCalendarHTML(response, rootDiv, fullDisplay, monthNumber, yearNumber);
						},
						onComplete: function() { if (monthNumber == month) { new Effect.Appear('nextMonthHeader', {duration:'8.0'}); } },
						onFailure: function() {
								Effect.Fade('loading', { duration: 0.1}); if (monthNumber == month){  Effect.Appear ('error', { duration: 0.3} ); } }
					  }
					 );
}


function createCalendarHTML(response, rootDiv, fullDisplay, monthNumber, yearNumber){

	if (rootDiv == null){
		rootDiv = 'calendarList';
	}

	try {
		var json = $H(response.evalJSON());
		if ( (monthNumber == month) && (yearNumber == year) ){
		 mainCalendarData = json;
		}
 	}

	catch (err) {

	}

	if (fullDisplay != true){
		appendMonthHeader(rootDiv,monthNumber, yearNumber);
	}	

	var myTemplate = new Template ('<span class="italics">#{time}#{ampm}</span> <a href="#{url}">#{band}</a> <small>#{location} #{desc}</small>');
	var dates = json.keys().sort(sortnum);

	
	dates.each(function(date){
		displayDate(json, date, rootDiv , myTemplate, fullDisplay, monthNumber, yearNumber);
	}	
			  );
	
	new Effect.Appear('calendarBlock', { duration:0.5 } );
}

function displayDate(json, date, baseElement, template, fullDisplay, monthNumber, yearNumber){
	var allAgesString = " [all ages!]";
	bandArr = $A(json[date]);	
	if (bandArr.size() == 0){
		return;
	}

	if (fullDisplay == true){
		noURLTemplate =  new Template ('<span class="italics">#{time}#{ampm}</span> #{band} <small>#{location} #{desc}</small>');
		var givenDate = new Date();
    givenDate.setFullYear(yearNumber,(monthNumber -1),date);
		dateToShow = dow[givenDate.getDay()] + ', ' + months[monthNumber -1] + ' ' +  date;
		dateText = document.createTextNode(dateToShow);
		dateDiv = document.createElement('div');
		dateDivId = months[monthNumber -1] + '_' + date;
		dateDiv.id = dateDivId;
		newDateHeader = document.createElement('h3');
		newDateHeader.appendChild(dateText);
		dateDiv.appendChild(newDateHeader);
		listUL = document.createElement('ul');		
	
		bandArr.each(function(band){
			listEl = document.createElement('li');
			
			
			if (band.desc == null){
				band.desc = "";
			}


			//TODO: refactor--call on each element

			else { 
				band.desc = band.desc.gsub (/\\/, "");
			}


			if (band.location != ""){
				band.location = "(" + band.location.gsub (/\\/, "") + ")";
			}	

			band.ampm =  (band.time == '12') ? 'am' : 'pm'; 
			
			if (band.url != ''){
				showText = template.evaluate(band);
			}

			else {
				showText = noURLTemplate.evaluate(band);
			}

			listEl.innerHTML = showText;
			listUL.appendChild(listEl);
			}
		);
	
		dateDiv.appendChild(listUL);
		$(baseElement).appendChild(dateDiv);		
		if (givenDate.getDay() == 0 ){
			$(dateDiv).down().addClassName('inline');
			new Insertion.After($(dateDiv).down(), '<h4 class="inline">  [All Ages!]</h4>');
		}

	}

	else {
		dateInfo = monthNumber + "/" + date +  " ";
		dateDiv = document.createElement('div');
		listingInfo = '';
		bandDisplayArr = $A();		
		bandArr.each(function(band){
				bandDisplayArr.push(band['band']);						
			} );
		
		listingInfo += bandDisplayArr.join(",");

		dateText = document.createTextNode(dateInfo);
		dateSpan = document.createElement('span');
		dateSpan.appendChild(dateText);
		dateSpan.style['fontWeight'] = "bold";
		listingText = document.createTextNode(listingInfo);
		dateDiv.appendChild(dateSpan);
		dateDiv.appendChild(listingText);
		$(baseElement).appendChild(dateDiv);
	}
}

function appendMonthHeader(rootDiv, monthNumber, yearNumber){
	dateText = months[monthNumber - 1 ] + " " + yearNumber;
	dateNode = document.createTextNode(dateText);
	newDateHeader = document.createElement('h4');
	newDateHeader.appendChild(dateNode);
	$(rootDiv).appendChild(newDateHeader);
}

function sortnum (a,b){
	return a - b;
}

function setMonthHeader(){
	d = new Date();
	monNum = d.getMonth();
	mon = months[monNum];
	$('currCalDate').update(mon);
}


function getNextMonth(updatedNextMonth){
	
	if (updatedNextMonth + 1 > 12){
		return $A( [ ( (updatedNextMonth + 1) - 12), (year + 1) ] );
	}
	
	return $A( [(updatedNextMonth + 1), year ] );
		
}

function getTwoMonths(updatedTwoMonths){

	if (updatedTwoMonths + 2 > 12){
		return $A( [( (updatedTwoMonths + 2) - 12 ), (year + 1)]);
	}

	return $A( [ (updatedTwoMonths + 2), year ]);

}

