var noopFunction = function() { };

var starOnImg = 'yellowStarOn.gif';
var starOffImg = 'yellowStarOff.gif';
// This script depends on a global variable cntxtPath being
// set.

var maxStars = 5;
var rollTxtProductRate = new Array("It's terrible.", " It needs help.", "It's okay.", " I like it.", "I love it.");

var rollTxtMerchantRate = new Array("", "", "", "", "");

function dhtmlLoadScript(url) {
	var elem = document.createElement("script");
	elem.src = url;
	elem.type="text/javascript";
	document.getElementsByTagName("head")[0].appendChild(elem);
}

var ajaxLoaded = false

function loadAjax() {
	if (!ajaxLoaded) {
		dhtmlLoadScript(cntxtPath + '/javascript/dwr-c.js');
		dhtmlLoadScript(cntxtPath + '/dwr/interface/DWRAction.js');
		dhtmlLoadScript(cntxtPath + '/javascript/DWRActionUtil.js');
		ajaxLoaded = true;
	}
}

function rateMerchant(formId, submitButtonId, thankYouId) {
	// Wait for Ajax scripts to be loaded
	if (!self.DWRActionUtil || !self.DWRAction || !self.DWRUtil) {
		loadAjax();
		var cmd = "rateMerchant('" + formId + "','" + submitButtonId + "','" + thankYouId + "');";
		alert(cmd);
		setTimeout(cmd, 200);
		return;
	}
	
	function doOnRateMerchant(str) {
		document.getElementById(submitButtonId).style.display = 'none';
		document.getElementById(thankYouId).style.display = '';
	}
	
	DWRActionUtil.execute({
			namespace:'/ajax',
			action:'rateMerchant',
			executeResult:'true'
		}, formId, doOnRateMerchant, "Rating Merchant ...");
}

function rateProduct(formId) {
	// Wait for Ajax scripts to be loaded
	if (!self.DWRActionUtil || !self.DWRAction || !self.DWRUtil) {
		loadAjax();
		var cmd = "rateProduct('" + formId + "');";
		setTimeout(cmd, 200);
		return;
	}

	DWRActionUtil.execute({
			namespace:'/ajax',
			action:'rateProduct',
			executeResult:'true'
		}, formId, doOnProductRating, "Rating Product ...");
}

function doOnProductRating() {
	var rateProductDiv = document.getElementById('addRatingForm');
	rateProductDiv.style.display = 'none';
	var rateProductTY = document.getElementById('rateProductTY');
	rateProductTY.style.display = '';
}

function rateReview(formId, divId) {
	// Wait for Ajax scripts to be loaded
	if (!self.DWRActionUtil || !self.DWRAction || !self.DWRUtil) {
		loadAjax();
		var cmd = "rateReview('" + formId + "','" + divId + "');";
		setTimeout(cmd, 200);
		return;
	}
	
	function doOnRateReview(str) {
		var div = document.getElementById(divId);
		div.innerHTML = str;
	}
	
	DWRActionUtil.execute({
		namespace:'/ajax',
		action:'rateUserReview',
		executeResult:'true'
	}, formId, doOnRateReview, "Rating Review ...");
}

function reportReview(formId, divId) {
	// Wait for Ajax scripts to be loaded
	if (!self.DWRActionUtil || !self.DWRAction || !self.DWRUtil) {
		loadAjax();
		var cmd = "reportReview('" + formId + "','" + divId + "');";
		setTimeout(cmd, 200);
		return;
	}
	
	function doOnReportReview(str) {
		var div = document.getElementById(divId);
		div.innerHTML = str;
	}
	
	DWRActionUtil.execute({
		namespace:'/ajax',
		action:'reportUserReview',
		executeResult:'true'
	}, formId, doOnReportReview, "Reporting Review ...");
}

function addReview(formId) {
	// Wait for Ajax scripts to be loaded
	if (!self.DWRActionUtil || !self.DWRAction || !self.DWRUtil) {
		loadAjax();
		var cmd = "addReview('" + formId + "');";
		setTimeout(cmd, 200);
		return;
	}

	var form = document.getElementById(formId)
	var reviewTitle = form.reviewSummary.value;
	var reviewText = form.reviewText.value;
	var reviewRating = form.reviewRating.value;
	
	function doOnAddReview(str) {
		// This is a little ugly. We should probably take advantage of DWRs ability
		// to serialize objects instead of using our own hacked serialization...
		var code = str.substring(0, 1) * 1;
		var msg = str.substring(2);
		
		switch (code) {
			case 1:
				// Review and Rating added
				// Add new review to list of reviews
				var userReview = document.getElementById('newReviewWrapper');
				if (userReview != null) {
					var reviewTextWithLineBreaks = reviewText.replace(/\n/g, '<br/>\n');
					document.getElementById('newReviewTitleText').innerHTML = reviewTitle;
					document.getElementById('newReviewDetailed').innerHTML =
						reviewTextWithLineBreaks;
					fixStars(document.getElementById('newReviewRatingStars'), reviewRating);
					userReview.style.display = ''; 
					var enc = document.getElementById('reviewEncouragement');
					if (enc != null) {
						enc.style.display = 'none';
					}
				}
				document.getElementById('addReviewSectionForm').style.display = 'none';
				document.getElementById('addReviewSectionTY').style.display = '';
				document.getElementById('addReviewStatus').innerHTML = '';
				break;
			case 2: // Rating added
			case 3: // Error occurred
				var statusDiv = document.getElementById('addReviewStatus');
				statusDiv.innerHTML = msg;
				break;
		}
	}
	
	DWRActionUtil.execute({
		namespace:'/ajax',
		action:'addUserReview',
		executeResult:'true'
	}, 'addReviewForm', doOnAddReview, "Adding Review ...");
}

function fixStars(starsSpan, rating) {
	var numStars = 0;
	for (var i = 0; i < starsSpan.childNodes.length; i++) {
		var img = starsSpan.childNodes[i];
		if (img.nodeName.toLowerCase() == 'img') {
			if (numStars < rating) {
				changeImage(img, starOnImg);
			}
			numStars++;
		}
	}
}

function initializeStars(
	starsIdPrefix,
	inputFieldId,
	rolloverTextId,
	rolloverText,
	onImg,
	offImg,
	clickCallback) {
	
	var inputField = document.getElementById(inputFieldId);
	var rolloverElem = document.getElementById(rolloverTextId);
	var initialRolloverText = rolloverElem.innerHTML;
	var selectedRolloverText = null;
	for (var i = 0; i < maxStars; i++) {
		var starImg = document.getElementById(starsIdPrefix + i);
		
		starImg.onmouseover= function(i) {
			return function() {
				setStars(starsIdPrefix, i + 1, maxStars, onImg, offImg);
				rolloverElem.innerHTML = rolloverText[i];
			}
		}(i)
          
		starImg.onmouseout=function() {
			setStars(starsIdPrefix, inputField.value, maxStars, onImg, offImg);
			if (selectedRolloverText == null) {
				rolloverElem.innerHTML = initialRolloverText;
			} else {
				rolloverElem.innerHTML = selectedRolloverText;
			}				
		}
			
		starImg.onclick= function(i) {
			return function() {
				selectedRolloverText = rolloverText[i];
				inputField.value = i + 1;
				clickCallback();
			}
		}(i)
	}
}

function activateMerchantRatingField(imgPrefixId, onImg, offImg, rolloverId, inputFieldId,
	merchantRateInstructionId, merchantRateButtonId, merchantThankYouId) {
	
	setStars(imgPrefixId, 0, maxStars, onImg, offImg);
	var callback = function merchantRateCallback() {
		document.getElementById(merchantRateInstructionId).style.display = 'none';
		document.getElementById(merchantThankYouId).style.display = 'none';
		document.getElementById(merchantRateButtonId).style.display = '';
	}
	initializeStars(imgPrefixId, inputFieldId, rolloverId, rollTxtMerchantRate, onImg, offImg, callback);
}


function setStars(starsIdPrefix, numStars, maxStars, onImg, offImg) {
	for (var i = 0; i < maxStars; i++) {
		var star = document.getElementById(starsIdPrefix + i);
		if (i < numStars) {
			changeImage(star, onImg);
		} else {
			changeImage(star, offImg);
		}
	}
}

function changeImage(img, newImageName) {
	var oldSrc = img.src;
	var dotPos = oldSrc.lastIndexOf('/');
	if (dotPos != -1) {
		img.src = oldSrc.substring(0, dotPos + 1) + newImageName;
	} else {
		img.src = newImageName;
	}
}
