jq(function() {
    jq.ajax({ 
    	type: 'GET',
    	url: xmlUrl, 
    	async: true,
    	success: function(data) {
    		xmlData = data;
    		repHelper = new balletHelper({repPerfData: jq.xmlToJSON(xmlData)});
    		repHelper.showData();
    		displayRepertories("#by-ballet");
    		displayCalendars("#by-calendar");
    	}
    });
    
    jq('#view-ballets-button').click(function() {
    	hideAll();
    	jq('#by-ballet').fadeIn();
    	showBalletNavigationState();
    	return false;
    });
    
    jq('#view-calendar-button').click(function() {
    	hideAll();
    	jq('#by-calendar').fadeIn();
    	showCalendarNavigationState();
    	return false;
    });
    
    jq('.buy-tickets-button-disabled').live('click', function() { return false; });
});

var MONTH = new Array(12);
MONTH[0] = "January";
MONTH[1] = "February";
MONTH[2] = "March";
MONTH[3] = "April";
MONTH[4] = "May";
MONTH[5] = "June";
MONTH[6] = "July";
MONTH[7] = "August";
MONTH[8] = "September";
MONTH[9] = "October";
MONTH[10] = "November";
MONTH[11] = "December";


function sortReps(reps) {
	var sortedAry = new Array(reps.length);
	var i = 0;
	
	reps.each(function() { 
		sortedAry[i++] = jq(this).find("title").text().replace(/\([\w\s]+\)/, "");
	});
	
	sortedAry = sortedAry.sort();
	
	i = 0;
	for(i =0; i < sortedAry.length; i++) {
		var rep = jq("season repertories repertory:has(title:contains('" + sortedAry[i] +"'))", xmlData);
		sortedAry[i] = rep;
	}
	
	return sortedAry.sort();
}

function displayRepertories(divId) {
	var reps = jq("season repertories repertory", xmlData);
	//reps = sortReps(reps)
	jq.each(reps, function(){
		
		var repDiv = jq(document.createElement('div'));
		var contentDiv = jq(document.createElement('div'));
		var image = jq(document.createElement("img"));
		var aImage = jq(document.createElement("a"));
		
		var title = jq(this).find("title").text();
		var description = jq(this).find("description").text();
		var choreography = jq(this).find("choreography").text();
		var music = jq(this).find("music").text();
		var repId = jq(this).attr("id");
		
		repDiv.attr("id", "rep_" + repId);
		repDiv.addClass("ballet");
		//repDiv.addClass("hidden");
		
		image.attr("src", repImagePath + jq(this).attr("image"));
		aImage.attr("href", "#");
		aImage.click(function() {
			displayRepertoryDetails(repId);
			return false;
		});
		aImage.append(image);
		
		if(description.length > 150) {
			description = description.substring(0, 150);
			description = description.substring(0, description.lastIndexOf(" ")) + "...";
		}
		
		contentDiv.addClass("content");
		
		var aTitle = jq(document.createElement("a"));
		aTitle.attr("href", "#");
		aTitle.click(function() {
			displayRepertoryDetails(repId);
			return false;
		});
		aTitle.text(title);
		
		contentDiv.append(aTitle);
		contentDiv.append("<p> <strong>Choreography</strong></p>" + choreography);
		contentDiv.append("<p> <strong>Music</strong></p>" + music);
		
		var descriptionDiv = getDiv().addClass("content").addClass("desc");
		descriptionDiv.append(description);
		
		var learnMore = jq('<a href="#">Learn More...</a>');
		learnMore.click(function() {
			displayRepertoryDetails(repId);
			return false;
		});
		
		descriptionDiv.append(jq('<p></p>').append(learnMore));
		
		repDiv.append(aImage);
		repDiv.append(contentDiv);
		repDiv.append(descriptionDiv);
		
		jq(divId).append(repDiv);
		jq(divId).append(getDiv().addClass("clear"));
		jq(divId).append(getDiv().addClass("spacer"));

		jq('#loadingPane').slideUp(1500, function() {
			jq(divId + ' .results').fadeIn(2000);
		});
	});
}

function switchRepertoryDetails(id) {
	var rep = repHelper.getRep(id);
	jq('#loadingPane p').html("Please wait while we load the details for <strong>" + rep.title[0].Text + "</strong>");
	hideAll();
	jq('#loadingPane').slideDown(500);
	setTimeout("switchRepertoryFinish('"+ id +"')", 2000);
}

function switchRepertoryFinish(id) {
	jq('#loadingPane').slideUp(800, displayRepertoryDetails(id));
	doSifrReplace();
}
function displayRepertoryDetails(id) {
	var rep = repHelper.getRep(id);
	
	var details = jq('#by-ballet-details .details');
	var header = jq('#by-ballet-details .navigation .current');
	var performanceList = jq('#by-ballet-details .performances .list');
	var image = jq('<img src="'+ repImagePath + rep.image +'" />');
	
	details.html('');
	details.append('<h2>'+ rep.title[0].Text +'</h2>');
	details.append(image);
	
	var descriptionP = jq(document.createElement("p"));
	var description = rep.description[0].Text;

	details.append('<p>' + description +'</p>');
	
	var relatedPerfs = rep.relatedPerformances[0].performance;	
	performanceList.html('');
	jq.map(relatedPerfs, function(relatedPerf){
		var perf = repHelper.getPerformance(relatedPerf.id);
		var relatedRepsDiv = repHelper.createRelatedRepsElement(perf.relatedReps[0].repertory);
		var container = jq('<div class="perf">');
		container.append(perf.dateString[0].Text);
		container.append(relatedRepsDiv);
		
		if(perf.pastPerformance == "1") {
			container.append('<a href="#" class="buy-tickets-button buy-tickets-button-disabled float-right"></a>');
			//container.append('<a href="'+ baseUrl +'/'+ perf.seoUrl +'" class="buy-tickets-button float-right"></a>');
		} else {
			container.append('<a href="'+ baseUrl +'/'+ perf.seoUrl +'" class="buy-tickets-button float-right"></a>');
		}
		
		
		container.append('<div class="clear"></div>')
		
		performanceList.append(container);
	});
	
	hideAll();
	jq('#by-ballet-details').fadeIn();
	doSifrReplace();
	resetNavigationState();
}

function existsInArray(val, ary) {
	var i=0;
	for(i=0; i<ary.length; i++) {
		if(ary[i] == val)
		return true;
	}
	return false;
}
function getRequiredMonths(performances) {
	var d = new Date();
	var uniqueMonths = [];
	
	jq.each(performances, function(){
		d.setTime(jq(this).attr("starttime"));
		var entry = d.getMonth() + "/" + d.getFullYear();
		
		if(!existsInArray(entry, uniqueMonths)) {
			uniqueMonths.push(entry);
		}
	});
	
	return uniqueMonths;
}

function displayCalendar(divId, month, year) {
	var numDays = 31;
	if (month == 3 || month == 5 || month == 8 || month == 10)
		numDays = 30;
	
	if (month == 1) {
		numDays = 28;
		
		if ((year%4 == 0 && year%100 != 0))
			numDays = 29;
		if(year%400 == 0)
			numDays = 29;
	}
	
	var monthDate = new Date(year, month, 1);
	var firstDayInMonth = monthDate.getDay();
	
	var mainDiv = getDiv().attr("id", "cal-" + month + "-" + year);
	mainDiv.addClass("cal");
	var titleDiv = getDiv().addClass("title");
	titleDiv.append(MONTH[month] +", " + year);
	var weekDaysDiv = getDiv().addClass("week-days-container");
	
	weekDaysDiv.append(getDiv().append("Sun"));
	weekDaysDiv.append(getDiv().append("Mon"));
	weekDaysDiv.append(getDiv().append("Tue"));
	weekDaysDiv.append(getDiv().append("Wed"));
	weekDaysDiv.append(getDiv().append("Thu"));
	weekDaysDiv.append(getDiv().append("Fri"));
	weekDaysDiv.append(getDiv().append("Sat"));
	weekDaysDiv.append(getDiv().addClass("clear"));
	
	var daysDiv = getDiv().addClass("days-container");
	var i=0;
	var c=1;
	for(i=0; i<35; i++) {
		var dayDiv = getDiv().addClass("day");
    	
		if (i >= firstDayInMonth && numDays > 0) {
			dayDiv.append(c);
			dayDiv.addClass("date-"+ c);
			numDays--;
			c++;
		}
		daysDiv.append(dayDiv);
		
		if(i == 34 && numDays > 0) {
			i -= 7;
		}
	}
	daysDiv.append(getDiv().addClass("clear"));
	
	mainDiv.append(titleDiv);
	mainDiv.append(weekDaysDiv);
	mainDiv.append(daysDiv);
	
	jq(divId).append(mainDiv);
	jq(divId).append(getDiv().addClass("clear"));
}

function displayCalendarDetails(month, day, year) {
	
	var d = new Date();
	d.setFullYear(year, month, day);
	
	var performances = jq('season performances performance', xmlData);
	var details =jq('#by-calendar-details .details');
	details.html('');
	performances.each(function() {
		var perfDate = new Date();
		perfDate.setTime(jq(this).attr("starttime"));
		
		if(perfDate.getFullYear() == year && perfDate.getMonth() == month && perfDate.getDate() == day) {
			var relatedReps = jq(this).find('relatedReps');
			var reps = relatedReps.find('repertory');
			
			details.append("<h2>" + jq(this).find("dateString").text() + "</h2>");
			reps.each(function(){
				var fullRep = findRepById(jq(this).attr("id"));
				var title = fullRep.find("title").text();
				var description = fullRep.find("description").text();
				var repId = fullRep.attr("id");
				
				var repContainer = jq('<div class="rep-container"></div>');
				var aImage = jq('<a href="#"></a>');
				aImage.append('<img src="'+ repImagePath + fullRep.attr("image") +'" />');
				
				aImage.click(function() {
					displayRepertoryDetails(repId);
					return false;
				});
				repContainer.append(aImage);
				
				var aTitle = aImage.clone().html(title);
				aTitle.click(function() {
					displayRepertoryDetails(repId);
					return false;
				});
				
				repContainer.append(jq('<p></p>').append(aTitle));
				
				details.append(repContainer);
				
			});
			details.append(getDiv().addClass("clear"));
			
			var buyLink = jq(document.createElement("a"));
			buyLink.addClass("buy-tickets-button");
			buyLink.addClass("float-right");
			buyLink.attr("href", baseUrl + "/" + jq(this).attr("seoUrl"));
			
			details.append(buyLink);
			details.append(getDiv().addClass("clear"));
			details.append(getDiv().addClass("hr"));
			
		}
	});
	
	hideAll();
	jq('#by-calendar-details').fadeIn();
	doSifrReplace();
	resetNavigationState();
}

function populateCalendarWithPerformances(performances) {
	var d = new Date();
	performances.each(function() {
		d.setTime(jq(this).attr("starttime"));
		var year = d.getFullYear();
		var month = d.getMonth();
		var day = d.getDate();
		
		var cell = jq('#cal-'+ month +'-' + year + ' .date-'+ day).addClass("perf-avail");
		
		if(cell.data('perfCodes')) {
			var cellData = cell.data('perfCodes');
			cellData.push(jq(this).attr("id"));
		} else {
			cell.data('perfCodes', [jq(this).attr("id")]);
		}
		
		cell.click(function() {
			displayCalendarDetails(month, day, year);
		});
	});
	
	setCalendarToolTips();
}

function setCalendarToolTips(peformances) {
	var activeDates = jq('#by-calendar .cal .perf-avail');
	
	activeDates.each(function() {
		var perfCodes = jq(this).data('perfCodes');
		var toolTipHtml = '';
		var dateCell = jq(this);
		
		jq.map(perfCodes, function(perfId) {
			var perf = repHelper.getPerformance(perfId);
			toolTipHtml += '<p class="header">'+ perf.dateString[0].Text +'</p>';
			toolTipHtml += '<p>';
			
			jq.map(perf.relatedReps[0].repertory, function(repObj){
				var rep = repHelper.getRep(repObj.id);
				toolTipHtml += rep.title[0].Text + '<br />';
			});
			
			toolTipHtml += '</p>';
		});
		
		dateCell.easyTooltip({
    		content: toolTipHtml
    	});
	});
	
	
}

function displayCalendars(divId) {
	var performances = jq('season performances performance', xmlData);
	var monthsInUse = getRequiredMonths(performances);
	
	var i=0;
	for(i=0; i<monthsInUse.length; i++) {
		var monthYear = monthsInUse[i].split('/');
		displayCalendar(divId, monthYear[0], monthYear[1]);
	}
	populateCalendarWithPerformances(performances);
}

function findRepById(id) {
	var reps = jq('season repertories repertory', xmlData);
	var rep;
	reps.each(function() {
		if(jq(this).attr("id") == id) {
			rep = jq(this);
		}
	});
	
	return rep;
}

function findPerformanceById(id) {
	var allPerformances = jq('season performances performance', xmlData);
	var performance;
	
	allPerformances.each(function() {
		if(jq(this).attr("id") == id){
			performance = jq(this);
		}
	
	});
	
	return performance;
}

function doSifrReplace() {
	/*
	sIFR.replace(dinmedium, {
		selector: '#single-tickets-non-block .details h2'
		,css: {
			'.sIFR-root': { 'color': '#666666', 'text-transform': 'uppercase' }
		},
		wmode: 'transparent'
	});
	*/
	
	sIFR.replace(dinmedium, {
		selector: 'h1, h3'
		,css: {
			'.sIFR-root': { 'color': '#000000', 'text-transform': 'uppercase' }
		},
		wmode: 'transparent'
	});
}

function hideAll() {
	jq('#single-tickets-non-block .display-block').hide();
}
function hideBallets() {
	jq('#by-ballet').fadeOut();
}

function hideCalendar() {
	jq('#by-calendar').fadeOut();
}

function getDiv() {
	return jq(document.createElement("div"));	
}

function resetNavigationState() {
	jq('#view-ballets-button').removeClass('click-by-ballet-button-disabled');
	jq('#view-calendar-button').removeClass('click-by-calendar-button-disabled');
}

function showBalletNavigationState() {
	resetNavigationState();
	jq('#view-ballets-button').addClass('click-by-ballet-button-disabled');
}

function showCalendarNavigationState() {
	resetNavigationState();
	jq('#view-calendar-button').addClass('click-by-calendar-button-disabled');
}
