/*
 * INIT
 */

var CYO = {};

jq(function () {
	CYO.init();
	
	jq('#htmlModal').jqm({
		trigger: 'a.rep-link-modal',
	    ajax: '@href',
	    target: 'div.jqmContent',
	    overlay: 0
	});
	
});

CYO.init = function () {
	CYO.Prefs = {
		baseUrl: '/nycballet',
		xmlUrl: '/nycballet/season-xml.ep?choicebank=true',
		seasonData: '',
		repertoryContainer: 'custom-step-1 .rep-list',
		repertoryDetailsContainer: 'custom-step-1 .rep-details',
		repertoryDetailsPerformancesContainer: 'custom-step-1 .rep-details .performances .list',
		selectionsContainer: 'CYO_selections',
		selectionsListContainer: 'CYO_selections .selections',
		repImagePath: repImagePath,
		selectedPerformances: [],
		minimumSelectedPerformances: 3,
		maximumSelectedPerformances: 12,
		messages: {
			minimumPerformances: "You must select at least 3 performances to continue",
			maximumPerformances: "You may only select a maximum of 12 performances.",
			addOrContinue: "You can select up to 12 performances, or continue to step 2"
		},
		sellableFormPrefix: "2012SERIES"
	};
	
	CYO.Prefs.selectedPerformances.contains = function (item) {
		var i;
		for (i = 0; i < this.length; i++) {
			if (this[i] === item) {
				return true;
			}
		}
		
		return false;
	};
	
	CYO.Prefs.selectedPerformances.indexOf = function (item) {
		var i;
		for (i = 0; i < this.length; i++) {
			if (this[i] === item) {
				return i;
			}
		}
	};
	
	CYO.Prefs.selectedPerformances.remove = function (item) {
		if (this.contains(item)) {
			var index = this.indexOf(item);
			this.splice(index, 1);
		}
	};
	
	
	
	jq.ajax({ 
    	type: 'GET',
    	url: CYO.Prefs.xmlUrl, 
    	async: true,
    	success: function (data) {
    		CYO.Prefs.seasonData = jq.xmlToJSON(data);
    		CYO.CONTROLLER.init();
    		CYO.VIEW.init();
    	}
    });
};

/*
 * UTIL
 */
CYO.UTIL = {};
CYO.UTIL.createJqDomElement = function (name) {
	return jq(document.createElement(name));
};
CYO.UTIL.createLink = function (href, text) {
	var a = CYO.UTIL.createJqDomElement("a");
	a.attr("href", href);
	a.text(text);
	
	return a;
};
CYO.UTIL.createImg = function (src) {
	var img = CYO.UTIL.createJqDomElement("img");
	img.attr("src", src);
	
	return img;
};

CYO.UTIL.createExpandableText = function (text, minLength, container) {
	if (text.length > minLength) {
		var shortText = text.substring(0, minLength).substring(0, text.substring(0, minLength).lastIndexOf(" "));
		var remainingText = text.substring(shortText.length);
		
		var moreSpan = CYO.UTIL.createJqDomElement('span'); 
		var moreA = CYO.UTIL.createJqDomElement('a').text(" ... view more");
		
		
		moreA.attr("href", "#");
		moreA.click(function () {
			jq(this).parents("p:first").find(".hidden").removeClass("hidden");
			jq(this).hide();
			return false;
		});
		
		moreSpan.append(moreA);
		
		container.append(shortText);
		container.append(moreSpan);
		container.append('<span class="hidden">&nbsp;' + remainingText + '</span>');
	} else {
		container.append(text);
	}
	
	return container;
};

CYO.UTIL.doSifrReplace = function () {
	sIFR.replace(dinmedium, {
		selector: '#custom-step-1 .rep-details h3',
		css: {
			'.sIFR-root': { 'color': '#666666', 'text-transform': 'uppercase' }
		},
		wmode: 'transparent'
	});
};

CYO.UTIL.arrayContains = function (array, obj) {
	var i;
	for (i = 0; i < array.length; i++) {
		if (array[i] === obj) {
			return true;
		}
	}
	
	return false;
};

CYO.UTIL.createRelatedRepsElement = function (relatedReps) {
	var repList = CYO.UTIL.createJqDomElement('div');
	
	jq.map(relatedReps, function (relatedNode) {
		var relatedRep = CYO.MODEL.getRep(relatedNode.id);
		var relatedRepLink = CYO.UTIL.createJqDomElement('a');
		relatedRepLink.attr("href", "#");
		relatedRepLink.text(relatedRep.title[0].Text);
		
		relatedRepLink.click(function () {
			jq().trigger('showRepDetails', relatedNode.id);
			return false;
		});
		
		repList.append(relatedRepLink);
		repList.append("<br />");
	});
	repList.addClass('performing-reps');
	
	return repList;
};

CYO.UTIL.createCartNoteXML = function () {
	var sXML = '';
	
	sXML += '<subscription>';
	sXML += '	<ballet>';
	sXML += '		<code></code>';
	sXML += '		<name>Performances</name>';
	sXML += '		<dates>';
	
	jq.map(CYO.Prefs.selectedPerformances, function (perfId) {
		var perfObj = CYO.MODEL.getPerformance(perfId);
		var dateText = perfObj.dateString[0].Text;
		var id = perfObj.id;
		
		sXML += '		<date perfCode="' + id + '">' + dateText + '</date>';
	});
	
	sXML += '		</dates>';
	sXML += '	</ballet>';
	sXML += '</subscription>';
	
	return sXML;
};

CYO.UTIL.createSubscriptionSummary = function () {
	var sSummary = "";
	
	jq.map(CYO.Prefs.selectedPerformances, function (perfId) {
		var perfObj = CYO.MODEL.getPerformance(perfId);
		
		if (sSummary !== "") {
			sSummary += "_";
		}
		
		sSummary += perfObj.id + ":" + perfObj.perfnumber + ":" + perfObj.priceoverride;
		
	});
	
	return sSummary;
};

/*
 * CONTROLLER
 */

CYO.CONTROLLER = {};

CYO.CONTROLLER.init = function () {
	jq('#custom-sub .view-all-ballets-button').click(function () {
		CYO.VIEW.hideRepDetails();
		CYO.VIEW.showRepList();
		CYO.VIEW.updateChoicesPane();
	});
	
	jq('#custom-sub .show-choices-button').click(function () {
		CYO.VIEW.hideStep2();
		CYO.VIEW.showStep1();
		CYO.VIEW.showChoices();
	});
	
	jq('#custom-sub .hide-choices-button').click(function () {
		CYO.VIEW.hideChoices();
	});
	
	jq('#CYO_create-product').click(function () {
		CYO.VIEW.hideChoices();
		CYO.VIEW.hideStep1();
		CYO.VIEW.showPurchaseForm();
		CYO.VIEW.showStep2();
	});
	
	jq('.CYO_addToCartButton').click(function () {
		var sCartNoteXML = CYO.UTIL.createCartNoteXML();
		var sSummary = CYO.UTIL.createSubscriptionSummary();		
		jq(this).before('<input type="hidden" name="CHOSEN_SUBSCRIPTIONS" id="CHOSEN_SUBSCRIPTIONS" value="' + sSummary + '" />');
		jq(this).before('<textarea class="hidden" name="cartNotes" id="cartNotes">' + sCartNoteXML + '</textarea>');
		jq(this).parents("form:first").submit();
	});
	
	jq('.view-ballets-back-button').click(function() {
		CYO.VIEW.hideStep2();
		CYO.VIEW.showStep1();
		CYO.VIEW.hideRepDetails();
		CYO.VIEW.showRepList();
		CYO.VIEW.hideViewAllButtons();
	});
	
	jq('#add-more-button').click(function() {
		CYO.VIEW.hideStep2();
		CYO.VIEW.showStep1();
		CYO.VIEW.hideRepDetails();
		CYO.VIEW.showRepList();
		CYO.VIEW.hideViewAllButtons();
	});
	
	
	jq().bind('showRepDetails', function (e, repId) {
		var repObj = CYO.MODEL.getRep(repId);
		
		CYO.VIEW.populateRepertoryDetails(repObj);
		CYO.VIEW.hideRepList();
		CYO.VIEW.hideRepDetails();
		CYO.VIEW.showRepDetails();
		CYO.VIEW.updateChoicesPane();
		CYO.UTIL.doSifrReplace();
	});
	
	jq().bind('addPerformance', function (e, perfId) {
		
		if (CYO.Prefs.selectedPerformances.length === CYO.Prefs.maximumSelectedPerformances) {
			return;
		}
		
		if (!CYO.Prefs.selectedPerformances.contains(perfId)) {
			var perfObj = CYO.MODEL.getPerformance(perfId);
			CYO.VIEW.addPerformance(perfObj);
			CYO.MODEL.addPerformance(perfId);
			CYO.VIEW.updateChoicesPane();
			CYO.VIEW.showChoices();
		}
	});
	
	jq().bind('removePerformance', function (e, perfId) {
		CYO.MODEL.removePerformance(perfId);
		CYO.VIEW.removePerformance(perfId);
	});
};

/*
 * MODEL
 */
CYO.MODEL = {};
CYO.MODEL.init = function () {};

CYO.MODEL.getRep = function (repId) {
	var repObjPos = CYO.Prefs.seasonData.repertories[0].repertory.indexOf("id", repId);
	var repObj = CYO.Prefs.seasonData.repertories[0].repertory[repObjPos];
	
	return repObj;
};

CYO.MODEL.getRepPerformances = function (repId) {
	
	var repObj = CYO.MODEL.getRep(repId);
	var relatedPerfs = repObj.relatedPerformances[0].performance;
	var relatedPerfAry = [];
	
	jq.map(relatedPerfs, function (relatedPerfObj) {
		relatedPerfAry.push(CYO.MODEL.getPerformance(relatedPerfObj.id));
	});
	
	return relatedPerfAry;
};

CYO.MODEL.getPerformance = function (perfId) {
	
	var perfObjPos = CYO.Prefs.seasonData.performances[0].performance.indexOf("id", perfId);
	var perfObj = CYO.Prefs.seasonData.performances[0].performance[perfObjPos];
	
	return perfObj;
};

CYO.MODEL.addPerformance = function (perfId) {
	CYO.Prefs.selectedPerformances.push(perfId);
};

CYO.MODEL.removePerformance = function (perfId) {
	CYO.Prefs.selectedPerformances.remove(perfId);
};


/*
 * VIEW
 */

CYO.VIEW = {};

CYO.VIEW.init = function () {
	CYO.VIEW.populateRepertories();
	CYO.VIEW.hideRepDetails();
	CYO.VIEW.hideLoadingAnimation();
};

CYO.VIEW.hideLoadingAnimation = function() {
	jq('#custom-step-1 .loading').slideUp(1500);
}

CYO.VIEW.hideRepList = function () {
	jq('#' + CYO.Prefs.repertoryContainer).hide();
};

CYO.VIEW.showRepList = function () {
	jq('#' + CYO.Prefs.repertoryContainer).show();
};

CYO.VIEW.hideRepDetails = function () {
	jq('#' + CYO.Prefs.repertoryDetailsContainer).hide();
};

CYO.VIEW.showRepDetails = function () {
	jq('#' + CYO.Prefs.repertoryDetailsContainer + ' .performances').show();
	jq('#' + CYO.Prefs.repertoryDetailsContainer).fadeIn(800);
	CYO.VIEW.showViewAllButtons();
	
};

CYO.VIEW.showViewAllButtons = function() {
	jq('#subs-content-header-button .view-ballets-back-button').fadeIn(800);
	jq('#subs-content-footer-button .view-ballets-back-button').fadeIn(800);
};

CYO.VIEW.hideViewAllButtons = function() {
	jq('#subs-content-header-button .view-ballets-back-button').fadeOut(800);
	jq('#subs-content-footer-button .view-ballets-back-button').fadeOut(800);
};

CYO.VIEW.showStep1 = function () {
	jq('#custom-step-1').show(800);
};

CYO.VIEW.hideStep1 = function () {
	jq('#custom-step-1').hide(500);
};

CYO.VIEW.showStep2 = function () {
	jq('#custom-step-2').show(800);
};

CYO.VIEW.hideStep2 = function () {
	jq('#custom-step-2').hide(800);
};

CYO.VIEW.showChoices = function () {
	jq('#' + CYO.Prefs.selectionsContainer).css("display", "block");
	jq('#' + CYO.Prefs.selectionsContainer).animate({ right: "-275px", "opacity": 1},  "fast");
	jq('#custom-sub .show-choices-button').fadeOut();
};

CYO.VIEW.hideChoices = function () {
	
	jq('#' + CYO.Prefs.selectionsContainer).animate({ right: "0", "opacity": 0 },  "fast");
	jq('#' + CYO.Prefs.selectionsContainer).fadeOut(500);
	jq('#custom-sub .show-choices-button').fadeIn();
};

CYO.VIEW.enableStep2Button = function () {
	jq('#CYO_create-product').removeAttr('disabled');
	jq('#CYO_create-product').removeClass('continue-step-2-button-disabled');
};

CYO.VIEW.disableStep2Button = function () {
	jq('#CYO_create-product').attr('disabled', 'disabled');
	jq('#CYO_create-product').addClass('continue-step-2-button-disabled');
};

CYO.VIEW.addPerformance = function (perfObj) {
	var perfDiv = CYO.UTIL.createJqDomElement('div');
	perfDiv.addClass('selected-perf');
	perfDiv.data('perfId', perfObj.id);
	
	var perfDesc = CYO.UTIL.createJqDomElement('div');
	perfDesc.addClass('desc');
	perfDesc.append('<p><strong>' + perfObj.dateString[0].Text + '</strong></p>');
	
	var relatedReps = perfObj.relatedReps[0].repertory;
	perfDesc.append(CYO.UTIL.createRelatedRepsElement(relatedReps));
	
	perfDiv.append(perfDesc);
	
	var removeButton = CYO.UTIL.createJqDomElement('a');
	removeButton.attr("href", "#");
	removeButton.addClass('remove-button');
	removeButton.click(function () {
		jq().trigger('removePerformance', perfObj.id);
		return false;
	});
	
	perfDiv.append(removeButton);
	perfDiv.append(CYO.UTIL.createJqDomElement("div").addClass("clear"));
	
	jq('#' + CYO.Prefs.selectionsListContainer).append(perfDiv);
};

CYO.VIEW.updateChoicesPane = function () {	
	var warningDiv = jq('#CYO_selections .selection-content .warning');
	var messageDiv = jq('#CYO_selections .selection-content .message');
	warningDiv.html('');
	messageDiv.html('');
	
	/*
	 * Update status message at the top
	 */
	if (CYO.Prefs.selectedPerformances.length < CYO.Prefs.minimumSelectedPerformances) {
		warningDiv.append("<p>" + CYO.Prefs.messages.minimumPerformances + "</p>");
		CYO.VIEW.disableStep2Button();
	} else if (CYO.Prefs.selectedPerformances.length >= CYO.Prefs.maximumSelectedPerformances) {
		warningDiv.append("<p>" + CYO.Prefs.messages.maximumPerformances + "</p>");
	} else {
		messageDiv.append("<p>" + CYO.Prefs.messages.addOrContinue + "</p>");
		CYO.VIEW.enableStep2Button();
	}
	
	/*
	 * make the Step1 pane and choices pane equal in height
	 */
	jq("#CYO_selections").css("height", "auto");
	jq("#custom-step-1").css("height", "auto");
	var step1Div = jq("#custom-step-1").outerHeight();
	var choicesDiv = jq("#CYO_selections").outerHeight() - 32;
	
	if (step1Div === choicesDiv) {
		step1Div = jq("#custom-step-1").outerHeight();
		choicesDiv = jq("#CYO_selections .selection-content").outerHeight();
	}
	
	var newHeight;
	if (step1Div < choicesDiv) {
		newHeight = choicesDiv;
		jq("#custom-step-1").css("height", newHeight + "px");
	} 

	if (choicesDiv <= step1Div) {
		newHeight = step1Div +  32;
		jq("#CYO_selections").css("height", newHeight + "px");
	}
};



CYO.VIEW.removePerformance = function (perfId) {
	var selectedPerfs = jq('#' + CYO.Prefs.selectionsListContainer).find('.selected-perf');
	
	selectedPerfs.each(function () {
		if (jq(this).data('perfId') === perfId) {
			jq(this).remove();
		}
	});
	
	jq('#custom-step-1 .add-button').each(function () {
		bPerfId = jq(this).data("perfId");
		if (bPerfId === perfId) {
			jq(this).removeClass("add-button-disabled");
			jq(this).removeAttr("disabled");
		}
	});
	
	CYO.VIEW.updateChoicesPane();
};

CYO.VIEW.populateRepertoryDetails = function (repObj) {
	var image = repObj.image;
	var description = repObj.description[0].Text;
	var detailsContainer = jq('#' + CYO.Prefs.repertoryDetailsContainer + ' .details');
	var performanceContainer = jq('#' + CYO.Prefs.repertoryDetailsPerformancesContainer);
	
	detailsContainer.html('');
	performanceContainer.html('');
	
	detailsContainer.append('<h3>' + repObj.title[0].Text + '</h3>');
	detailsContainer.append(CYO.UTIL.createImg(CYO.Prefs.repImagePath + image));
	detailsContainer.append(CYO.UTIL.createExpandableText(description, 500, CYO.UTIL.createJqDomElement('p')));
	
	var performances = CYO.MODEL.getRepPerformances(repObj.id);
	
	jq.map(performances, function (perf) {
		var dateString = perf.dateString[0].Text;
		var relatedReps = perf.relatedReps[0].repertory;
		var pastPerformance = perf.pastPerformance;
		
		var container = CYO.UTIL.createJqDomElement('div');
		container.addClass("perf");
		
		var disabled = "";
		var disabledCSS = "";
		if (CYO.Prefs.selectedPerformances.contains(perf.id) || pastPerformance=="1") {
			disabled = "disabled";
			disabledCSS = " add-button-disabled";
		}
		
		var bAdd = jq('<input type="button" class="add-button float-right' + disabledCSS + '" value="" ' + disabled + '/>');
		bAdd.data('perfId', perf.id);
		bAdd.click(function () {
			jq().trigger('addPerformance', perf.id);
			jq(this).attr('disabled', 'disabled');
			jq(this).addClass('add-button-disabled');
			return false;
		});
		
		container.append(dateString);
		container.append("<br />");
		container.append(CYO.UTIL.createRelatedRepsElement(relatedReps));
		container.append(bAdd);
		container.append(CYO.UTIL.createJqDomElement('div').addClass('clear'));
		
		performanceContainer.append(container);
		performanceContainer.append(CYO.UTIL.createJqDomElement('div').addClass('clear'));
		
	});
};

CYO.VIEW.populateRepertories = function () {
	var repertories = CYO.Prefs.seasonData.repertories[0].repertory;
	
	jq.map(repertories, function (rep) {
		if(!rep.subBlockOut) {
			var repDiv = CYO.VIEW.createRepThumbnailElement(rep);
			jq('#' + CYO.Prefs.repertoryContainer).append(repDiv);
		}
	});
	
	jq('#' + CYO.Prefs.repertoryContainer).append(CYO.UTIL.createJqDomElement('div').addClass("clear"));
};

CYO.VIEW.createRepThumbnailElement = function (repObj) {
	var repDiv = CYO.UTIL.createJqDomElement("div");
	repDiv.addClass("repThumb");
	
	var link = CYO.UTIL.createLink("#", "");
	link.click(function () {
		jq().trigger('showRepDetails', repObj.id);
		return false;
	});
	
	var repImage = CYO.UTIL.createImg(CYO.Prefs.repImagePath + repObj.image);
	repDiv.append(link.append(repImage));
	
	var repTitleP = CYO.UTIL.createJqDomElement("p");
	var secondLink = CYO.UTIL.createLink("#", repObj.title[0].Text);
	secondLink.click(function () {
		jq().trigger('showRepDetails', repObj.id);
		return false;
	});
	repTitleP.append(secondLink);
	
	repDiv.append(repTitleP);
	
	return repDiv;
};

CYO.VIEW.showPurchaseForm = function () {
	var totalPerformances = CYO.Prefs.selectedPerformances.length;
	var formId = CYO.Prefs.sellableFormPrefix + "P" + totalPerformances + "SELLABLEForm";
	
	jq('#custom-step-2 .cyo-sellable-product-form').hide();
	jq('#' + formId).show();
};
    
