if ( !tastetestfuncs ) var tastetestfuncs = {};

tastetestfuncs.rolledOverTaste = null;
tastetestfuncs.rolloverTimeout = null;

/**
 * Taste card rollover function
 */
tastetestfuncs.ontastesmouseover = function( e )
{
	var targ;
	if ( !e ) var e = window.event;
	if ( e.target ) targ = e.target;
	else if ( e.srcElement ) targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	
	if ( targ.className.match(/tasteGene /) )
	{
		var tasteCode = targ.className.substring( targ.className.indexOf(" ") + 1, targ.className.indexOf( "-class" ) );
		var rollover = document.getElementById("tasteRollover");
		switch( top.tasteRanks[tasteCode][1] )
		{
			case "HIGH":
			case "MEDIUM":
			case "LOW":
				tastetestfuncs.rolledOverTaste = targ;
				tastetestfuncs.rolloverTimeout = window.setTimeout( tastetestfuncs.showTasteRollover, 500 );
				break;
		}
		
		targ.className += " highlighted";
	}
}

/**
 * Callback function that populates the rollover with relevant movies.
 */
tastetestfuncs.populateRolloverMovies = function( movieNames )
{
	var rollover = document.getElementById("tasteRollover");
	var moviesDiv = null;
	var children = rollover.getElementsByTagName( "div" );
	for ( var i = 0; i < children.length; i++ )
	{
		if ( children[i].className == "tasteMovies" )
		{
			moviesDiv = children[i];
			break;
		}
	}
	children = moviesDiv.getElementsByTagName("div");
	for ( var i = 0; i < movieNames.length; i++ )
	{
		children[i].style.backgroundImage = 'url("' + movieImagePath + movieNames[i].key + '/' + movieNames[i].key + '-5.jpeg")';
		children[i].id = movieNames[i].value;
	}
}

/**
 * Shows and populates the tastes rollover.
 */
tastetestfuncs.showTasteRollover = function()
{
	var targ = tastetestfuncs.rolledOverTaste;
	var tasteCode = targ.className.substring( targ.className.indexOf(" ") + 1, targ.className.indexOf( "-class" ) );
	TasteTest.getRolloverMovies( top.tasteRanks[tasteCode][0], tastetestfuncs.populateRolloverMovies );
	var rollover = document.getElementById("tasteRollover");
	rollover.style.visibility = "visible";
	rollover.style.left = getPosX( targ ) - 7 + "px";
	rollover.style.top = getPosY( targ ) - 7 + "px";
	var tween = new OpacityTween( rollover, Tween.regularEaseIn, 0, 100, 0.2 );
	tween.start();
	var children = rollover.getElementsByTagName( "div" );
	var tastePicDiv = null;
	var detailsDiv = null;
	for ( var i = 0; i < children.length; i++ )
	{
		if ( children[i].className == "tastePic" )
		{
			tastePicDiv = children[i];
		}
		else if ( children[i].className == "tasteDetails" )
		{
			detailsDiv = children[i];
		}
	}
	children = detailsDiv.getElementsByTagName("span");
	var tasteNameSpan = null;
	var tasteNamePrefix = null;
	var tasteScoreSpan = null;
	for ( var i = 0; i < children.length; i++ )
	{
		if ( children[i].className == "tasteName" )
		{
			tasteNameSpan = children[i];
		}
		else if ( children[i].className == "tasteScore" )
		{
			tasteScoreSpan = children[i];
		}
		else if ( children[i].className == "tasteNamePrefix" )
		{
			tasteNamePrefix = children[i];
		}
	}
	children = detailsDiv.getElementsByTagName("div");
	var tasteDesc = null;
	for ( var i = 0; i < children.length; i++ )
	{
		if ( children[i].className == "tasteDesc" )
		{
			tasteDesc = children[i];
		}
	}
	tasteDesc.innerHTML = top.tasteRanks[tasteCode][3];
	tastePicDiv.style.backgroundImage = 'url("' + categoryImages + tasteCode + '/' + tasteCode + '_green.jpeg")';
	tastePicDiv.onclick = function( e ){document.location.href = userPages + "taste-test/" + tasteCode};
	tastePicDiv.getElementsByTagName("div")[0].innerHTML = "The " + top.tasteRanks[tasteCode][2];
	tasteNameSpan.innerHTML = top.tasteRanks[tasteCode][2];
	if ( tasteCode.match( /^[aieou]/ ) )
	{
		tasteNamePrefix.innerHTML = "an";
	}
	else
	{
		tasteNamePrefix.innerHTML = "a";
	}
	switch( top.tasteRanks[tasteCode][1] )
	{
		case "HIGH":
			tasteScoreSpan.innerHTML = "High";
			break;
		case "MEDIUM":
			tasteScoreSpan.innerHTML = "Medium";
			break;
		case "LOW":
			tasteScoreSpan.innerHTML = "Low";
			break;
	}
}

/**
 * taste mouseout event handler
 */
tastetestfuncs.ontastesmouseout = function( e )
{
	var targ;
	if ( !e ) var e = window.event;
	if ( e.target ) targ = e.target;
	else if ( e.srcElement ) targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	
	if ( targ.className.match(/ highlighted/) )
	{
		targ.className = targ.className.replace( / highlighted/, "" );
		window.clearTimeout( tastetestfuncs.rolloverTimeout );
	}
}

/**
 * Tastes rollover mouseout event handler - will hide the rollover if the mouse
 * actually left the rollover (which is hard to find).
 */
tastetestfuncs.onRolloverMouseOut = function( e )
{
	var targ;
	if ( !e ) var e = window.event;
	if ( e.target ) targ = e.target;
	else if ( e.srcElement ) targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	
	if ( targ.id == "tasteRollover" )
	{
		// Check that we actually left the rollover
		var relTarg;
		relTarg = e.relatedTarget;
		if ( !relTarg )
		{
			relTarg = e.toElement;
		}
		if ( relTarg == null )
		{
			return;
		}
		while (relTarg != targ && relTarg.nodeName != 'BODY' && relTarg.nodeName != "HTML")
		{
			relTarg = relTarg.parentNode;
		}
		if (relTarg == targ) 
		{
			return;
		}
		
		// If the rollover was displayed, hide it.
		if( targ.style.visibility == "visible" )
		{
			var tween = new OpacityTween( targ, Tween.regularEaseOut, 100, 0, 0.2 );
			tween.onMotionFinished = function(){ document.getElementById(targ.id).style.visibility = "hidden"; };
			tween.start();
			
		}
	}
	else if ( targ.className == "movie" )
	{
		document.getElementById( "rolloverMovieCaption" ).style.visibility = "hidden";
	}
}

tastetestfuncs.onRolloverMouseOver = function( e )
{
	var targ;
	if ( !e ) var e = window.event;
	if ( e.target ) targ = e.target;
	else if ( e.srcElement ) targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	
	if ( targ.className == "movie" )
	{
		var caption = document.getElementById( "rolloverMovieCaption" );
		caption.innerHTML = targ.id;
		var children = targ.parentNode.getElementsByTagName("div");
		var sibling = 0;
		for ( var i = 0; i < children.length; i++ )
		{
			if ( children[i].id == targ.id )
			{
				sibling = i;
				break;
			}
		}
		if ( sibling > 2 )
		{
			caption.style.left = null;
			caption.style.right = ((4 - sibling) * 55) + 55 + "px";
			
		}
		else
		{
			caption.style.right = null;
			caption.style.left = (sibling * 55) + "px";
		}
		
		caption.style.visibility = "visible";
	}
}

/**
 * Sets the background pictures for the movies in the taste ranking page.
 */
tastetestfuncs.setBackgroundPictures = function()
{
	var tasteRankBoxes = document.getElementById( "tasteRankBoxes" );
	var children = tasteRankBoxes.getElementsByTagName( "div" );
	for ( var i = 0; i < children.length; i++ )
	{
		if ( children[i].className.match(/^moviePic/) )
		{
			var uniqueName = children[i].title.split("~~")[0];
			var type = children[i].title.split("~~")[1];
			children[i].style.backgroundImage = "url('" + mediaServer + "/" +  getContentImageBasePath( type ) + uniqueName + "/" + uniqueName + "-3.jpeg')";
			children[i].title = "";
		}
	}
}

/**
 * Places and initializes the sliders on the ranking page.
 */
tastetestfuncs.renderSliders = function()
{
	top.slidersInitialStatus = [];
	top.rankSliders = [];
	top.rankSlidersList = [];
	var tasteRankBoxes = document.getElementById( "tasteRankBoxes" );
	var children = tasteRankBoxes.getElementsByTagName( "div" );
	for ( var i = 0; i < children.length; i++ )
	{
		if ( children[i].className.match(/^rankSlider/) )
		{
			top.rankSliders[children[i].id] = new sliderfuncs.SimpleSlider( "top.rankSliders['" + children[i].id + "']" );
			top.rankSlidersList.push( top.rankSliders[children[i].id] );
			top.rankSliders[children[i].id].setContainer( children[i] );
			top.rankSliders[children[i].id].setMinVal( 0 );
			top.rankSliders[children[i].id].setMaxVal( 10 );
			top.rankSliders[children[i].id].setStepSize( 1 );
			var additionalData = {};
			additionalData.contentId = parseInt( children[i].parentNode.title );
			children[i].parentNode.title = "";
			additionalData.rankBox = children[i].parentNode;
			top.rankSliders[children[i].id].setAdditionalData( additionalData );
			top.rankSliders[children[i].id].addEventListener( function( event ){
				if ( event.type == "Drag" || event.type == "DragEnd" || event.type == "LayoutDrag" || event.type == "layoutDragAbort")
				{
					var rankBoxChildren = event.additionalData.rankBox.getElementsByTagName("span");
					var rankBoxTextSpan = null;
					var rankBoxTextPrefix = null;
					var rankBoxLikelyToSeeDiv = null;
					var rankBoxNotForMeDiv = null;
					for ( var k = 0; k < rankBoxChildren.length; k++ )
					{
						if ( rankBoxChildren[k].id.match( /^rankBoxRatingText/ ) )
						{
							rankBoxTextSpan = rankBoxChildren[k];
						}
						if ( rankBoxChildren[k].id.match( /^userRatingTitlePrefix/ ) )
						{
							rankBoxTextPrefix = rankBoxChildren[k];
						}
					}
					rankBoxChildren = event.additionalData.rankBox.getElementsByTagName("div");
					for ( var k = 0; k < rankBoxChildren.length; k++ )
					{
						if ( rankBoxChildren[k].className.match(/^LikelyToSee/) )
						{
							rankBoxLikelyToSeeDiv = rankBoxChildren[k];
						}
						if ( rankBoxChildren[k].className.match(/^NotForMe/) )
						{
							rankBoxNotForMeDiv = rankBoxChildren[k];
						}
					}
					var showTextualRank = (rankBoxLikelyToSeeDiv.className.indexOf('selected') < 0) && (rankBoxNotForMeDiv.className.indexOf('selected') < 0)
					var elementIndex = event.slider.container.id.substr(event.slider.container.id.indexOf("rankBox") + 7);
					if( event.type == "layoutDragAbort" )
					{
							
							if(!isNaN(elementIndex))
							{
								rankBoxTextSpan.innerHTML = top.slidersInitialStatus[elementIndex].textRate;
								rankBoxTextPrefix.innerHTML = top.slidersInitialStatus[elementIndex].title;
							}
							
					}
					else
					{
						rankBoxTextSpan.innerHTML = tastetestfuncs.valToName( event.slider.getValue() );
						rankBoxTextPrefix.innerHTML = "Your Rating:";
						if( event.type == "DragEnd" )
						{
							rankBoxLikelyToSeeDiv.className = rankBoxLikelyToSeeDiv.className.replace(/\s*selected/,"");
							rankBoxNotForMeDiv.className = rankBoxNotForMeDiv.className.replace(/\s*selected/,"");
							top.slidersInitialStatus[elementIndex].textRate = rankBoxTextSpan.innerHTML;
							top.slidersInitialStatus[elementIndex].title = "Your Rating:";
						}
					}
				}
				
				if ( event.type == "DragEnd" )
				{
					tastetestfuncs.setItemRank( event.additionalData.contentId, event.slider.getValue() );
				}
				
			} );
			
			var spans = children[i].parentNode.getElementsByTagName( "span" );
			var rankTextSpan = null;
			var rankTextPrefixSpan = null;
			for ( var j = 0; j < spans.length; j++ )
			{
				if ( spans[j].id.match(/^rankBoxRatingText/) )
				{
					rankTextSpan = spans[j];
				}
				if ( spans[j].id.match(/^userRatingTitlePrefix/) )
				{
					rankTextPrefixSpan = spans[j];
				}
			}
			var rank = -1;
			if ( children[i].title.length > 0 )
			{
				rank = parseFloat( children[i].title );
				top.rankSliders[children[i].id].setValue( rank );
				children[i].title = "";
			}
			else
			{
				top.rankSliders[children[i].id].setValue( 0 );
			}
			rankTextSpan.innerHTML = tastetestfuncs.valToName( rank );
			if ( rank == -1 )
			{
				rankTextPrefixSpan.innerHTML = "Rate it";
			}
			else
			{
				rankTextPrefixSpan.innerHTML = "Your Rating:";
			}
			var initialStatusSliderId = children[i].id.substr(children[i].id.indexOf("rankBox") + 7);
			top.slidersInitialStatus[initialStatusSliderId]={ title:rankTextPrefixSpan.innerHTML, textRate: rankTextSpan.innerHTML};
			top.rankSliders[children[i].id].init();
		} 
	}
}

tastetestfuncs.tasteRankOnLoad = function()
{
	top.originalStateArray = new Array();
	
	for ( var i = 0; i < top.rankSlidersList.length; i++ )
	{
		top.originalStateArray.push('x');
		top.rankSlidersList[i].setPointerToValue();
	}
}
tastetestfuncs.valToName = function( val )
{
	if ( val == -1 )
	{
		return "";
	}
	if ( val >= 0 && val < 1 )
	{
		return "Terrible";
	}
	if ( val >= 1 && val < 2 )
	{
		return "Awful";
	}
	if ( val >= 2 && val < 3  )
	{
		return "Bad";
	}
	if ( val >= 3 && val < 4 )
	{
		return "Poor";
	}
	if ( val >= 4 && val < 5  )
	{
		return "Disappointing";
	}
	if ( val >= 5 && val < 6 )
	{
		return "So-so";
	}
	if ( val >= 6 && val < 7  )
	{
		return "Okay";
	}
	if ( val >= 7 && val < 8 )
	{
		return "Good";
	}
	if ( val >= 8 && val < 9  )
	{
		return "Great";
	}
	if ( val >= 9 && val < 10  )
	{
		return "Amazing";
	}
	if ( val == 10 )
	{
		return "Must See";
	}
}

tastetestfuncs.calculateTaste = function()
{
	document.location.href = document.location.href + "/score";
}

tastetestfuncs.setItemRank = function( contentId, rank )
{
	AjaxUserRatingBean.submiteContentUserRating( contentId, rank,{
		
		errorHandler: 	generalFunctions.handleAjaxServerErrors
		
	} );
}

tastetestfuncs.navigateToTaste = function( taste )
{
	document.location.href = userPages + "taste-test/" + taste;
}
tastetestfuncs.setLikelyOrNotInterested = function( contentId, likelyOrNotInterested, sliderIndex, ctrl )
{
	AjaxUserRatingBean.setLikelyOrNotInterested( contentId, likelyOrNotInterested,{
		
		errorHandler: generalFunctions.handleAjaxServerErrors
		
		
	} );
	top.rankSliders["rankBox" + sliderIndex].setValue(0);
	top.rankSliders["rankBox" + sliderIndex].setPointerToValue();
	top.rankSliders["rankBox" + sliderIndex].setOverlayToValue();
	document.getElementById('rankBoxRatingText' + sliderIndex).innerHTML = '';
	document.getElementById('userRatingTitlePrefix' + sliderIndex).innerHTML = 'Rate it';
	ctrl.className += " selected";
	var children = ctrl.parentNode.getElementsByTagName("div");
	for ( var i = 0; i < children.length; i++ )
	{
		if ( ctrl.className.match(/^LikelyToSee/) && children[i].className.match(/^NotForMe/) ||
			 ctrl.className.match(/^NotForMe/) && children[i].className.match(/^LikelyToSee/) )
		{
			children[i].className = children[i].className.replace(/\s*selected/,"");
		}
	}
}
