﻿function CometClient(handler, publicToken, privateToken, onmessage, ontimeout, oncancelled, onerror)
{
	this.lastMessageId = 0;
	this.publicToken = publicToken;
	this.privateToken = privateToken;
	this.handler = handler;
	this.onmessage = onmessage;
	this.ontimeout = ontimeout;
	this.oncancelled = oncancelled;
	this.onerror = onerror;
	this.running = true;
}

CometClient.prototype.stopWaiting = function()
{
	this.running = false;
}

CometClient.prototype.startWaiting = function()
{
	this.running = true;
	this.waitForMessages();
}

CometClient.prototype.waitForMessages = function()
{
	var me = this;
	//
	//  ok, call the server channel handler
	$.ajax(
    {
    	url: this.handler,
    	type: "POST",
    	timeout: 30000,
    	data: { privateToken: this.privateToken, publicToken: this.publicToken, lastMessageId: this.lastMessageId },
    	success: function(response)
    	{
    		var messages = $.evalJSON(response);
    		if (messages != null && messages.length > 0)
    		{
    			var keepWaiting = me.running;
    			for (var i = 0; i < messages.length; i++)
    			{
    				var message = messages[i];
    				if (me.lastMessageId < message.mid)
    					me.lastMessageId = message.mid;

    				switch (message.n.toLowerCase())
    				{
    					case "timedout":
    						//  dont worry
    						me.ontimeout();
    						break;
    					case "cancelled":
    						//  dont worry about it, we have been cancelled
    						//  so dont continue
    						keepWaiting = false;
    						me.oncancelled();
    						break;
    					case "message":
    						me.onmessage(message.c);
    						break;
    				}
    			}
    			if (keepWaiting)
    				me.waitForMessages();
    		}
    	},
    	error: function()
    	{
    		me.onerror();
    	}
    });
   }



var NewsFeed = {};



NewsFeed.getLikeText = function(totalLikes)
{
	if (totalLikes == 0)
	{
		return 'Be the first to like it';
	}
	else if (totalLikes == 1)
	{
		return totalLikes + ' person likes it';
	}
	else
	{
		return totalLikes + ' people like it';
	}
}

NewsFeed.insertNewsItem = function(newsItemToInsert)
{
	// Message received
	//document.getElementById("messages").innerHTML += message.f + ": " + message.m + "<br/>";
	var template = jQuery.trim($('.news-item-template').html());
	newsItemToInsert['TimeString'] = TimeHelper.CreateAgoStringForEpoch(newsItemToInsert['Time']);
	newsItemToInsert['ProductDisplay'] = newsItemToInsert['ProductName'] == null ? 'invisible' : '';
	var newsStoryHtml = String.fillWithArray(template, newsItemToInsert)
	var targetFeed = newsItemToInsert['Target'];
	var newsFeedSelector = "#news-feed-" + targetFeed + " UL";
	scrolling = (targetFeed == 0);
	NewsFeed.insertNewsItemHtml(newsFeedSelector, newsStoryHtml, scrolling);

	if (targetFeed != 0)
	{
		// Cache the HTML of the product's news feed
		productId = targetFeed;
		Products.news[productId] = $("#news-feed-" + productId).html();
	}
}

NewsFeed.onProductChanged = function(productInfo)
{
	// Message received
	var itemId = productInfo.ItemId;
	if (productInfo.Key == "TotalLikes")
	{
		var totalLikes = productInfo.Val;
		var likesText = NewsFeed.getLikeText(totalLikes);
		$(".product-" + itemId + "-likes-text").html(likesText);
	}
}

NewsFeed.onCliqueChanged = function(clique)
{
	$('.clique .users-count').html(clique.NumOfUsers);
	$('.clique .users').html('');
	for (i = 0; i < clique.Users.length; i++)
	{
		var user = clique.Users[i];
		$('.clique .users').append('<a href="javascript:void(0);" class="user-link"><img class="show-tooltip-2 user-image" title="|<b>'+user.FullName+'</b>|'+user.Relevance+'" src="'+user.SmallProfilePictureUrl+'" /></a>');
	}

	$(".clique-loading").hide();
	$(".clique").show();

	$('.show-tooltip-2').cluetip(
		{
			splitTitle: '|',
			showTitle: false,
			cluetipClass: 'jtip',
			width: '200px',
			topOffset: '15px',
			leftOffset: '0px',
			positionBy: 'bottomTop',
			cursor: 'normal'
		});
}


NewsFeed.insertNewsItemHtml = function(newsFeedSelector, newsStoryHtml, scrolling)
{
	if (NewsFeed.paused)
		return;

	var newsFeedElement = $(newsFeedSelector);
	var elements = newsFeedElement.children('li');
	var currentElement = elements[0];
	var itemHeight = 121;
	var numOfItems = 3;
	if (typeof (newsFeedElement.css("top")) == "undefined")
	{
		return;
	}
	var currentHeightPx = newsFeedElement.css("top").replace("px", "");

	if (scrolling)
	{
		if (elements.length > numOfItems)
		{
			newsFeedElement.children('li:last').remove();
		}
		$(newsStoryHtml).insertBefore(currentElement);
		newsFeedElement.css("top", (currentHeightPx - itemHeight) + "px");
		newsFeedElement.animate
		(
			{ top: 0 }, 800, "easeInQuart", function() { }
		);
	}
	else
	{
		$(newsStoryHtml).insertBefore(currentElement);
	}
}

NewsFeed.cometClient = null;

NewsFeed.paused = false;

NewsFeed.initialize = function(publicToken, privateToken)
{
	$(document).ready(function()
	{
		// Stop the old comet instance
		if (NewsFeed.cometClient != null)
		{
			NewsFeed.cometClient.stopWaiting();
			$('.news-feed-stories').html('<ul><li class="item"></li></ul>');
		}
		$('.news-feed-stories').hover(
		function()
		{
			NewsFeed.paused = true;
		},
		function()
		{
			NewsFeed.paused = false;
		});

		// Start a new comet instance
		NewsFeed.cometClient = new CometClient(
        "handlers/NewsChannelHandler.ashx",
        publicToken,
        privateToken,
        function(obj)
        {
        	var type = obj.__type;
        	if (type.indexOf("ClientNews:") === 0)
        	{
        		NewsFeed.insertNewsItem(obj);
        	}
        	else if (type.indexOf("ClientProductChanged:") === 0)
        	{
        		NewsFeed.onProductChanged(obj);
        	}
        	else if (type.indexOf("ClientCliqueChanged:") === 0)
        	{
        		NewsFeed.onCliqueChanged(obj);
        	}
        	else if (type.indexOf("ClientConnectionChanged:") === 0)
        	{
        		Facebook.onNotConnected();
        		alert("You have disconnected from Facebook, please use the 'Connect' button to connect again");
        	}
        	else
        	{
        		alert("Unknown Comet message type: " + type);
        	}
        },
        function()
        {
        	// Timeout. This is a valid thing which actually happens... System will reconnect.
        },
        function()
        {
        	//  Cancelled
        	if (confirm("There has been an cancellation in the news feed server, click OK to try to connect again"))
        	{
        		NewsFeed.cometClient.startWaiting();
        	}
        },
        function()
        {
        	//  Error
        	//if(confirm("There has been an error with the news feed server, click OK to try to connect again"))
        	{
        		NewsFeed.cometClient.startWaiting();
        	}
        });

		NewsFeed.cometClient.startWaiting();
	});
}
