﻿function ConsumerVehicleReviews(rkey, reviewsPerPage, sortOrder, commentsUrl, homeUrl)
{
	this.__reviewKey = rkey;
	this.__reviewsPerPage = reviewsPerPage;
	this.__reviewsSortOrder = sortOrder;
	this.__reviewCommentsUrl = commentsUrl;
	this.__homeUrl = homeUrl;
	this.__articleHandlers = [];
	this.__reviewHandlers = [];
	this.__currentReviewPage = null;
	
	this.summaryBaseID = '';
	this.listBaseID = '';
	this.formBaseID = '';
	this.detailBaseID = '';
	
	if(typeof ConsumerVehicleReviews.__initialized == 'undefined')
	{
		ConsumerVehicleReviews.prototype.reviewAsJSON = function(style, comfort, handling, fueleconomy, dependability, overall) {
			var rev = new Object();
			rev.s = style;
			rev.c = comfort;
			rev.h = handling;
			rev.f = fueleconomy;
			rev.d = dependability;
			rev.o = overall;
			if (typeof JSON !== 'undefined')
				return JSON.stringify(rev);
			else
				return YAHOO.lang.JSON.stringify(rev);
		}

		ConsumerVehicleReviews.prototype.getReviewInfo = function(page)
		{
			var pg = (typeof page != 'number' ? 1 : page);
		
			var requestBatch = new RequestBatch();
			var articleKey = new ArticleKey(_cvr.__reviewKey);
			requestBatch.AddToRequest(articleKey);

			var reviewPage = new ReviewPage(articleKey, _cvr.__reviewsPerPage, pg, _cvr.__reviewsSortOrder);
			requestBatch.AddToRequest(reviewPage);

			var s_Key = new ArticleKey(_cvr.__reviewKey + '_s');
			requestBatch.AddToRequest(s_Key);
			
			var c_Key = new ArticleKey(_cvr.__reviewKey + '_c');
			requestBatch.AddToRequest(c_Key);
			
			var h_Key = new ArticleKey(_cvr.__reviewKey + '_h');
			requestBatch.AddToRequest(h_Key);
			
			var f_Key = new ArticleKey(_cvr.__reviewKey + '_f');
			requestBatch.AddToRequest(f_Key);
			
			var d_Key = new ArticleKey(_cvr.__reviewKey + '_d');
			requestBatch.AddToRequest(d_Key);
			
			var o_Key = new ArticleKey(_cvr.__reviewKey + '_o');
			requestBatch.AddToRequest(o_Key);

			var userKey = new UserKey(null);
			requestBatch.AddToRequest(userKey);

			requestBatch.BeginRequest(sitelife_process, _cvr.__processResponse);
		}
		
		ConsumerVehicleReviews.prototype.getReviewSummary = function()
		{
			var requestBatch = new RequestBatch();
			var articleKey = new ArticleKey(_cvr.__reviewKey);
			requestBatch.AddToRequest(articleKey);

			if (reviewsPerPage == 1)
			    var reviewPage = new ReviewPage(articleKey, 1, 1, 'TimeStampDescending');
            else
                var reviewPage = new ReviewPage(articleKey, 2, 1, 'TimeStampDescending');
			    
			requestBatch.AddToRequest(reviewPage);

			var s_Key = new ArticleKey(_cvr.__reviewKey + '_s');
			requestBatch.AddToRequest(s_Key);
			
			var c_Key = new ArticleKey(_cvr.__reviewKey + '_c');
			requestBatch.AddToRequest(c_Key);
			
			var h_Key = new ArticleKey(_cvr.__reviewKey + '_h');
			requestBatch.AddToRequest(h_Key);
			
			var f_Key = new ArticleKey(_cvr.__reviewKey + '_f');
			requestBatch.AddToRequest(f_Key);
			
			var d_Key = new ArticleKey(_cvr.__reviewKey + '_d');
			requestBatch.AddToRequest(d_Key);
			
			var o_Key = new ArticleKey(_cvr.__reviewKey + '_o');
			requestBatch.AddToRequest(o_Key);

			var userKey = new UserKey(null);
			requestBatch.AddToRequest(userKey);

			requestBatch.BeginRequest(sitelife_process, _cvr.__processResponse);
		}
		
		ConsumerVehicleReviews.prototype.pageReviews = function(page)
		{
			var requestBatch = new RequestBatch();
			var articleKey = new ArticleKey(_cvr.__reviewKey);

			var reviewPage = new ReviewPage(articleKey, _cvr.__reviewsPerPage, page, _cvr.__reviewsSortOrder);
			requestBatch.AddToRequest(reviewPage);
			
			requestBatch.BeginRequest(sitelife_process, _cvr.__processResponse);
		}
		
		ConsumerVehicleReviews.prototype.__processResponse = function(responseBatch)
		{
			var debug = null;
			for (var i = 0; i < responseBatch.Responses.length; i++)
			{
				var response = responseBatch.Responses[i];
		
				if (response.ReviewPage != null)
				{
					_cvr.__currentReviewPage = response.ReviewPage;
					if(_cvr.__reviewHandlers.length > 0)
						_cvr.__fireReviewHandlers(response.ReviewPage);
				}
				
				if (response.User != null && _cvr.userHandler != null)
					_cvr.userHandler(response.User);
					
				if (response.Article != null && _cvr.__fireArticleHandlers.length > 0)
					_cvr.__fireArticleHandlers(response.Article);
			}
		}
		
		ConsumerVehicleReviews.prototype.addReviewHandler = function(handler)
		{
			if(typeof handler != 'function') throw new Error('Handler must be a function or method');

			var index = _cvr.__reviewHandlers.length;
			_cvr.__reviewHandlers[index] = handler;
		}
		
		ConsumerVehicleReviews.prototype.__fireReviewHandlers = function(reviewPage)
		{
			for(var i = 0; i < _cvr.__reviewHandlers.length; i++)
			{
				_cvr.__reviewHandlers[i](reviewPage);
			}
		}
		
		ConsumerVehicleReviews.prototype.userHandler = function(user)
		{
		}
		
		ConsumerVehicleReviews.prototype.addArticleHandler = function(handler)
		{
			if(typeof handler != 'function') throw new Error('Handler must be a function or method');

			var index = _cvr.__articleHandlers.length;
			_cvr.__articleHandlers[index] = handler;
		}
		
		ConsumerVehicleReviews.prototype.__fireArticleHandlers = function(article)
		{
			for(var i = 0; i < _cvr.__articleHandlers.length; i++)
			{
				_cvr.__articleHandlers[i](article);
			}
		}
		
		ConsumerVehicleReviews.prototype.clearForm = function()
		{
			try
			{
				document.getElementById('RatingSummaryTitle').value = '';
				document.getElementById('RatingReview').value = '';
				document.getElementById('Styling').value = '';
				document.getElementById('Comfort').value = '';
				document.getElementById('Handling').value = '';
				document.getElementById('FuelEconomy').value = '';
				document.getElementById('Dependability').value = '';
				document.getElementById('Overall').value = '';
				document.getElementById('VehicleExperience').selectedIndex = 0;
				var radios = new Array();
				radios[0] = 'StylingRadio';
				radios[1] = 'ComfortRadio';
				radios[2] = 'HandlingRadio';
				radios[3] = 'FuelEconomyRadio';
				radios[4] = 'DependabilityRadio';
				radios[5] = 'OverallRadio';
				for (var q = 0; q < radios.length; q++)
				{
					for (var r = 1; r < 6; r++)
					{
						document.getElementById(radios[q]+r.toString()).checked = false;
					}
				}
			}
			catch (e){ }
		}
		
		ConsumerVehicleReviews.prototype.addReview = function ()
		{
			var title = document.getElementById('RatingSummaryTitle').value;
			var review = document.getElementById('RatingReview').value;
			var style = document.getElementById('Styling').value;
			var comfort = document.getElementById('Comfort').value;
			var handling = document.getElementById('Handling').value;
			var fueleconomy = document.getElementById('FuelEconomy').value;
			var dependability = document.getElementById('Dependability').value;
			var overall = document.getElementById('Overall').value;
			var experience = document.getElementById('VehicleExperience').options[document.getElementById('VehicleExperience').selectedIndex].value;
			if (title == null || title == '' || review == null || review == '')
			{
				alert('You must supply both a Title and Review text in order to submit a review.');
			}
			else
				_cvr.postReview(title, review, overall, style, comfort, handling, fueleconomy, dependability, overall, experience);
		}
		
		ConsumerVehicleReviews.prototype.postReview = function(title, review, rating, style, comfort, handling, fueleconomy, dependability, overall, experience)
		{
			var articleKey = new ArticleKey(_cvr.__reviewKey);
			var requestBatch = new RequestBatch();
			var pros = '{yearsOfExperience: ' + experience + '}';
			var cons = _cvr.reviewAsJSON(style, comfort, handling, fueleconomy, dependability, overall);
			
			var revO = overall;
			if(typeof revO == 'undefined' || revO == '')
				revO = 0;
			
			var homeUrl = Uri.resolveUrl(_cvr.__homeUrl).toString();
			var reviewAction = new ReviewAction(articleKey, homeUrl, document.title, title, revO, review, pros, cons);
			requestBatch.AddToRequest(reviewAction);
			
			var userKey = new UserKey(null);
			requestBatch.AddToRequest(userKey);
			
			var reviewPage = new ReviewPage(articleKey, _cvr.__reviewsPerPage, 1, _cvr.__reviewsSortOrder);
			requestBatch.AddToRequest(reviewPage);
			
			if(typeof style != 'undefined' && style != '')
			{
				var s_Key = new ArticleKey(_cvr.__reviewKey + '_s');
				var s_rateAction = new RateAction(s_Key, style);
				requestBatch.AddToRequest(s_Key);
				requestBatch.AddToRequest(s_rateAction);
			}

			if(typeof comfort != 'undefined' && comfort != '')
			{
				var c_Key = new ArticleKey(_cvr.__reviewKey + '_c');
				var c_rateAction = new RateAction(c_Key, comfort);
				requestBatch.AddToRequest(c_Key);
				requestBatch.AddToRequest(c_rateAction);
			}
			
			if(typeof handling != 'undefined' && handling != '')
			{
				var h_Key = new ArticleKey(_cvr.__reviewKey + '_h');
				var h_rateAction = new RateAction(h_Key, handling);
				requestBatch.AddToRequest(h_Key);
				requestBatch.AddToRequest(h_rateAction);
			}
			
			if(typeof fueleconomy != 'undefined' && fueleconomy != '')
			{
				var f_Key = new ArticleKey(_cvr.__reviewKey + '_f');
				var f_rateAction = new RateAction(f_Key, fueleconomy);
				requestBatch.AddToRequest(f_Key);
				requestBatch.AddToRequest(f_rateAction);
			}
			
			if(typeof dependability != 'undefined' && dependability != '')
			{
				var d_Key = new ArticleKey(_cvr.__reviewKey + '_d');
				var d_rateAction = new RateAction(d_Key, dependability);
				requestBatch.AddToRequest(d_Key);
				requestBatch.AddToRequest(d_rateAction);
			}
			
			if(typeof overall != 'undefined' && overall != '')
			{
				var o_Key = new ArticleKey(_cvr.__reviewKey + '_o');
				var o_rateAction = new RateAction(o_Key, overall);
				requestBatch.AddToRequest(o_Key);
				requestBatch.AddToRequest(o_rateAction);
			}

			_cvr.clearForm();

			requestBatch.BeginRequest(sitelife_process, _cvr.__processResponse);
			document.location = '#cvrListTop';
		}
		
		ConsumerVehicleReviews.prototype.recommendReview = function(key)
		{   
			var requestBatch = new RequestBatch();   
			var reviewKey = new ReviewKey(key);   
			var recommendAction = new RecommendAction(reviewKey);   
			requestBatch.AddToRequest(recommendAction);	
			requestBatch.BeginRequest(sitelife_process, _cvr.recommendationComplete);	
		}
		
		ConsumerVehicleReviews.prototype.recommendationComplete = function(responseBatch)
		{	}
		
		ConsumerVehicleReviews.prototype.reportAbuse = function(ctl, key, reason, description)
		{
			var requestBatch = new RequestBatch();
			var reviewKey = new ReviewKey(key);
			var abuseReport = new ReportAbuseAction(reviewKey, reason, description);
			requestBatch.AddToRequest(abuseReport);
			
			requestBatch.BeginRequest(sitelife_process, _cvr.abuseResported);
		}
		
		ConsumerVehicleReviews.prototype.abuseResported = function(responseBatch)
		{
		}
		

		ConsumerVehicleReviews.prototype.getReviewComments = function(index, reviewKey)
		{
			if(typeof _cvr.__reviewCommentsUrl == 'string'
				&& _cvr.__reviewCommentsUrl.length > 0
				&& _cvr.__currentReviewPage != null)
			{
				var u = new Uri(_cvr.__reviewCommentsUrl);
				var postto = u.resolvePath(u.toString());
				var review = null;
				if(index < _cvr.__currentReviewPage.Reviews.length)
					review = _cvr.__currentReviewPage.Reviews[index];
					
				if(review != null && review.ReviewKey.Key == reviewKey)
				{
					var form = document.createElement('form');
					form.name = 'form_' + reviewKey;
					form.id = 'form_' + reviewKey;
					form.action = postto;
					
					var inrev = document.createElement('input');
					inrev.name = 'review';
					inrev.type = 'hidden';
					if (typeof JSON !== 'undefined')
						inrev.value = escape(JSON.stringify(review));
					else
						inrev.value = escape(YAHOO.lang.JSON.stringify(review));
					form.appendChild(inrev);
					
					var inrevkey = document.createElement('input');
					inrevkey.name = 'reviewkey';
					inrevkey.type = 'hidden';
					inrevkey.value = reviewKey;
					form.appendChild(inrevkey);
										
					form.method = 'post';
					
					document.body.appendChild(form);
					
					form.submit();
				}
			}
		}
		
		ConsumerVehicleReviews.prototype.getPersonaUrl = function(userid)
		{
			if(typeof userid == 'undefined' || userid == 'anonymous')
				return;
		
			var result = new Uri('~/myVehix/mySummary.aspx');
			result.setQueryValue('uid', userid);
			return result.resolvePath(result.toString());
		}
		
		ConsumerVehicleReviews.prototype.loadReviewDetail = function()
		{
			if(_cvr.detailBaseID != '')
			{
				var detail = document.getElementById(_cvr.detailBaseID + '_ratingreview');
				if(detail != null)
				{
					var rev = document.getElementById(_cvr.detailBaseID + '_review');
					if(rev != null)
					{
						var r = eval('(' + rev.value + ')');
						detail.appendChild(_cvr.createReviewElements(r));
					}
				}
			}
		}

		ConsumerVehicleReviews.prototype.createReviewElements = function(review, index)
		{
			var key = review.ReviewKey.Key;
			var ratings = eval('(' + review.ReviewCons + ')');
			var by = review.Author;
		
			var ratingreview = document.createElement('div');
			ratingreview.className = 'cvrSummaryContainer containsFloats';
			
			var ratingsContainer = document.createElement('div');
			ratingsContainer.className = 'cvrRatingsContainer containsFloats';
			
			var ratingRow = function(titleText, val)
			{
				var row = document.createElement('div');
				row.className = 'cvrRatingRowSmall';
				
				var title = document.createElement('div');
				title.className = 'cvrRatingTitle';
				title.appendChild(document.createTextNode(titleText));
				row.appendChild(title);
				
				var stars = document.createElement('div');
				if(typeof val == 'undefined')
					stars.className = 'cvrUnrated';
				else
					stars.className = 'cvrStars_' + Math.floor(val);
				row.appendChild(stars);
				
				var num = document.createElement('div');
				num.className = 'cvrRatingValue';
				if(typeof val == 'undefined')
					num.appendChild(document.createTextNode('n/a'));
				else
					num.appendChild(document.createTextNode(val));
				row.appendChild(num);
				
				return row;
			}

			ratingsContainer.appendChild(ratingRow('Style:', ratings.s));
			ratingsContainer.appendChild(ratingRow('Comfort:', ratings.c));
			ratingsContainer.appendChild(ratingRow('Handling:', ratings.h));
			ratingsContainer.appendChild(ratingRow('Fuel Economy:', ratings.f));
			ratingsContainer.appendChild(ratingRow('Dependability:', ratings.d));
			ratingsContainer.appendChild(ratingRow('Overall Rating:', ratings.o));
			ratingreview.appendChild(ratingsContainer);

			var reviewContainer = document.createElement('div');
			reviewContainer.className = 'cvrReveiwsContainer';

			var reviewTitle = document.createElement('div');
			reviewTitle.className = 'cvrUserReviewTitle';
			reviewTitle.appendChild(document.createTextNode(review.ReviewTitle));
			reviewContainer.appendChild(reviewTitle);

			var purl = _cvr.getPersonaUrl(by.UserKey.Key);
			var reviewBy = document.createElement('div');
			reviewBy.className = 'cvrUserReviewPostedBy';
			if(typeof purl != 'string' || purl.length == 0)
				reviewBy.appendChild(document.createTextNode('by ' + by.DisplayName + (by.Location ? ' from ' + by.Location : '') + ' on ' + review.PostedAtTime));
			else
			{
				reviewBy.appendChild(document.createTextNode('by '));
				var userLink = document.createElement('a');
				userLink.setAttribute('href', purl);
				userLink.appendChild(document.createTextNode(by.DisplayName));
				reviewBy.appendChild(userLink);
				if (typeof by.Location == 'string' && by.Location.length > 0)
					reviewBy.appendChild(document.createTextNode(' from ' + by.Location));
				reviewBy.appendChild(document.createTextNode(' on ' + review.PostedAtTime));
			}
			reviewContainer.appendChild(reviewBy);

			var reviewBody = document.createElement('div');
			reviewBody.appendChild(document.createTextNode(review.ReviewBody));
			if (typeof index == 'number')
			{
				reviewBody.className = 'cvrReviewLimited';
				reviewBody.id = key + '_body';
			}
			else reviewBody.className = 'cvrReviewFull';
			reviewContainer.appendChild(reviewBody);

			var reviewActions = document.createElement('div');
			reviewActions.className = 'cvrReviewActions';

			var reviewRecommend = document.createElement('div');
			reviewRecommend.id = 'recommend:' + key;
			reviewRecommend.className = 'cvrRecommendedLinksFirst';
			
			if (review.CurrentUserHasRecommended == 'False')
			{
				var recommendLink = document.createElement('a');
				recommendLink.onclick = function(){return gSiteLife.PostRecommendation('Review', key, reviewRecommend.id, document.title);};
				recommendLink.href = 'javascript:void(0);';
				recommendLink.className = 'SiteLife_Recommend';
				recommendLink.appendChild(document.createTextNode('Recommend'));
				reviewRecommend.appendChild(recommendLink);
				reviewRecommend.appendChild(document.createTextNode(' (' + review.NumberOfRecommendations + ')'));
			}
			else
				reviewRecommend.appendChild(document.createTextNode('Recommended (' + review.NumberOfRecommendations + ')'));
				
			reviewActions.appendChild(reviewRecommend);				

//			if(typeof index == 'number')
//			{
//				var reviewComments = document.createElement('div');
//				reviewComments.className = 'cvrRecommendedLinks';
//				var commentsLink = document.createElement('a');
//				commentsLink.href = 'javascript:void(0);';
//				commentsLink.onclick = function(){_cvr.getReviewComments(index, key);};
//				commentsLink.appendChild(document.createTextNode('Comments'));
//				reviewComments.appendChild(commentsLink);
//				reviewActions.appendChild(reviewComments);
//			}

			var reviewAbuse = document.createElement('div');
			reviewAbuse.id = 'rpt_' + key;
			reviewAbuse.className = 'cvrRecommendedLinks';
			
			if (review.CurrentUserHasReportedAbuse == 'False')
			{
				var aspan = document.createElement('span');
				var abuseLink = document.createElement('a');
				abuseLink.id = key + '_RptAbuse';
//				abuseLink.onclick = function(){ShowReportAbuse(arguments[0], document.URL, gSiteLife.__baseUrl + '/AbuseReport/ReportAbuse?plckElementId=' + reviewAbuse.id + '&plckTargetKey=' + key + '&plckTargetKeyType=Review'); return false;}
				abuseLink.onclick = function()
				{
					_cvr.reportAbuse(arguments[0], key, 'Unknown', 'Unknown');
					aspan.replaceChild(document.createTextNode('Abuse Reported'), abuseLink);
				};
				abuseLink.href = 'javascript:void(0);';
				abuseLink.className = 'SiteLife_ReportAbuse';
				abuseLink.appendChild(document.createTextNode('Report Abuse'));
				aspan.appendChild(abuseLink);
				reviewAbuse.appendChild(aspan);
			}
			else
				reviewAbuse.appendChild(document.createTextNode('Abuse Reported'));
				
			reviewActions.appendChild(reviewAbuse);
			reviewContainer.appendChild(reviewActions);
			ratingreview.appendChild(reviewContainer);
			
			return ratingreview;
		}


		ConsumerVehicleReviews.__initialized = true;
	}
}
var _cvr = null;