﻿/// <reference path="../../combo.js" />
/// <reference path="Global.js" />
/// <reference path="Search.js" />
/// <reference path="Rating.js" />
/// <reference path="WikiParser.js" />
/// <reference path="Edit.js" />

var Profile =
{
	Init: function()
	{
		if (!$('contributorDetails'))
			return;

		Profile.CurrentPages = [0, 0, 0];
		var groups = ['publishedSermon', 'draftSermon', 'deletedSermon'];
		for (var i in groups)
		{
			var group = $$('.' + groups[i]);
			if (group.length <= 2)
			{
				$D.batch(group, function(elRow)
				{
					$D.setStyle(elRow, 'display', 'none');
				});
			}
		}
		var nameContainer = $$('span#name > a', 'contributorInfo', true) || $$('span#name', 'contributorInfo', true);
		document.title = nameContainer != null ? nameContainer.innerHTML : 'Sermons.Logos.com';
	},
	CurrentPages: [0, 0, 0],
	CurrentRequest: null,
	SwapPage: function(oldRows, newRowsFragment)
	{
		var elParent = oldRows[0].parentNode;
		for (var i = 1; i < oldRows.length; i++)
		{
			if (!$D.hasClass(oldRows[i], 'listHeader') && !$D.hasClass(oldRows[i], 'listFooter'))
				elParent.removeChild(oldRows[i]);
		}
		elParent.insertBefore(newRowsFragment, oldRows[0].nextSibling);
	},
	UpdatePager: function(category, currentPage, pageCount)
	{
		var groups = ['publishedSermon', 'draftSermon', 'deletedSermon'];
		if (currentPage == 0)
			$D.setStyle($$('.' + groups[category] + ' .lastPage', 'contentBody', true), 'visibility', 'hidden');
		else
			$D.setStyle($$('.' + groups[category] + ' .lastPage', 'contentBody', true), 'visibility', 'visible');

		if (currentPage == pageCount - 1)
			$D.setStyle($$('.' + groups[category] + ' .nextPage', 'contentBody', true), 'visibility', 'hidden');
		else
			$D.setStyle($$('.' + groups[category] + ' .nextPage', 'contentBody', true), 'visibility', 'visible');

		Profile.CurrentPages[category] = currentPage;
		var elLinks = $$('.' + groups[category] + ' .pageLink');
		var numLinks = elLinks.length;
		var linkPadding = Math.floor(numLinks / 2);
		var startPage, endPage;
		if (pageCount - currentPage <= linkPadding)
		{
			startPage = Math.max(0, pageCount - numLinks);
			endPage = pageCount;
		}
		else
		{
			startPage = Math.max(0, currentPage - linkPadding);
			endPage = startPage + numLinks;
		}

		for (var i in elLinks)
		{
			var j = parseInt(i);
			if (j + startPage >= pageCount)
			{
				$D.setStyle(elLinks[i].parentNode, 'display', 'none');
			}
			else
			{
				$D.setStyle(elLinks[i].parentNode, 'display', pageCount == 1 ? 'none' : $D.getStyle($$('.' + groups[category] + ' .sermonListTitle', 'contentBody', true), 'display'));
				var displayCurrentPage = startPage + j + 1;
				var pageDifference = (startPage + j) - currentPage;
				if (startPage + j == currentPage)
				{
					elLinks[i].innerHTML = displayCurrentPage;
					$D.addClass(elLinks[i], 'currentPageLink');
				}
				else
				{
					$D.removeClass(elLinks[i], 'currentPageLink');
					elLinks[i].innerHTML = '<a onclick="Profile.PageCategory(' + category + ', ' + pageDifference + ');return false;" href="#">' + displayCurrentPage + '</a>';
				}
			}
		}
	},
	PageCategory: function(category, direction)
	{
		if (Profile.CurrentRequest != null)
			return;

		var groups = ['publishedSermon', 'draftSermon', 'deletedSermon'];
		var userID = $('userID').value;
		var url = '/profile/' + userID + '/' + category + '/' + (Profile.CurrentPages[category] + direction) + '.js';

		var callback = {
			success: function(o)
			{
				var viewData = YAHOO.lang.JSON.parse(o.responseText);
				var newPage = Profile.RenderCategoryPage(viewData);
				var oldPage = $$('.' + groups[viewData.State], 'contentBody', false);

				Profile.SwapPage(oldPage, newPage);
				Profile.UpdatePager(viewData.State, parseInt(viewData.PageNumber), parseInt(viewData.CategoryPageCount));
				Profile.CurrentRequest = null;
			},
			failure: function(o)
			{
				Logos.Chrome.InfoBar.Show("infoBar", "Sorry, there was an error processing your request. The development team has been notified of the problem.", true);
				Profile.CurrentRequest = null;
			}
		};

		Global.GAPageTracker._trackPageview(url);
		Profile.CurrentRequest = $C.asyncRequest('GET', url, callback, null);
	},

	RenderCategoryPage: function(page)
	{
		var categories = ['publishedSermon', 'draftSermon', 'deletedSermon'];
		var renderedCategory = document.createDocumentFragment();
		var table = document.createElement('table');
		for (var i in page.Sermons)
		{
			var elNewRow = document.createElement('tr');
			table.appendChild(elNewRow);
			$D.addClass(elNewRow, categories[page.Sermons[i].State]);
			elNewRow.onmouseover = function() { $D.addClass(this, "highlighted"); };
			elNewRow.onmouseout = function() { $D.removeClass(this, "highlighted"); };

			var elTitleCell = document.createElement('td');
			elTitleCell.innerHTML = '<a href="/submissions/' + page.Sermons[i].SermonID + '" onclick="Global.UpdateSermon(' + page.Sermons[i].SermonID + ');return false;" title="' + Global.HtmlEncode(page.Sermons[i].Preview) + '">' + Global.HtmlEncode(page.Sermons[i].Title) + '</a>';
			elNewRow.appendChild(elTitleCell);

			var elDateCell = document.createElement('td');
			elDateCell.innerHTML = page.Sermons[i].RenderedDateCreated;
			$D.addClass(elDateCell, 'sermonDate');
			elNewRow.appendChild(elDateCell);

			var elTypeCell = document.createElement('td');
			elTypeCell.title = page.Sermons[i].IsIllustration ? "Illustration" : "Sermon";
			elTypeCell.innerHTML = '<img src="/Content/Images/' + (page.Sermons[i].IsIllustration ? 'illustrationicon.png' : 'sermonicon.png') + '" />';
			elNewRow.appendChild(elTypeCell);

			var elRatingCell = document.createElement('td');
			$D.addClass(elRatingCell, 'rating');
			var ratingContent = '<div title="' + (page.Sermons[i].RatingCount == 0 ? 'This sermon has not been rated' : ('Rated ' + page.Sermons[i].AverageRating.toString() + '/5.0' + ' by ' + page.Sermons[i].RatingCount + (page.Sermons[i].RatingCount == 1 ? ' user' : ' users'))) + '">';
			for (var j = 1; j < 6; j++)
				ratingContent += '<div class="' + (j <= Math.round(page.Sermons[i].AverageRating) ? 'star on' : 'star') + '"> </div>';
			elRatingCell.innerHTML = ratingContent + '</div>';
			elNewRow.appendChild(elRatingCell);

			if (page.AuthorizedUser)
			{
				var elControlsCell = document.createElement('td');
				elControlsCell.id = page.Sermons[i].SermonID + 'controls';
				var controlsContent;
				if (page.Sermons[i].State != 2)
					controlsContent = '<a href="/#content=/edit/' + page.Sermons[i].SermonID + '" onclick="Edit.UpdateSermon(' + page.Sermons[i].SermonID + ');return false;" title="Make changes to this sermon">edit</a>&nbsp;|&nbsp;<a href="#" onclick="Edit.ChangeState(' + page.Sermons[i].SermonID + ', ' + page.Sermons[i].AuthorUserId + ', ' + page.Sermons[i].State + ', 2);return false;" title="Move this sermon to \'deleted\' (click \'restore\' to undo)">delete</a>';
				else
					controlsContent = '<a href="#" onclick="Edit.ChangeState(' + page.Sermons[i].SermonID + ', ' + page.Sermons[i].AuthorUserId + ', 2, 1);return false;" title="Restore this sermon to \'draft\'">restore</a>';
				elControlsCell.innerHTML = controlsContent;
				elNewRow.appendChild(elControlsCell);
			}

			var elFlagsCell = document.createElement('td');
			elFlagsCell.innerHTML = (page.Sermons[i].Flags == 0 ? '&nbsp;' : (page.Sermons[i].Flags == 2 ? '<img src="/Content/Images/hidden.png" title="This sermon has been hidden from public view by an administrator" />' : '<img src="/Content/Images/flag.png" title="This sermon has been flagged as inappropriate by another user" />'));
			$D.setStyle(elFlagsCell, 'width', '14px')
			elNewRow.appendChild(elFlagsCell);

			renderedCategory.appendChild(elNewRow);
		}

		return renderedCategory;
	},
	ShowContactPanel: function()
	{
		var nWidth = Math.min($D.getViewportWidth() - 30, 500);
		var nHeight = Math.min($D.getViewportHeight() - 30, 460);

		if (Profile.ContactPanel == null)
		{
			Profile.ContactPanel = new YAHOO.widget.Panel('contactPanel', { fixedcenter: true,
				constraintoviewport: true,
				draggable: false,
				width: nWidth + 'px',
				height: nHeight + 'px',
				underlay: 'none',
				modal: true,
				close: false
			});

			var success = Profile.ContactPanel.render();

			Profile.ContactPanel.resizeTo = function(panelWidth, panelHeight)
			{
				$D.setStyle(this.innerElement, 'width', panelWidth);
				$D.setStyle(this.innerElement, 'height', panelHeight);
				this.resizeBody(panelWidth, panelHeight);
			};

			Profile.ContactPanel.resizeBody = function(panelWidth, panelHeight)
			{
				// QUIRKS FLAG, FOR BOX MODEL
				var IE_QUIRKS = (YAHOO.env.ua.ie && document.compatMode == 'BackCompat');

				// UNDERLAY/IFRAME SYNC REQUIRED
				var IE_SYNC = (YAHOO.env.ua.ie == 6 || (YAHOO.env.ua.ie == 7 && IE_QUIRKS));

				// PADDING USED FOR BODY ELEMENT (Hardcoded for example)
				var PANEL_BODY_PADDING = (10 * 2) // 10px top/bottom padding applied to Panel body element. The top/bottom border width is 0

				// TODO: width?

				var headerHeight = this.header ? this.header.offsetHeight : 0; // Content + Padding + Border
				var footerHeight = this.footer ? this.footer.offsetHeight : 0; // Content + Padding + Border

				var bodyHeight = (panelHeight - headerHeight - footerHeight);
				var bodyContentHeight = (IE_QUIRKS) ? bodyHeight : bodyHeight - PANEL_BODY_PADDING;

				$D.setStyle(this.body, 'height', bodyContentHeight + 'px');

				this.sizeUnderlay();
				if (IE_SYNC)
				{
					// Syncing the iframe can be expensive. Disable iframe if you
					// don't need it.
					this.syncIframe();
				}
			};
		}

		Profile.ContactPanel.resizeTo(nWidth, nHeight);
		Profile.ContactPanel.center();
		Profile.ContactPanel.showMask();
		Profile.ContactPanel.show();
		$('contactSubject').focus();
	},

	CurrentRequest: null,
	SendMessage: function()
	{
		if (Profile.CurrentRequest != null)
			$C.abort(Profile.CurrentRequest);

		var sendTo = $('sendTo').value;
		var url = '/contact/' + sendTo;
		var data = ['subject=', encodeURIComponent($('contactSubject').value),
		'&body=', encodeURIComponent($('contactContent').value)].join('');

		$('contactUserMessage').innerHTML = '<img src="'+Global.ContentServerPath+'images/ajax-loader.gif" /> Sending...';

		var callback = {
			success: function(o)
			{
				Profile.ContactPanel.hide();
				$('contactUserMessage').innerHTML = '';
				$('contactSubject').value = '';
				$('contactContent').value = '';
			},
			failure: function(o)
			{
				$('contactUserMessage').innerHTML = 'Error. Please try again.';
			}
		};

		Global.GAPageTracker._trackPageview(url);
		Profile.CurrentRequest = $C.asyncRequest('POST', url, callback, data);
	},

	AddFavorite: function(userId)
	{
		var url = '/profile/addfavorite/' + userId;
		Global.NavigateTo(url, true);
	},

	RemoveFavorite: function(userId)
	{
		var url = '/profile/removefavorite/' + userId;
		Global.NavigateTo(url, true);
	},

	Report: function(userId)
	{
		var url = '/profile/report/' + userId + '.js';

		var callback = {
			success: function(o)
			{
				$('profileReport').innerHTML = 'Reported. Thank you.';
			},
			failure: function(o)
			{
				Logos.Chrome.InfoBar.Show("infoBar", "Sorry, there was an error processing your request. The development team has been notified of the problem.", true);
			}
		};

		Global.GAPageTracker._trackPageview(url);
		$C.asyncRequest('GET', url, callback, null);
	}
};