

/*******************************************************************************
 QUIZ WIDGETS
 *******************************************************************************/

var doFlash = false;

var quizQuestionWidget = {
	STATES : { READY : 0, LOADING_BATCH : 1, BATCH_FAILURE : 7, BATCH_TIMEOUT : 8, LOADING_QUESTION : 2, QUESTION_FAILURE : 9, QUESTION_TIMEOUT : 10, EMPTY : 3, DISABLED : 4, RATING_QUESTION : 5, REGISTRATION : 6 },	
	index : -1,
	options : { throttle : 2, regprompt: false },
	questions : new Array(),
	rateLastQuestion : false,
	handleBatch : function() {
		if (this.state == quizQuestionWidget.STATES.DISABLED) {
			this.paint();
			return;
		}
		this.state = this.STATES.LOADING_BATCH;
		this.paint();
		var params = "action=batch";
		new Ajax.Request('/nequiz/getbatch', {parameters:params, onSuccess:this.onBatchSuccess.bind(this), onFailure:this.onBatchFailure.bind(this), onTimeout:this.onBatchTimeout.bind(this)});
	},
	handleResetBatch : function() {
		this.index = -1;
		this.rateLastQuestion = false;
		this.questions.clear();
		this.state = this.STATES.LOADING_BATCH;
		this.paint();
		var params = "action=batch&strict=1";
		new Ajax.Request('/nequiz/getbatch', {parameters:params, onSuccess:this.onBatchSuccess.bind(this), onFailure:this.onBatchFailure.bind(this), onTimeout:this.onBatchTimeout.bind(this)});
	},
	onBatchSuccess : function(response) {
		response.responseText.evalScripts();
		if (this.questions.length > this.index + 1) {
			this.handleNextQuestion();
		} else {
			this.handleEmpty();
		}
	},
	onBatchFailure : function(response) {
		this.state = this.STATES.BATCH_FAILURE;
		this.paint();
	},
	onBatchTimeout : function(response) {
		this.state = this.STATES.BATCH_TIMEOUT;
		this.paint();
	},
	handleNextQuestion : function() {
		if (this.state == quizQuestionWidget.STATES.DISABLED) {
			this.paint();
			return;
		}
		if (this.rateLastQuestion) {	
			var d = new Date();
			if (this.options.throttle > 0 && d.getMilliseconds() % this.options.throttle == 0) {
				this.rateLastQuestion = false;
				this.state = this.STATES.RATING_QUESTION;
				this.paint();
				return;	
			}
		
		}
		
		// prompt for reg after questions 10, 20 (0-indexed).  Only prompt if enabled (regprompt) and we're not currently doing it (state check)
		if (this.state != this.STATES.REGISTRATION && this.options.regprompt && (this.index % 100 == 9 || this.index % 100 == 19)) {
		
			//Tracker.tag('NEMQAnonRegPrompt'+this.index);

			this.state = this.STATES.REGISTRATION;
			this.paint();

			// stop for good after # 20 (will reset if they refresh)
			if (this.index % 100 == 19) {
				this.options.regprompt = false;
			}

			// change message based on #
			if (this.index % 100 == 19) {
				$('regmessage').innerHTML = 'OK, this is the last time we\'ll ask.  Would you like to save?';
			}

			return;
		}

		this.state = this.STATES.LOADING_QUESTION;
		this.paint();
		if (this.index+1 < this.questions.length) {
			
			this.index += 1;
			var params = "questionId="+this.questions[this.index];
			if (quizQuestionWidget.firstChoice != null && this.index == 0) {
				params += "&choiceId=" + quizQuestionWidget.firstChoice;
			}
			new Ajax.Request('/nequiz/getquestion', {parameters:params, onComplete:this.onQuestionSuccess.bind(this), onFailure:this.onQuestionFailure.bind(this), onTimeout:this.onQuestionTimeout.bind(this)});
		} else {
			setTimeout(this.handleBatch.bind(this), 1000);
		}
	},
	onQuestionSuccess : function(response) {

		$('quizQuestion').update(response.responseText);
		this.state = this.STATES.READY;
		this.paint();
		if (this.index > 0) { // dont credit first view
			if (!currentUser.isLoggedIn()) {
				//Tracker.tag('NEMQAnon');
			} else {
				//Tracker.tag('NEMQ');
			}
			doFlash = true;
		}
	},
	onQuestionFailure : function(response) {
		this.state = this.STATES.QUESTION_FAILURE;
		this.paint();
	},
	onQuestionTimeout : function(response) {
		this.state = this.STATES.QUESTION_TIMEOUT;
		this.paint();		
	},	
	reportBadQuestion : function(questionId) {
		var params = "gameAction=reportBadQuestion&questionId="+questionId;
		new Ajax.Updater('badQuestionLink', '/ne-quiz', {parameters:params});
	},
	handleEmpty : function() {
		this.state = this.STATES.EMPTY;
		this.paint();
	},
	handleDisable : function() {
		this.state = this.STATE.DISABLED;
		this.paint();
	},
	paint : function() {
		switch (this.state) {
			case this.STATES.READY:
				$('quizBatchLoading').hide();
				$('quizQuestionLoading').hide();
				$('quizEmpty').hide();
				$('quizDisabled').hide();
				$('quizRating').hide();
				$('quizRegistration').hide();
				$('quizQuestion').show();
				break;
			case this.STATES.LOADING_BATCH:
				$('quizQuestionLoading').hide();
				$('quizEmpty').hide();
				$('quizQuestion').hide();
				$('quizDisabled').hide();
				$('quizRating').hide();
				$('quizRegistration').hide();
				$('quizBatchLoading').show();
				break;
			case this.STATES.BATCH_FAILURE:
				$('quizBatchLoading').update("The request to retrieve a batch of quiz questions failed.  Please refresh your browser and try again.");
				break;
			case this.STATES.BATCH_TIMEOUT:
				$('quizBatchLoading').update("The request to retrieve a batch of quiz questions timed out.  Please refresh your browser and try again.");
				break;
			case this.STATES.LOADING_QUESTION:
				$('quizBatchLoading').hide();
				$('quizEmpty').hide();
				$('quizQuestion').hide();
				$('quizDisabled').hide();
				$('quizRating').hide();
				$('quizRegistration').hide();
				$('quizQuestionLoading').show();
				break;
			case this.STATES.QUESTION_FAILURE:
				$('quizQuestionLoading').update("The request to a quiz question failed.  Please refresh your browser and try again.");
				break;
			case this.STATES.QUESTION_TIMEOUT:
				$('quizQuestionLoading').update("The request to retrieve a quiz question timed out.  Please refresh your browser and try again.");
				break;
			case this.STATES.EMPTY:
				$('quizBatchLoading').hide();
				$('quizQuestionLoading').hide();
				$('quizQuestion').hide();
				$('quizDisabled').hide();
				$('quizRating').hide();
				$('quizRegistration').hide();
				$('quizEmpty').show();			
				break;
			case this.STATES.DISABLED:
				$('quizBatchLoading').hide();
				$('quizQuestionLoading').hide();
				$('quizQuestion').hide();
				$('quizEmpty').hide();
				$('quizRating').hide();
				$('quizRegistration').hide();
				$('quizDisabled').show();
				break;
			case this.STATES.RATING_QUESTION:
				Element.setStyle('th2up', { border : "1px solid #fff" });
				Element.setStyle('th2down', { border : "1px solid #fff" });
				$('quizBatchLoading').hide();
				$('quizQuestionLoading').hide();
				$('quizQuestion').hide();
				$('quizEmpty').hide();
				$('quizDisabled').hide();
				$('quizRegistration').hide();
				$('quizRating').show();
				break;
			case this.STATES.REGISTRATION:
				$('quizBatchLoading').hide();
				$('quizQuestionLoading').hide();
				$('quizQuestion').hide();
				$('quizEmpty').hide();
				$('quizDisabled').hide();
				$('quizRegistration').show();
				break;
		}
	}
};

var quizAnswerWidget = {
	handleEnter : function(e, type) {
		if (e.keyCode == Event.KEY_RETURN && type == 'movies') {
			this.handleMovieSearch();
			return false;
		} else if (e.keyCode == Event.KEY_RETURN && type == 'actors') {
			this.handleActorSearch();
			return false;
		} else {
			return true;
		}
	},
	handleMovieSearch : function() {
		$('submitBtn').disabled = true;
		var params = Form.Element.serialize($("msearch"));
		new Ajax.Request('/search/movie', {parameters:params, onComplete:this.processSearch.bind(this)});
	},
	handleActorSearch : function() {
		$('submitBtn').disabled = true;
		var params = Form.Element.serialize($("asearch"));
		new Ajax.Request('/search/actor', {parameters:params, onComplete:this.processSearch.bind(this)});
	},
	processSearch : function(response) {
		$('submitBtn').disabled = false;
		$('searchResults').update(response.responseText);
	},
	handleSkipAnswer : function(qid) {
		var params = "questionId="+qid;
		new Ajax.Request('/nequiz/submitanswer', {parameters:params, onComplete:this.processAnswer.bind(this)});
		quizQuestionWidget.handleNextQuestion();
	},
	handleAnswer : function(qid) {
		var params = Form.serialize($('answerForm'));		
		new Ajax.Request('/nequiz/submitanswer', {parameters:params, onComplete:this.processAnswer.bind(this)});
		quizQuestionWidget.handleNextQuestion();
	},
	processAnswer : function(response) {
		$('quizAnswer').update(response.responseText);
	},
	enable : function() {
		$('submitBtn').enable();
	}
};

var quizRatingWidget = {
	THUMBS_UP : 1,
	THUMBS_DOWN : 2,
	THUMBS_NONE : 3,
	message : "Saved - Thanks!",
	handleUp : function(qid, wid, next) {
		$(wid+'message').update(this.message);
		Element.setStyle(wid+'up', { border : "1px solid #000" });
		Element.setStyle(wid+'down', { border : "1px solid #ffc" });
		this.handleVote(qid, this.THUMBS_UP);
		
		if (next) {
			quizQuestionWidget.handleNextQuestion();
		}
	},
	handleDown : function(qid, wid, next) {
		$(wid+'message').update(this.message);
		Element.setStyle(wid+'up', { border : "1px solid #ffc" });
		Element.setStyle(wid+'down', { border : "1px solid #000" });
		this.handleVote(qid, this.THUMBS_DOWN);
		if (next) {
			quizQuestionWidget.handleNextQuestion();
		}
	},
	handleVote : function(qid, tid) {
		var params = "rateAction=rateQuestion&questionId="+qid+"&thumbsId="+tid;
		new Ajax.Request('/rate.sv', {parameters:params});
	}
};

var quizInviteWidget = {
	handleInvite : function() {
		var emailRegxp = /^([\w]+)(.[\w]+)*@([\w]+)(.[\w]{2,3}){1,2}$/;
		if (emailRegxp.test($('email').value) != true) {
			alert('Please enter a valid email address.');
			return;
		}
		var params = Form.serialize($('inviteForm'));
		$('inviteBtn').disabled = true;
		$('email').disabled = true;
		new Ajax.Request('/inviteAction.do', {parameters:params, asynchronous:true, onComplete:this.processInvite.bind(this)});
		//Tracker.tag('AjaxQuizInvitation');
	},
	processInvite : function(response) {
		Element.show($('inviteSentMessage'));
		$('email').value = 'Email another';
		$('email').disabled = false;
		$('inviteBtn').disabled = false;
	},
	handleFocus : function() {
		Element.hide($('inviteSentMessage'));
		if ($('email').value=='Email a friend to play' || $('email').value=='Email another') 
			$('email').value='';
	}
};

var quizPlayersWidget = {
	STATES : { OFF : 0, PLAYERS_ON : 1, FRIENDS_ON : 2 },
	playersDirty : true,
	friendsDirty : true,
	state : 0,
	handlePlayers : function() {
		if (this.state == this.STATES.PLAYERS_ON) {
			this.state = this.STATES.OFF;
		} else {
			this.state = this.STATES.PLAYERS_ON;
		}
		if (this.state == this.STATES.PLAYERS_ON && this.playersDirty) {
			var params = "refreshPlayers=";
			new Ajax.Request('/quiz.sv', {parameters:params, onComplete:this.processPlayers.bind(this)});
		}
		this.paint();
	},
	processPlayers : function(response) {
		$('players').update(response.responseText);
		this.playersDirty = false;
		setTimeout(function() { quizPlayersWidget.playersDirty = true; }, 60000);
	},
	refreshFriends : function() {
		var params = "refreshFriends=";
		new Ajax.Request('/quiz.sv', {parameters:params, onComplete:this.processFriends.bind(this)});
	},
	handleFriends : function() {
		if (this.state == this.STATES.FRIENDS_ON) {
			this.state = this.STATES.OFF;
		} else {
			this.state = this.STATES.FRIENDS_ON;
		}
		if (this.state == this.STATES.FRIENDS_ON && this.friendsDirty) {
			var params = "refreshFriends=";
			new Ajax.Request('/quiz.sv', {parameters:params, onComplete:this.processFriends.bind(this)});
		}
		this.paint();
	},
	processFriends : function(response) {
		$('friends').update(response.responseText);
		this.friendsDirty = false;
		setTimeout(function() { quizPlayersWidget.friendsDirty = true; }, 60000);
	},
	paint : function() {
		switch (this.state) {
			case this.STATES.OFF:
				$('players').hide();
				$('friends').hide();
				Element.removeClassName("playersLink", "selected");
				Element.removeClassName("friendsLink", "selected");
				break;
			case this.STATES.PLAYERS_ON:
				$('friends').hide();
				Element.removeClassName("friendsLink", "selected");
				$('players').show();
				Element.addClassName("playersLink", "selected");
				break;
			case this.STATES.FRIENDS_ON:
				$('players').hide();
				Element.removeClassName("playersLink", "selected");
				$('friends').show();
				Element.addClassName("friendsLink", "selected");
				break;
		}
	}
};

function showq() {
	var q = '';
	for(i=0; i<quizQuestionWidget.questions.length; i++) {
		q += '[' + quizQuestionWidget.questions[i] + ']';
	}
	q += "{position = "+quizQuestionWidget.index+"}";
	$('q').update(q);
}



// forms
var QuizQuestionFormWidget = Class.create();
QuizQuestionFormWidget.prototype = {
	initialize : function(form) {
		this.form = form;
		Event.observe($(this.form), "submit", this.handleValidate.bind(this));
	},
	handleValidate : function() {
		if (!TextUtils.hasText($('question').value)) {
			alert("Whoops, you forgot to type in a question");
			return false;
		}
		$('questionSubmitBtn').disabled = true;
		return true;
	}
}

var QuestionContentTypeWidget = Class.create();
QuestionContentTypeWidget.prototype = {
	initialize : function() {
		Event.observe($('contentType'), "change", this.handleChange.bind(this));
	},
	handleChange: function() {
		$('contentI').hide();
		$('contentA').hide();
		$('contentV').hide();
		switch ($('contentType').value) {
			case 'I':
				$('contentI').show();
				break;
			case 'A':
				$('contentA').show();
				break;
			case 'V':
				$('contentV').show();
				break;
		}
	}
};

var QuestionAnswerTypeWidget = Class.create();
QuestionAnswerTypeWidget.prototype = {
	initialize : function() {
		Event.observe($('answerType'), "change", this.handleChange.bind(this));
	},
	handleChange: function() {
		$('answerC').hide();
		$('answerM').hide();
		$('answerP').hide();
		switch ($('answerType').value) {
			case 'C':
				$('answerC').show();
				break;
			case 'M':
				$('answerM').show();
				break;
			case 'P':
				$('answerP').show();
				break;
		}
	}
};

var SearchWidget = Class.create();
SearchWidget.prototype = {
	STATES : { READY : 0, SEARCHING : 1 },
	setOptions : function(options) { 
		this.options = {
			parent:'search',
			action:'searchMovies',
			url:'/myoq.sv'
		}
		Object.extend(this.options, options || {});
	},
	initialize : function(options) {
		this.setOptions(options);
		this.search = $A( $(this.options.parent).getElementsByClassName('search') ).first();
		Event.observe(this.search, 'focus', this.handleFocus.bind(this));
		Event.observe(this.search, 'blur', this.handleBlur.bind(this));
		Event.observe(this.search, 'keypress', this.handleEnter.bind(this));
		this.text = this.search.value;
		this.button = $A( $(this.options.parent).getElementsByClassName('jbutton') ).first();
		Event.observe(this.button, 'click', this.handleSearch.bind(this));
		this.results = $A( $(this.options.parent).getElementsByClassName('results') ).first();
		this.loading = $A( $(this.options.parent).getElementsByClassName('loading') ).first();
	},
	handleFocus : function() {
		if ($F(this.search) == this.text) {
			this.search.value = "";
		}
	},
	handleBlur : function() {
		if (!TextUtils.hasText($F(this.search))) {
			this.search.value = this.text;
		}
	},
	handleEnter : function(e) {
		if (e.keyCode == Event.KEY_RETURN) {
			this.handleSearch();
			Event.stop(e);
			return false;
		} else {
			return true;
		}
	},
	handleSearch : function() {
		var params = "quizAction=" + this.options.action + "&" + Form.Element.serialize(this.search);
		new Ajax.Request(this.options.url, {parameters:params, onComplete:this.processSearch.bind(this)});
		this.state = this.STATES.SEARCHING;
		this.paint();
	},
	processSearch : function(response) {
		$(this.results).update( response.responseText );
		this.state = this.STATES.READY;
		this.paint();
	},
	paint : function() {
		switch (this.state) {
			case this.STATES.READY:
				$(this.loading).hide();
				$(this.results).show();
				break;
			case this.STATES.SEARCHING:
				$(this.results).hide();
				$(this.loading).show();
				break;
		}
	}
};

var buttonToggle = 0;
function flashSaveButton() {
	if (d.getElementById('saveButton')) { 
		if (doFlash) {
			if (buttonToggle == 0) {
				d.getElementById('saveButton').style.background="#ffffff";
				d.getElementById('saveButton').style.color="#dd3333";
				buttonToggle = 1;
			}
			else {
				d.getElementById('saveButton').style.background="#dd3333";
				d.getElementById('saveButton').style.color="#ffffff";
				buttonToggle = 0;
			}
		}
		setTimeout("flashSaveButton()",1000);
	}


}

