﻿/// <reference path="../../combo.js" />
/// <reference path="Global.js" />
/// <reference path="Profile.js" />
/// <reference path="Search.js" />
/// <reference path="Rating.js" />
/// <reference path="WikiParser.js" />

var Edit =
{
	Scrolling: false,
	CurrentRequest: null,
	EditTimer: null,
	ScrollTimer: null,
	Init: function()
	{
		var elText = new $('txtEditSermon');
		var elPreview = new $('sermonPreview');

		if (elText.value == null || elPreview == null)
			return;

		document.title = 'Editing "' + $('sermonTitle').innerHTML + '"';

		$E.on(elText, 'scroll', function()
		{
			Edit.ScrollContent(elText, elPreview);
		});
		$E.on(elPreview, 'scroll', function()
		{
			Edit.ScrollContent(elPreview, elText);
		});

		// Safari does not fire the scroll event for textareas, so we must set an interval
		if (/safari/gi.test(navigator.appVersion) || /safari/gi.test(navigator.userAgent) || window.opera)
		{
			Edit.ScrollTimer = setInterval(function()
			{
				if ($('sermonPreview') == null)
				{
					clearInterval(Edit.ScrollTimer);
					return;
				}
				Edit.ScrollContent(elText, elPreview);
			}, 50);
		}

		$E.on(elText, 'keyup', function()
		{
			clearTimeout(Edit.EditTimer);
			Edit.EditTimer = setTimeout("Edit.FormatSermon(Global.HtmlEncode($('txtEditSermon').value))", 100);
		});

		var elTxtTitle = $('txtSermonTitle');
		$E.on(elTxtTitle, 'keyup', function()
		{
			$('sermonTitle').innerHTML = Global.HtmlEncode(elTxtTitle.value);
		});

		var elTxtPassages = $('txtSermonPassages');
		$E.on($('txtSermonPassages'), 'keyup', function()
		{
			$('sermonPassages').innerHTML = Global.HtmlEncode(elTxtPassages.value);
			Logos.ReferenceTagging.lbsTraverseDom($('sermonPassages'));
		});

		if ($('sermonTypeHolder') !== null && $('sermonTypeHolder').value == 'Illustration')
			$('sermonTypeIllustration').checked = true;
		else
			$('sermonTypeSermon').checked = true;

		Logos.ReferenceTagging.lbsTraverseDom($('sermonPassages'));
	},

	ShowFormattingHelp: function()
	{
		var nWidth = Math.min($D.getViewportWidth() - 30, 600);
		var nHeight = Math.min($D.getViewportHeight() - 30, 600);

		if (Edit.FormattingHelpPanel == null)
		{
			Edit.FormattingHelpPanel = new YAHOO.widget.Panel('formattingHelpPanel', { fixedcenter: true,
				constraintoviewport: true,
				draggable: true,
				width: nWidth + 'px',
				height: nHeight + 'px',
				underlay: 'none'
			});
			var success = Edit.FormattingHelpPanel.render();

			Edit.FormattingHelpPanel.resizeTo = function(panelWidth, panelHeight)
			{
				$D.setStyle(this.innerElement, 'width', panelWidth);
				$D.setStyle(this.innerElement, 'height', panelHeight);
				this.resizeBody(panelWidth, panelHeight);
			};

			Edit.FormattingHelpPanel.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();
				}
			};
		}

		Edit.FormattingHelpPanel.setHeader('Formatting Sermons');
		Edit.FormattingHelpPanel.setBody($('helpContent').innerHTML);

		Edit.FormattingHelpPanel.resizeTo(nWidth, nHeight);
		Edit.FormattingHelpPanel.center();
		Edit.FormattingHelpPanel.show();
	},

	UpdateSermon: function(id)
	{
		var sRequestUrl = id == null ? '/create' : '/edit/' + id;
		Global.BrowseTo(sRequestUrl);
	},

	ScrollContent: function(elFirst, elSecond)
	{
		if (Edit.Scrolling)
		{
			Edit.Scrolling = false;
		}
		else
		{
			var height = parseInt($D.getStyle(elFirst, 'height'));
			var scroll = Math.floor((elFirst.scrollTop * (elSecond.scrollHeight - height)) / (elFirst.scrollHeight - height));

			Edit.Scrolling = true;
			elSecond.scrollTop = scroll;
		}
	},

	FormatSermon: function(wikiSermon)
	{
		if (!wikiSermon || wikiSermon.length == 0)
			return;

		$('sermonContent').innerHTML = Edit.FormatString(wikiSermon);
		if ($('txtEditSermon') != null)
			Logos.ReferenceTagging.lbsTraverseDom($('sermonContent'));
		else
			Logos.ReferenceTagging.tag($('sermonContent'));

		Logos.ReferenceTagging.lbsTraverseDom($('sermonPassages'));
	},

	FormatString: function(wikiText)
	{
		if (!wikiText || wikiText.length == 0)
			return;

		var astrContent = [];
		var objParser = new SermonFileWikiParser('en');
		var objWriter = new HTMLSermonFileWriter(astrContent);
		objParser.ParseText(wikiText, objWriter);

		return astrContent.join('');
	},

	ChangeState: function(sermonId, authorId, fromState, toState)
	{
		if (Profile.CurrentRequest != null)
			return;

		if (sermonId > 0)
		{
			var elCell = $(sermonId + 'controls');
			var oldControls = elCell.innerHTML;
			elCell.innerHTML = '<img src="'+Global.ContentServerPath+'images/ajax-loader.gif"/>';
		}
		var groups = ['publishedSermon', 'draftSermon', 'deletedSermon'];

		if (Profile.CurrentPages[fromState] > 0 && $$('.' + groups[fromState], 'contentBody', false).length <= 3)
			Profile.CurrentPages[fromState]--;

		var url = '/edit/' + sermonId + '/' + fromState + '/' + toState + '?authorUserId=' + authorId + '&retrieveUpdatedList=true&fromStatePageNumber=' + Profile.CurrentPages[fromState] + '&toStatePageNumber=' + Profile.CurrentPages[toState];
		var callback = {
			success: function(o)
			{
				var viewData = YAHOO.lang.JSON.parse(o.responseText);
				var fromFragment = Profile.RenderCategoryPage(viewData[0]);
				var toFragment = Profile.RenderCategoryPage(viewData[1]);

				var oldFromRows = $$('.' + groups[viewData[0].State], 'contentBody', false);
				var oldToRows = $$('.' + groups[viewData[1].State], 'contentBody', false);
				var elParent = oldFromRows[0].parentNode;

				Profile.SwapPage(oldFromRows, fromFragment);
				Profile.SwapPage(oldToRows, toFragment);
				Profile.UpdatePager(viewData[0].State, viewData[0].PageNumber, viewData[0].CategoryPageCount);
				Profile.UpdatePager(viewData[1].State, viewData[1].PageNumber, viewData[1].CategoryPageCount);

				var elFromStateCount = $$('.sermonListCount', oldFromRows[0], true);
				elFromStateCount.innerHTML = viewData[0].CategorySermonCount + (viewData[0].CategorySermonCount == 1 ? ' item' : ' items');
				var elToStateCount = $$('.sermonListCount', oldToRows[0], true);
				elToStateCount.innerHTML = viewData[1].CategorySermonCount + (viewData[1].CategorySermonCount == 1 ? ' item' : ' items');

				var visibleDisplay = $D.getStyle(oldFromRows[0], 'display');

				for (var i in groups)
				{
					var display = visibleDisplay;
					var group = $$('.' + groups[i]);
					if (group.length <= 2)
						display = 'none';

					$D.batch(group, function(elRow)
					{
						$D.setStyle(elRow, 'display', display);
					});
				}
				Profile.CurrentRequest = null;
			},
			failure: function(o)
			{
				if (sermonId > 0)
					elCell.innerHTML = oldControls;

				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;
			}
		};

		Profile.CurrentRequest = $C.asyncRequest('POST', url, callback, null);
	},

	ChangeFlags: function(sermonId, toFlag, message, elUserMessage, successCallback)
	{
		var url = '/flag/' + sermonId + '/' + toFlag + '.js';
		if (message != null && message != '')
			url += '?message=' + encodeURIComponent(message);

		if (elUserMessage != null)
			elUserMessage.innerHTML = '<img src="'+Global.ContentServerPath+'images/ajax-loader.gif" /> Sending...';

		Global.GAPageTracker._trackPageview(url);
		$C.asyncRequest('POST', url,
		{
			success: function(o)
			{
				var viewData = YAHOO.lang.JSON.parse(o.responseText);

				for (var i in viewData)
					$(viewData[i].Key).innerHTML = viewData[i].Value;

				if (successCallback)
					successCallback();
			},
			failure: function(o)
			{
				if (elUserMessage != null);
				elUserMessage.innerHTML = 'Error. Please try again.';
			}
		});
	},

	SubmitSermon: function(id)
	{
		if (Edit.CurrentRequest != null)
			return;

		var url = '/submit';
		var isIllustration = $('sermonTypeIllustration').checked == true ? 'true' : 'false';
		var data = ['&wikiSermon=', encodeURIComponent($('txtEditSermon').value),
		'&title=', encodeURIComponent($('txtSermonTitle').value),
		'&passages=', encodeURIComponent($('txtSermonPassages').value),
		'&topics=', encodeURIComponent($('txtSermonTopics').value),
		'&tags=', encodeURIComponent($('txtSermonTags').value),
		'&isIllustration=', isIllustration,
		'&language=', $('editLanguage').value,
		'&state=', $('sermonState').value,
		'&sermonID=', id].join('');

		Logos.Chrome.InfoBar.Show("infoBar", "Saving. Pease wait...", false);

		var callback = {
			success: function(o)
			{
				Logos.Chrome.InfoBar.Show("infoBar", "Your sermon was saved successfully.", false);
				Global.BrowseTo('previous');
				setTimeout(function()
				{
					Logos.Chrome.InfoBar.Dismiss();
				}, 5000);
				Edit.CurrentRequest = null;
			},
			failure: function(o)
			{
				Logos.Chrome.InfoBar.Show("infoBar", "Sorry, an error was encountered while saving your sermon. The development team has been notified of the problem.", true);
				Edit.CurrentRequest = null;
			}
		};

		Global.GAPageTracker._trackPageview(url);
		Edit.CurrentRequest = $C.asyncRequest('POST', url, callback, data);
	}
};