var replaceDiv, replaceDivContents, replaceDivClassName, reshowEditLink;

var quality = 3;
var value = 3;
var reviews;
var maxGeneralLength = 1000;
var maxGoodPointsBadPointsLength = 250;

var cachedRetailerID;
var cachedProductCode;
var editingReviewID;
var cachedReviewID;

var html;
var ratings = new Array("Very poor", "Poor", "Average", "Good", "Excellent");

//
// Four main entry points 
//

function latestReviews()
{
	onRefresh = latestReviews;
	document.getElementById("reviews").innerHTML = "<p>Loading latest reviews...</p>";
	var xmlHttp = getXmlHttp();
	xmlHttp.onreadystatechange = function()
	{
		if (xmlHttp.readyState == 4)
		{
			xml = getResponseXMLDocumentElement(xmlHttp);
			reviews = xml.getElementsByTagName("review");
			html = "<h1>Latest reviews</h1>";
			if (reviews.length == 0)
			{
				html += "<p>There are not yet any reviews!</p>";
			}
			else
			{
				for (var i = 0; i < reviews.length; i++)
				{
					var review = reviews[i];
					displayReview(review);
				}
			}
			document.getElementById("reviews").innerHTML = html;			
		}
	}
	xmlHttp.open("GET", "/ops/reviews_xml.php?mode=latest&max=5");
	xmlHttp.send(null);
}

function productReviews(retailerID, productCode)
{
	onRefresh = productReviews;
	if (!retailerID) retailerID = cachedRetailerID;
	if (!productCode) productCode = cachedProductCode;
	cachedRetailerID = retailerID;
	cachedProductCode = productCode;
	document.getElementById("reviews").innerHTML = "<p>Loading reviews for this product...</p>";
	var xmlHttp = getXmlHttp();
	xmlHttp.onreadystatechange = function()
	{
		if (xmlHttp.readyState == 4)
		{
			xml = getResponseXMLDocumentElement(xmlHttp);
			reviews = xml.getElementsByTagName("review");
			html = "";
			var ownReview = 0;
			if (reviews.length == 0)
			{
				html += "<p>There are not yet any reviews for this product</p>";
			}
			else
			{
				for (var i = 0; i < reviews.length; i++)
				{
					var review = reviews[i];
					if (review.getAttribute("own_review")) ownReview = 1;
					displayReview(review);
				}
			}
			html += '<div id="need_login" class="loggedout">To review this or any other product yourself, you must be <a href="/register/">registered</a> and logged in</div>';
			if (ownReview)
			{
				html += '<div id="edit_link" class="loggedin"><a href="" onclick="return editReview(\'edit_link\')">Edit my own review</a> <a href="" onclick="return deleteReview()">Delete my own review</a></div>';
			}
			else
			{
				html += '<div id="edit_link" class="loggedin"><a href="" onclick="return editReview(\'edit_link\')">Add my own review</a></div>';
			}
			document.getElementById("reviews").innerHTML = html;			
			updatePageElements();
		}
	}
	selectedRetailer = encodeURI(document.getElementById("retailer_id").value);
	xmlHttp.open("GET", "/ops/reviews_xml.php?mode=product&retailer_id=" + retailerID + "&product_code=" + productCode, true);
	xmlHttp.send(null);
}

function memberReviews()
{
	onRefresh = memberReviews;
	document.getElementById("reviews").innerHTML = "<p>Loading member's reviews...</p>";
	var xmlHttp = getXmlHttp();
	xmlHttp.onreadystatechange = function()
	{
		if (xmlHttp.readyState == 4)
		{
			xml = getResponseXMLDocumentElement(xmlHttp);
			reviews = xml.getElementsByTagName("review");
			html = "";
			if (reviews.length == 0)
			{
				html += "<p>You haven't published any reviews yet!</p>";
			}
			else
			{
				for (var i = 0; i < reviews.length; i++)
				{
					var review = reviews[i];
					displayReview(review);
				}
			}
			document.getElementById("reviews").innerHTML = html;			
		}
	}
	xmlHttp.open("GET", "/ops/reviews_xml.php?mode=member");
	xmlHttp.send(null);
}

function singleReview(reviewID)
{
	if (!reviewID)
	{
		reviewID = cachedReviewID;
	}
	cachedReviewID = reviewID;
	onRefresh = singleReview;
	document.getElementById("reviews").innerHTML = "<p>Loading review...</p>";
	var xmlHttp = getXmlHttp();
	xmlHttp.onreadystatechange = function()
	{
		if (xmlHttp.readyState == 4)
		{
			xml = getResponseXMLDocumentElement(xmlHttp);
			reviews = xml.getElementsByTagName("review");
			html = "";
			if (reviews.length == 0)
			{
				html += "<p>This review does not exist</p>";
				document.getElementById("report_form").style.display = "none";
			}
			else
			{
				displayReview(reviews[0]);
				document.getElementById("report_form").style.display = "";
			}
			document.getElementById("reviews").innerHTML = html;	
			try
			{
				var fudge = document.getElementById("fudge");
				fudge.style.border = fudge.style.border;
			}
			catch(e)
			{
			}			
		}
	}
	var submittedReviewID = encodeURIComponent(reviewID);
	xmlHttp.open("GET", "/ops/reviews_xml.php?mode=single&review_id=" + submittedReviewID);
	xmlHttp.send(null);
}

//
// Support functions
//

function displayReview(review)
{
	// for product reviews
	var memberName = htmlEntities(review.getAttribute("member_name"));
	var reviewDate = review.getAttribute("display_date");
	var retailerName = htmlEntities(review.getAttribute("retailer_name"));
	var retailerShortName = htmlEntities(review.getAttribute("retailer_short_name"));
	var productCode = htmlEntities(review.getAttribute("product_code"));
	var productName = htmlEntities(review.getAttribute("product_name"));
	var reviewDate = review.getAttribute("display_date");
	var reviewText = formatText(review.getAttribute("review_text"));
	var reviewPros = formatBullets(review.getAttribute("review_pros"));
	var reviewCons = formatBullets(review.getAttribute("review_cons"));
	var reviewQualityScore = review.getAttribute("review_quality_score");
	var reviewValueScore = review.getAttribute("review_value_score");
	var canEdit = review.getAttribute("can_edit");
	var canReport = review.getAttribute("can_report");
	var reviewID = review.getAttribute("review_id");
	html += '<div id="review_id_' + reviewID + '" class="review"><div class="reviewheader"><div class="reviewheaderright"><span class="small">Quality: </span>';
	var rating = ratings[reviewQualityScore - 1];
	for (var i = 1; i <= reviewQualityScore; i++)
	{
		html += '<img src="/images/star1.png" alt="' + rating + ' quality" title="' + rating + ' quality" />';
	}
	for (var i = ++reviewQualityScore; i <= 5; i++)
	{
		html += '<img src="/images/star0.png" alt="' + rating + ' quality" title="' + rating + ' quality" />';
	}
	html += '&nbsp;&nbsp;&nbsp;<span class="small">Value: </span>';
	var rating = ratings[reviewValueScore - 1];
	for (var i = 1; i <= reviewValueScore; i++)
	{
		html += '<img src="/images/star1.png" alt="' + rating + ' value for money" title="' + rating + ' value for money" />';
	}
	for (var i = ++reviewValueScore; i <= 5; i++)
	{
		html += '<img src="/images/star0.png" alt="' + rating + ' value for money" title="' + rating + ' value for money" />';
	}
	html += '</div><div class="reviewheaderleft">';
	var url = "/reviews/" + retailerShortName + "/" + productCode + "/";
	html += '<strong><a href="' + url + '">' + productName + '</a></strong> from <strong>' + retailerName + '</strong>';
	html += '</div></div>';
	if (!reviewText && !reviewPros && !reviewCons) reviewText = "<i>Rating-only review</i>";
	html += '<div class="reviewtext">' + reviewText + '</div>';
	if (reviewPros || reviewCons)
	{
		html += '<table class="reviewprosandcons"><tr>';
		if (reviewPros) html += '<td class="reviewprosandcons"><span class="small">Good points:</span><br />' + reviewPros + '</td>';
		if (reviewCons) html += '<td class="reviewprosandcons"><span class="small">Bad points:</span><br />' + reviewCons + '</td>';
		html += '</tr></table>';
	}
	html += '<div class="reviewfooter"><div class="reviewfooterright"><strong>' + memberName + '</strong> @ ' + reviewDate + '</div><div class="reviewfooterleft">';

	var hotlinks = new Array();
	if (canEdit)
	{
		hotlinks[hotlinks.length] = '<a href="" onclick="return editReview(\'review_id_' + reviewID + '\', ' + reviewID + ')">Edit</a>';
		hotlinks[hotlinks.length] = '<a href="" onclick="deleteReview(' + reviewID + '); return false">Delete</a>';
	}
	if (canReport)
	{
		hotlinks[hotlinks.length] = '<a href="/report/' + reviewID + '/">Report</a>';
	}
	
	html += hotlinks.join(" | ");

	html += '</div>';
	html += '</div>';
	html += '</div>';
}


function generateEditor()
{
	var html = "";
	html += '<table class="full" cellspacing="6" cellpadding="0"><tr><td><span class="small">General comments</span><br /><textarea class="review" rows="5" cols="80" id="review_text" onchange="this.onkeyup()" onkeyup="if (this.value.length > ' + maxGeneralLength + ') this.value=this.value.substr(0, ' + maxGeneralLength + ')"></textarea></td>';
	html += '<td class="editorright"><span class="small">Quality</span><br/>';
	for (var i = 1; i <= 5; i++)
	{
		var rating = ratings[i - 1];
		html += '<input type="image" src="/images/star0.png" id="quality' + i + '" onclick="setQuality(' + i + ')" title="' + rating + ' quality" />';
	}
	html += '<br /><br /><span class="small">Value&nbsp;for&nbsp;money</span><br />';
	for (var i = 1; i <= 5; i++)
	{
		var rating = ratings[i - 1];
		html += '<input type="image" src="/images/star0.png" id="value' + i + '" onclick="setValue(' + i + ')" title="' + rating + ' value for money" />';
	}
	html += '</td></tr>';
	html += '<tr><td><span class="small">Good points</span><br /><textarea class="review" rows="5" cols="80" id="review_pros" onchange="this.onkeyup()" onkeyup="if (this.value.length > ' + maxGoodPointsBadPointsLength + ') this.value=this.value.substr(0, ' + maxGoodPointsBadPointsLength + ')"></textarea></td></tr>';
	html += '<tr><td><span class="small">Bad points</span><br /><textarea class="review" rows="5" cols="80" id="review_cons" onchange="this.onkeyup()" onkeyup="if (this.value.length > ' + maxGoodPointsBadPointsLength + ') this.value=this.value.substr(0, ' + maxGoodPointsBadPointsLength + ')"></textarea></td>';
	html += '<td class="bottom editorright">';
	html += '<input class="editorbutton" type="image" title="Save review" src="/images/buttons/save.png" id="save_review_button" onclick="saveReview()" />';
	html += '<input class="editorbutton" type="image" title="Cancel changes" src="/images/buttons/cancel.png" onclick="cancelEdit()" />';
	html += '</td></tr></table>';
	return html;
}

function editReview(replaceDivID, reviewID)
{
	if (replaceDiv)
	{
		cancelEdit();
	}
	replaceDiv = document.getElementById(replaceDivID);
	replaceDivClassName = replaceDiv.className;
	replaceDivContents = replaceDiv.innerHTML;
	replaceDiv.className = "review";
	replaceDiv.innerHTML = generateEditor();
	
	if (reviewID)
	{
		editingReviewID = reviewID;
		if (editLink = document.getElementById("edit_link"))
		{
			editLink.style.display = "none";
			reshowEditLink = true;
		}
	}
	
	var found = null;
	for (var i = 0; i < reviews.length; i++)
	{
		var review = reviews[i];
		if (review.getAttribute("review_id") == reviewID)
		{
			found = review;
		}
	}
	if (!found)
	{
		for (var i = 0; i < reviews.length; i++)
		{
			var review = reviews[i];
			if (review.getAttribute("member_id") == memberID)
			{
				found = review;
			}
		}
	}
	if (found)
	{
		document.getElementById("review_text").value = found.getAttribute("review_text");
		document.getElementById("review_pros").value = found.getAttribute("review_pros");
		document.getElementById("review_cons").value = found.getAttribute("review_cons");
		setQuality(found.getAttribute("review_quality_score"));
		setValue(found.getAttribute("review_value_score"));
	}
	if (!found)
	{
		document.getElementById("review_text").value = "";
		document.getElementById("review_pros").value = "";
		document.getElementById("review_cons").value = "";
		setQuality(3);
		setValue(3);
	}
	return false;
}

function cancelEdit()
{
	replaceDiv.className = replaceDivClassName;
	replaceDiv.innerHTML = replaceDivContents;
	replaceDiv = null;
	replaceDivClassName = null;
	replaceDivContents = null;
	editingReviewID = null;
	if (reshowEditLink)
	{
		document.getElementById("edit_link").style.display = "";
	}	
}

function saveReview()
{
	disableButton("save_review_button");
	var xmlHttp = getXmlHttp();
	xmlHttp.onreadystatechange = function()
	{
		if (xmlHttp.readyState == 4)
		{
			enableButton("save_review_button");
			onRefresh();
		}
	}
	var submittedText = encodeURIComponent(document.getElementById("review_text").value);
	var submittedPros = encodeURIComponent(document.getElementById("review_pros").value);
	var submittedCons = encodeURIComponent(document.getElementById("review_cons").value);
	var submittedText = submittedText.replace("%0D", "");
	var submittedPros = submittedPros.replace("%0D", "");
	var submittedCons = submittedCons.replace("%0D", "");
	var submittedQuality = encodeURIComponent(quality);
	var submittedValue = encodeURIComponent(value);
	var submittedProductCode = cachedProductCode ? encodeURIComponent(cachedProductCode) : "";
	var submittedRetailerID = cachedRetailerID ? encodeURIComponent(cachedRetailerID) : "";
	var submittedReviewID = editingReviewID ? encodeURIComponent(editingReviewID) : "";
	xmlHttp.open("POST", "/ops/savereview_xml.php", true);
	xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	message = "review_text=" + submittedText + 
			  "&review_pros=" + submittedPros + 
			  "&review_cons=" + submittedCons + 
			  "&review_quality_score=" + submittedQuality + 
			  "&review_value_score=" + submittedValue + 
			  "&product_code=" + submittedProductCode + 
			  "&retailer_id=" + submittedRetailerID +
			  "&review_id=" + submittedReviewID;
	xmlHttp.send(message);
}

function deleteReview(reviewID)
{
	var word = reviewID ? "this" : "your";
	if (!window.confirm("Are you sure you want to delete " + word + " review?")) return false;	
	var xmlHttp = getXmlHttp();
	xmlHttp.onreadystatechange = function()
	{
		if (xmlHttp.readyState == 4)
		{
			onRefresh();
		}
	}
	var submittedProductCode = cachedProductCode ? encodeURIComponent(cachedProductCode) : "";
	var submittedRetailerID = cachedRetailerID ? encodeURIComponent(cachedRetailerID) : "";
	var submittedReviewID = reviewID ? encodeURIComponent(reviewID) : "";
	xmlHttp.open("POST", "/ops/deletereview_xml.php", true);
	xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	message = "product_code=" + submittedProductCode + 
			  "&retailer_id=" + submittedRetailerID +
			  "&review_id=" + submittedReviewID;
	xmlHttp.send(message);
	return false;
}

//
// Odds and ends
//

function setQuality(newQuality)
{
	quality = newQuality;
	updateQuality();
}

function setValue(newValue)
{
	value = newValue;
	updateValue();
}

function updateQuality()
{
	for (var i = 1; i <= quality; i++)
	{
		document.getElementById("quality" + i).src = "/images/star1.png";
	}
	for (var i = quality + 1; i <=5; i++)
	{
		document.getElementById("quality" + i).src = "/images/star0.png";
	}
}

function updateValue()
{
	for (var i = 1; i <= value; i++)
	{
		document.getElementById("value" + i).src = "/images/star1.png";
	}
	for (var i = value + 1; i <=5; i++)
	{
		document.getElementById("value" + i).src = "/images/star0.png";
	}
}