
/* Configuration */
var videoPath = '/media/hbcu/winners06';
var mediaPlayerDiv = 'mediaplayer-winner';

dojo.require("dojo.date.format");
dojo.require("dojo.date.serialize");
dojo.require("dojo.debug.console");
dojo.require("dojo.dom");
dojo.require("dojo.io.*");
dojo.require("dojo.uuid.LightweightGenerator");
dojo.require("dojo.widget.Tooltip");
dojo.hostenv.writeIncludes();

/* Existing content DIVs */
var origContent = null;
var origPlayer = null;

/* Current school code */
var schoolId = 0;
var schoolCode = '';

/* Debug */
dojo.event.connect(window, "onload", function() {
	
	dojo.debug("Looking for movie...");
	try {
		dojo.debug("Movie: ", document.hbcumovie);
	} catch (e) {}
	
});

var schools = [
	'albany',
	'delaware',
	'florida',
	'fort',
	'howard',
	'jackson',
	'morehouse',
	'norfolk',
	'oakwood',
	'prairie',
	'savannah',
	'spelman',
	'tennessee',
	'texas'
];

var imageSchools = [
	'hampton'
];

function makeMapFunc(/* string */name) {
	return function() { winners.show(name, videoPath, mediaPlayerDiv); };
}

function makeMapImgFunc(/* string */name) {
	return function() { winners.showImage(name, videoPath, mediaPlayerDiv); };
}


/* Initial movie load */
function loadMovie() {
	dojo.debug("Setting media player's initial HTML");
	dojo.byId(mediaPlayerDiv).innerHTML = '<object id="hbcumovie" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" width="320" height="255"> <param name="src" value="/media/hbcu/HBCU_trim.mov" /> <param name="autoplay" value="true" /> <param name="controller" value="true" /> <param name="bgcolor" value="#000000" /> <embed name="hbcumovie" width="320" height="255" type="video/quicktime" src="/media/hbcu/HBCU_trim.mov" autoplay="true" controller="true" bgcolor="#000000" enablejavascript="true"></embed></object><p class="subplayertext smalltext"><a href="http://www.apple.com/quicktime/" target="_blank">Requires Quicktime 7.0 &mdash; click here to download</a></p>';
}


/* Initializations */
dojo.event.connect(dojo, "loaded", function() {
	
	/* Existing content DIVs */
	origContent = dojo.byId("content-orig");
	origPlayer = dojo.byId("player-content-orig");
	
	formHandler.setForm(dojo.byId("form-feedback"));
	
	/* Map and text links */
	for (var i = 0; i < schools.length; i++) {
		var schoolName = schools[i];
		dojo.debug("Connecting ", schoolName);
		var func = makeMapFunc(schoolName);
		dojo.event.connect(dojo.byId("nav-star-" + schoolName), "onclick", func);
		dojo.event.connect(dojo.byId("nav-text-" + schoolName), "onclick", func);
	}
	
	for (var i = 0; i < imageSchools.length; i++) {
		var schoolName = imageSchools[i];
		dojo.debug("Connecting ", schoolName, " (image-only)");
		var func = makeMapImgFunc(schoolName);
		dojo.event.connect(dojo.byId("nav-star-" + schoolName), "onclick", func);
		dojo.event.connect(dojo.byId("nav-text-" + schoolName), "onclick", func);
	}
	
	
	/* Exception case for original trailer */
	dojo.event.connect(dojo.byId("nav-text-trailer"), "onclick", function() {
		winners.hide();
		winners.resetAll();
		origContent.style.display = "block";
		winners.writePlayer(dojo.byId(mediaPlayerDiv), '/media/hbcu', 'HBCU_trim.mov');
	});
	
	
	/* "Add comment" link */
	dojo.event.connect(dojo.byId("link-add-comment"), "onclick", function() {
		dojo.byId("link-add-comment").style.display = "none";
		dojo.byId("feedback-form-container").style.display = "block";
	});
	
	dojo.event.connect(dojo.byId("btn-feedback-cancel"), "onclick", function() {
		formHandler.resetForm();
		return formHandler.hideForm();
	});
	
	dojo.event.connect(dojo.byId("btn-feedback-submit"), "onclick", function() {
		formHandler.processForm();
	});
	
	dojo.debug("Setting timeout for init");
	window.setTimeout(loadMovie, 1500);
});


function WinnersHandler() {
	/* Public methods */
	this.getCurrentPlayer = getCurrentPlayer;
	this.hide = hide;
	this.resetAll = resetAll;
	this.show = show;
	this.showImage = showImage;
	this.writePlayer = writePlayer;
	
	var currentContent = null;
	var currentFeedback = null;
	var currentPlayer = null;
	
	function getCurrentPlayer() {
		return currentPlayer;
	}
	
	function show(code, path, mediaDivName) {
		showCommon(code);
		
		var mediaDiv = dojo.byId(mediaDivName);
		mediaDiv.style.display = "block";
		
		this.writePlayer(mediaDiv, path, code + ".mov");
	}
	
	function showImage(code, path, mediaDivName) {
		showCommon(code);
		
		var mediaDiv = dojo.byId(mediaDivName);
		mediaDiv.style.display = "block";
		
		mediaDiv.innerHTML = '<img src="' + path + '/' + code + '_320.jpg" width="320" alt="' + code + '" />';
	}
	
	function resetAll() {
		currentContent = null;
		currentFeedback = null;
		currentPlayer = null;
		dojo.byId("feedback").style.display = "none";
	}
	
	function showCommon(code) {
		hide();
		
		var contentDiv = dojo.byId("content-" + code);
		if (contentDiv) {
			currentContent = contentDiv;
			currentContent.style.display = "block";
		}
		
		/* Update global school ID */
		window.schoolId = schoolIds[code];
		window.schoolCode = code;
		
		/* Feedback items */
		feedbackDiv = dojo.byId("feedback-items-" + code);
		if (feedbackDiv) {
			/* Show form */
			dojo.byId("feedback").style.display = "block";
			/* Show existing comments */
			currentFeedback = feedbackDiv;
			currentFeedback.style.display = "block";
			if (!feedbackLoaded[code]) {
				feedbackHandler.getFeedbackItems();
				feedbackLoaded[code] = true;
			}
		}
	}
	
	function hide() {
		/* If we find any other players and can control them, stop them now */
		try {
			if (document.hbcumovie && document.hbcumovie.Stop) {
				document.hbcumovie.Stop();
			}
		} catch(e) {
			dojo.debug("Error stopping previous movie: ", e);
		}
		
		if (!currentContent) {
			currentContent = origContent;
			currentPlayer = origPlayer;
		}
		currentContent.style.display = "none";
		currentPlayer.innerHTML = '';
		currentPlayer.style.display = "none";
		
		if (currentFeedback) {
			currentFeedback.style.display = "none";
		}
	}
	
	function writePlayer(targetDiv, filePath, fileName) {
		var html = '<object id="hbcumovie" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" width="320" height="255"> <param name="src" value="' + filePath + '/' + fileName + '" /> <param name="autoplay" value="true" /> <param name="controller" value="true" /> <param name="bgcolor" value="#000000" /> <embed name="hbcumovie" width="320" height="255" type="video/quicktime" src="' + filePath + '/' + fileName + '" autoplay="true" controller="true" bgcolor="#000000" enablejavascript="true"><\/embed><\/object><p class="subplayertext smalltext"><a href="http://www.apple.com/quicktime/" target="_blank">Requires Quicktime 7.0 &mdash; click here to download<\/a><\/p>';
		targetDiv.innerHTML = html;
		currentPlayer = targetDiv;
		currentPlayer.style.display = "block";
	}
}

function FeedbackHandler() {
	
	this.addFeedbackItem = addFeedbackItem;
	this.getFeedbackItems = getFeedbackItems;
	
	/* Create new response in proper feedback items div */
	function addFeedbackItem(name, school, msg, date) {
		
		/* School code is required to identify target feedback-items div */
		if (!window.schoolCode) {
			return false;
		}
		
		var container = dojo.byId("feedback-items-" + window.schoolCode);
		var contents = container.getElementsByTagName("div");
		var numOldItems = contents.length;
		
		var oldContents = Array();
		
		for (var i = 0; i < numOldItems; i++) {
			node = contents[0];
			oldContents.push(node);
			container.removeChild(node);
		}
		
		/* Date string */
		var timestamp = " on " + dojo.date.strftime(date, "%d %b %y at %l:%M %p");
		
		/* New feedback item div */
		var newDiv = document.createElement("div");
		newDiv.className = "feedback-item";
		
		/* Byline para */
		var pByline = document.createElement("p");
		pByline.className = "byline";
		var sName = document.createElement("strong");
		sName.appendChild(document.createTextNode(name));
		var sSchool = document.createElement("strong");
		sSchool.appendChild(document.createTextNode(school));
		pByline.appendChild(document.createTextNode("From "));
		pByline.appendChild(sName);
		pByline.appendChild(document.createTextNode(" at "));
		pByline.appendChild(sSchool);
		pByline.appendChild(document.createTextNode(timestamp));
		
		/* Comment para */
		var p = document.createElement("p");
		var txt = document.createTextNode(msg);
		p.appendChild(txt);
		
		newDiv.appendChild(pByline);
		newDiv.appendChild(p);
		
		container.appendChild(newDiv);
		
		for (var i = 0; i < oldContents.length; i++) {
			container.appendChild(oldContents[i]);
		}
	}
	
	/* Get feedback items */
	function getFeedbackItems() {
		if (!window.schoolId) {
			return false;
		}
		
		dojo.byId("feedback-items-loading").style.display = "block";
		
		var bindArgs = {
			url:			"/responders/multicomment.php?do=listfor",
			mimetype:	"text/plain",
			method:		"GET",
			error:		function(type, errorObj) { feedbackError(errorObj) },
			load:			function(type, data, evt) { parseListingResponse(data) },
			content:	{
				mfid: window.schoolId
			}
		}
		
		dojo.debug("Looking up arguments for " + window.schoolCode + " (id=" + window.schoolId + ")");
		
		return dojo.io.bind(bindArgs);
	}
	
	/* Handle feedback error */
	function feedbackError(eo) {
		if (eo.message.message) {
			dojo.debug("Feedback err: [0] " + eo.message.message);
		} else if (eo.message) {
			dojo.debug("Feedback err: [1] " + eo.message);
		} else {
			dojo.debug("Feedback err: [2] " + eo);
		}
		
		dojo.byId("feedback-items-loading").style.display = "none";
	}
	
	/* Given an XML response of feedback items, parse doc and create individual items */
	function parseListingResponse(data) {
		
		dojo.debug("Parsing response");
		
		try {
			var xmlDoc = dojo.dom.createDocumentFromText(data);
		} catch (e) {
			dojo.debug("Error creating DOM doc: " + e.message);
		}
		
		try {
			var parser = new dojo.xml.Parse();
		} catch(e) {
			dojo.debug("Error instantiating Parse: " + e.message);
		}
		
		try {
			var topElm = dojo.dom.firstElement(xmlDoc);
		} catch(e) {
			dojo.debug("Error getting firstElement() in DOM doc: " + e.message);
		}
		
		try {
			var parsedNodes = parser.parseElement(topElm, false, false, 0);
		} catch(e) {
			dojo.debug("Error running parseElement(): " + e.message);
		}
		
		if (parsedNodes.comments && parsedNodes.comments[0] && parsedNodes.comments[0].comment) {
		
			dojo.debug(parsedNodes.comments[0].comment.length + " comments:");
			
			/* Add feedback items */
			for (var i = 0; i < parsedNodes.comments[0].comment.length; i++) {
				var c = parsedNodes.comments[0].comment[i];
				
				dojo.debug(i + ": name: " + c.name[0].value);
				
				addFeedbackItem(c.name[0].value, c.location[0].value, c.entry[0].value, dojo.date.fromRfc3339(c.createddate[0].value));
			}
		}
		
		if (dojo.byId("feedback-items-loading")) {
			dojo.byId("feedback-items-loading").style.display = "none";
		}
	}
}

function FormHandler() {
	var errorPane = null;
	var theForm = null;
	
	this.processForm = processForm;
	this.hideError = hideError;
	this.hideForm = hideForm;
	this.returnSubmit = returnSubmit;
	this.resetForm = resetForm;
	this.setForm = setForm;
	this.showError = showError;
	
	/* Populate and reveal error pane.  Then setTimeout for hiding the pane again */
	function showError(msg) {
		var msgText = document.createTextNode(msg);
		
		var para = document.createElement("p");
		if (!errorPane) {
			errorPane = dojo.byId("feedback-form-msg");
		} else {
			var paras = errorPane.getElementsByTagName("p");
			for (var i = 0; i < paras.length; i++) {
				errorPane.removeChild(paras[i]);
			}
		}
		para.appendChild(msgText);
		errorPane.appendChild(para);
		errorPane.style.display = "block";
		
		window.setTimeout("formHandler.hideError()", 5000);
	}
	
	/* Add feedback item, then hide form */
	function showSuccess(name, school, msg, date) {
		feedbackHandler.addFeedbackItem(name, school, msg, date);
		hideForm();
		resetForm();
		
		/* Reload Captcha image */
		captchaImg.reload();
	}
	
	function hideError() {
		if (!errorPane) {
			errorPane = dojo.byId("feedback-form-msg");
		}
		errorPane.style.display = "none";
	}
	
	function hideForm() {
		dojo.byId("link-add-comment").style.display = "block";
		dojo.byId("feedback-form-container").style.display = "none";
		return false;
	}
	
	/* Setter for theForm */
	function setForm(formDiv) {
		theForm = formDiv;
	}
	
	/* Handles form's onsubmit */
	function returnSubmit() {
		return false;
	}
	
	/* Check form values on this side before submitting */
	function processForm() {
		var sName = theForm.form_submitname.value;
		var sSchool = theForm.form_submitschool.value;
		var sMsg = theForm.form_submitcomment.value;
		var sImgText = theForm.form_imagetext.value;
		var sId = window.schoolId;
		
		if (!sName) {
			showError("Your name is required.");
			return false;
		}
		
		if (!sMsg) {
			showError("You must enter a message.");
			return false;
		}
		
		if (!sImgText) {
			showError("You must enter the string you see in the image.");
			return false;
		}
		
		dojo.byId("btn-feedback-submit").value = "Saving...";
		dojo.byId("btn-feedback-cancel").style.display = "none";
		
		if (false == submitForm(sName, sSchool, sMsg, sImgText, sId)) {
			showError("There was an error with your submission.");
		}
	}
	
	function resetForm() {
		dojo.byId("btn-feedback-submit").value = "Save comment";
		dojo.byId("btn-feedback-cancel").style.display = "";
		theForm.form_submitname.value = "";
		theForm.form_submitschool.value = "";
		theForm.form_submitcomment.value = "";
		theForm.form_imagetext.value = "";
	}
	
	function submitForm(name, school, msg, imgText, id) {
		
		var bindArgs = {
			url:			"/responders/multicomment.php?do=process",
			mimetype:	"text/plain",
			method:		"POST",
			error:		function(type, errorObj) { showSuccess(name, school, "ERROR POSTING THIS MESSAGE: " + msg, new Date()); },
			load:			function(type, data, evt) { showSuccess(name, school, msg, new Date()); },
			content:	{
				form_name: name,
				form_school: school,
				form_msg: msg,
				form_imgtext: imgText,
				form_id: id
			}
		}
		
		return dojo.io.bind(bindArgs);
	}
}

/* Handle reload requests for captcha image */
function CaptchaImage() {
	this.reload = reload;
	
	function reload() {
		ci = dojo.byId('img-captcha');
		if (ci) {
			ci.src = '/spam/freecap.php?r=' + dojo.uuid.LightweightGenerator.generate(String);
		}
	}
}

var winners = new WinnersHandler();
var feedbackHandler = new FeedbackHandler();
var formHandler = new FormHandler();
var captchaImg = new CaptchaImage();
