/*
 * Dependencies:
 * Bunny.js
 * Bunny/Lib/AJAX.js
 * YAHOO.util.Event
 */

(function() // Story page scope.
{
	var util = YAHOO.util,
		lang = YAHOO.lang,
		Dom = util.Dom,
		Event = util.Event,
		ajaxer = Bunny.Lib.AJAX;

	var get = Dom.get,
		trim = lang.trim,
		parseJSON = lang.JSON.parse,
		hasClass = Dom.hasClass,
		addClass = Dom.addClass,
		removeClass = Dom.removeClass,
		getElementsByClassName = Dom.getElementsByClassName,
		getRegion = Dom.getRegion,
		getStyle = Dom.getStyle,
		setStyle = Dom.setStyle;
	function gaTrack(path)
	{
		// By the time this function gets invoked, pageTracker should be available already.
		if (typeof (pageTracker) !== "undefined") {
			pageTracker._trackPageview(path);
		}
	}

	(function() // Panel scope.
	{
		var tab_container = get('article-tabs');

		if (!tab_container) {
			// Not found.
			return;
		}

		function handleComments()
		{
			getElementsByClassName(
				'comment-form',
				'form',
				document,
				function(form)
				{
					var lagomorph_id = form.elements['id'];
					var textarea = form.elements['comment'];
					var default_text = 'Add a comment';

					if (!trim(textarea.value)) {
						textarea.value = default_text;
					}

					Event.addFocusListener(
						textarea,
						function(e)
						{
							if (trim(textarea.value) === default_text) {
								textarea.value = '';
							}
						}
					);
					Event.addBlurListener(
						textarea,
						function(e)
						{
							if (!trim(textarea.value)) {
								textarea.value = default_text;
							}
						}
					);

					// Form submission event listener.
					if (Event.getListeners(form, 'submit')) { // null or object, object is truthy.
						// Already listening.
						return;
					}

					Event.addListener(
						form,
						'submit',
						function(e)
						{
							Event.preventDefault(e);

							var comment_value = textarea.value;

							if (!comment_value || (comment_value === default_text)) {
								return;
							}

							ajaxer.asyncRequest(
								{
									destination: '/comment',
									method: 'POST',
									data: 'id=' + lagomorph_id.value + '&content=' + comment_value,
									handler: function(r)
									{
										var response;

										try {
											response = parseJSON(r.responseText);
										} catch (e) {
											return;
										}

										getElementsByClassName(
											'comment-area',
											'div',
											document,
											function(container)
											{
												container.innerHTML = response.html;
												handleComments();
											}
										);

										getElementsByClassName(
											'comment-count',
											'span',
											document,
											function(element)
											{
												if (!response.error) {
													var count = Number(element.innerHTML) + 1;
													element.innerHTML = String(count);
												}
												handleComments();
											},
											this,
											true
										);if(changeAd){
										changeAd();}
										gaTrack('/comment/' + lagomorph_id.value);
									}
								}
							);
						}
					);
				},
				this,
				true
			);

			getElementsByClassName(
				'report-abuse',
				'a',
				document,
				function(link)
				{
					if (Event.getListeners(link, 'click')) { // null or object, object is truthy.
						// Already listening.
						return;
					}

					var url = link.href,
						extracted = url.match(/\/flag\/(\d+)/);

					if (!extracted || (extracted.length < 2)) {
						return;
					}

					Event.addListener(
						link,
						'click',
						function(e)
						{
							Event.preventDefault(e);

							ajaxer.asyncRequest(
								{
									destination: link.href,
									method: 'POST',
									data: 'id=' + String(extracted[1]),
									handler: function(r)
									{
										var result = r.responseText;

										if (!result) {
											return;
										}

										try {
											result = parseJSON(result);
										} catch (e) {
											return;
										}if(changeAd){
										changeAd();}
										gaTrack(link.href.substring((location.protocol + '://' + location.host).length -1));

										if (result.success) {
											link.parentNode.removeChild(link);
										}
									}
								}
							);
						}
					);
				},
				this,
				true
			);
		}

		function highlightTab(tab)
		{
			var tabs = getElementsByClassName('active', 'a', tab_container),
				current_tab;

			for (var i = 0, count = tabs.length; i < count; i++) {
				current_tab = tabs[i];
				removeClass(current_tab, 'active');
				removeClass(current_tab.parentNode, 'active');
			}

			addClass(tab, 'active');
			addClass(tab.parentNode, 'active');
		}

		// "View Comments" AJAX links click.
		getElementsByClassName(
			'view-comments',
			'a',
			document,
			function(link)
			{
				Event.addListener(
					link,
					'click',
					function(e)
					{
						Event.preventDefault(e);

						var comment_tab = get('comments');

						if (!comment_tab || hasClass(comment_tab, 'active')) {
							return;
						}

						ajaxer.asyncRequest(
							{
								destination: link.href + '.ajax',
								area: ['article-body'],
								handler: function(r)
								{
									highlightTab(comment_tab);
									handleComments();
									if(changeAd){
									changeAd();}
									gaTrack(link.href.substring((location.protocol + '://' + location.host).length -1));
								}
							}
						);
					}
				);
			},
			this,
			true
		);

		// AJAX tab click.
		Event.addListener(
			tab_container,
			'click',
			function(e)
			{
				Event.preventDefault(e);

				var target = Event.getTarget(e);

				if (
					(target.nodeType !== 1) ||
					(target.nodeName.toLowerCase() !== 'a') ||
					hasClass(target, 'active')
				   ) {
					// We only want to listen on inactive <a>s.
					return;
				}
				killSlideshow();
				ajaxer.asyncRequest(
					{
						destination: target.href + '.ajax',
						area: ['article-body', 'related-stories'], // Multi-update.
						handler: function(r)
						{
							highlightTab(target);
							if (target.id === 'comments') {
								handleComments();
							}
							if(target.id = 'slideshow'){
								setupSlideshow();								
							}
							if(typeof (changeAd) !== "undefined"){
							changeAd();}
							gaTrack(target.href.substring((location.protocol + '://' + location.host).length -1));
						},
						evaluate: true
					}
				);
			}
		);

		handleComments(); // Execute once upon full page load.
	})();


	(function() // Tools scope.
	{
		var share_links = getElementsByClassName('share_link', 'a', 'tools');

		for (var i = 0, count = share_links.length; i < count; i++) {
			Event.addListener(
				share_links[i],
				'click',
				function(e)
				{
					//Event.preventDefault(e);

					var tmp = this.id.split('-'),
						rating_id = tmp[1];

					ajaxer.asyncRequest(
						{
							destination: '/rate',
							method: 'POST',
							data: 'id=' + rating_id,
							handler: function(r)
							{
								var rating_data;

								try {
									rating_data = parseJSON(r.responseText);
								} catch (e) {
									// Do nothing.
									return;
								}

								get('recommend-count').innerHTML = String(rating_data.recommend);
								if(changeAd){
								changeAd();}
								gaTrack('/rate/' + rating_id);
							}
						}
					);
				}
			);
		}
	})();

})();

