/*
 *
 * Some useful display methods for sitelife data
 */

// Namespacing
var tm;
if (!tm) tm = {};
if (!tm.siteLife) tm.siteLife = {};


//=========================================
//	define public interface in the 'this' scope of script:
// vars remain private!
//=========================================
function display(){
	var doLog = true;

	//=======================================
	//			public interface
	//=======================================
	var uniqueId = 0;
	var getUniqueId = function(){
		return 'sitelife-'+(++uniqueId);
	}
	this.getUniqueId = getUniqueId;

    var getCookieVal = function (key) {
        var pos = document.cookie.indexOf( key + "=" );
        if( pos != -1 ) {
            var start = pos + key.length + 1;
            var end = document.cookie.indexOf(";", start);
            if( end == -1 ) end = document.cookie.length;
            var value = document.cookie.substring(start, end);
            return unescape(value);
        }
        return null;
    }
    var getAtCookieVal = function (key) {
        var atValue = getCookieVal("AT");
        if (atValue != null) {
            var pos = atValue.indexOf(key + "=");
            if( pos != -1 ) {
                var start = pos + key.length + 1;
                var end = atValue.indexOf("&", start);
                if( end == -1 ) end = atValue.length;
                var value = atValue.substring(start, end);
                return value;
            }
            return null;
        }
        return null;
    }
    this.getAtCookieVal = getAtCookieVal;

	var	displayCommentCount = function (article, elementId, showComments, countPrefix) {

		_displayLogger('debug', 'displayCommentCount()', article);

		// Article not registered with SiteLife
		if(article == null) {
			_displayLogger('error', 'article is not registered with SiteLife: cannot populate ' + elementId);
			return;
		}else {
            var commentCount = '';
			if(parseInt(article.Comments.NumberOfComments) == 0){
				if (countPrefix == '') {
                    commentCount = '';
                }
                else {
                    commentCount = 'Be the first to comment';
                }
			}else{
				commentCount = countPrefix + ' ('+article.Comments.NumberOfComments+')';
			}
            document.getElementById(elementId).innerHTML = document.getElementById(elementId).innerHTML + commentCount;

		}

	}
	this.displayCommentCount = displayCommentCount;

	var displayCommentRecommendCount = function (article, elementId, commentClass, recommendClass) {
		_displayLogger('debug', 'displayCommentRecommendCount()', article);
		var htmlToPopulate = '';
		// Article not registered with SiteLife
		if(article == null){
			var numOfComments = 0;
			var numOfRecommends = 0;
		}
		else {
			var numOfComments = parseInt(article.Comments.NumberOfComments);
            var numOfRecommends = parseInt(article.Recommendations.NumberOfRecommendations);

            htmlToPopulate = '<li';
            if (commentClass != '') {
                htmlToPopulate = htmlToPopulate + ' class="' + commentClass + '"';
            }
            htmlToPopulate = htmlToPopulate + '><a href="' + article.PageUrl + '"><img alt="" src="' + staticUrl + '/images/icons/comment.gif"/> ';

            if (numOfComments > 0) {
                htmlToPopulate = htmlToPopulate + '(' + numOfComments + ')';
            }

			htmlToPopulate = htmlToPopulate + '</a></li>';

			htmlToPopulate = htmlToPopulate + '<li';
            if (recommendClass != '') {
                htmlToPopulate = htmlToPopulate + ' class="' + recommendClass + '"';
            }
            htmlToPopulate = htmlToPopulate + '><a href="' + article.PageUrl + '"><img alt="" src="' + staticUrl + '/images/icons/thumbsup.gif"/> ';

            if (numOfRecommends > 0) {
                htmlToPopulate = htmlToPopulate + '(' + numOfRecommends + ')';
            }
			htmlToPopulate = htmlToPopulate + '</a></li>';
            $("#" + elementId).append(htmlToPopulate);
		}

	}
	this.displayCommentRecommendCount = displayCommentRecommendCount;

	var displayCommentCountNoRecommend = function(article, elementId) {
		_displayLogger('debug', 'displayCommentRecommendCountR25()', article);

		// Article not registered with SiteLife
		if(article != null){

			var numOfComments = article.Comments.NumberOfComments;
			if (numOfComments == 1) {
				var commentTerm = 'comment';
			}
			else {
				var commentTerm = 'comments';
			}
			var numOfRecommends = article.Recommendations.NumberOfRecommendations;

			var a1 = document.createElement('a');

			a1.setAttribute('href',article.PageUrl);

			if (numOfComments == 0) {
				a1.appendChild(document.createTextNode('Add a comment'));
			}else if(numOfComments == 1){
				a1.appendChild(document.createTextNode(article.Comments.NumberOfComments+' comment'));
			}
			else{
				a1.appendChild(document.createTextNode(article.Comments.NumberOfComments+' comments'));
			}

			document.getElementById(elementId).appendChild(a1);
		}
	}
	this.displayCommentCountNoRecommend = displayCommentCountNoRecommend;

	var displayMostPopular = function(mostPopularData, elementId, maxToDisplay, wrappingClass, wrappingItemClass, firstClass){

		_displayLogger('debug', mostPopularData);
        var htmlToPopulate = '';
        for (var i = 0; i < Math.min(mostPopularData.length, maxToDisplay); i++) {
            if (wrappingClass != '') {
                htmlToPopulate = htmlToPopulate + '<div class="' + wrappingClass + '">';
            }
            htmlToPopulate = htmlToPopulate + '<div class="' + wrappingItemClass;
            if (firstClass != '' && i==0) {
                htmlToPopulate = htmlToPopulate + ' ' + firstClass;
            }
            htmlToPopulate = htmlToPopulate + '">';
            htmlToPopulate = htmlToPopulate + '<a href="' + _entityToString(mostPopularData[i].PageUrl) + '">';
            htmlToPopulate = htmlToPopulate + (i+1).toString() + '. ';
            htmlToPopulate = htmlToPopulate + _entityToString(mostPopularData[i].PageTitle);
            htmlToPopulate = htmlToPopulate + '</a></div>';
            if (wrappingClass != '') {
                htmlToPopulate = htmlToPopulate + '</div>';
            }
        }
        $("#" + elementId).append(htmlToPopulate);

	}
	this.displayMostPopular = displayMostPopular;



	//====================================
	//			private helpers
	//====================================

	var _createListTab = function(articleList, articleCount, headlineDisplay, teaserDisplay){
		var box = document.createElement('div');
		box.setAttribute('class','Box');
		box.setAttribute('className','Box');
		var boxChild = document.createElement('div');

		box.appendChild(boxChild);

		boxChild.setAttribute('class', 'containerobj');
		boxChild.setAttribute('className', 'containerobj');

		var list = document.createElement('ol');

		boxChild.appendChild(list);

		var len = Math.min(articleList.length, articleCount);
		for(var i =0 ; i<len; i++){
			var article = articleList[i];
			var li = document.createElement('li');
			var h4 = document.createElement('h4');
			var a1 =  document.createElement('a');
			var a2 =  document.createElement('a');

			list.appendChild(li);

			li.appendChild(h4);
			h4.appendChild(a1);

			a1.setAttribute('href',article.PageUrl);

			a1.appendChild(document.createTextNode(_entityToString(headlineDisplay(article))));

			if(teaserDisplay != null){
				var a2 =  document.createElement('a');
				a2.setAttribute('href', article.PageUrl);
				a2.appendChild(document.createTextNode(_entityToString(teaserDisplay(article))));
				li.appendChild(a2);
			}

		}

		return box;

	}

	/*
	 *
	 *
	 */
	var _entityToString = function(stg){
		return stg.replace(/\&\#(\d+);/g, function(y,x) {return String.fromCharCode(x);});
	}

	//=========================================
	//				Logging
	//=========================================
	var _displayLogger = function(){};

	if(doLog && tm.siteLife.logger != null){
		 _displayLogger = function(level){
			tm.siteLife.logger.log(level, 'tm.siteLife.display', arguments);
		}
		_displayLogger('info', 'log enabled');
	}

	//=========================================
	//		Persona URL ReWriting
	//=======================================

	var _updateALink = function(link, username, removeParams) {
		if (link.href.match(/community\/profile/)) {
			if (!removeParams) {
				link.href = link.href.replace(
						/community\/profile/,
						'community/profile/' + username
					);
			} else {
				link.href = link.href.replace(
						/community\/profile.*/,
						'community/profile/' + username + '/'
					);
			}

			if (tm.siteLife.logger) {
				tm.siteLife.logger.log(
						'info',
						'updateProfileLinks',
						['','updated link' + '-> ' + link.innerHTML]
					);
			}
		}
	}

	var _updateProfileHeaderLinks = function() {
		var loginLinks = $('.Persona_LoginStatus')[0]
				.getElementsByTagName('A');
		var userName = loginLinks[0].innerHTML.replace(/<[^>]*>/g, '');
		if (!userName.match(/log.?in/i)) {
			for (var l = 0; l < loginLinks.length; l++) {
				_updateALink(loginLinks[l], userName);
			}
		}
	}

	var _updateContainerLinks = function( cName, userName) {
		var container = $(cName);
		if (container.length) {
			var personaMainLinks = container[0].getElementsByTagName('A');

			for (var l = 0; l < personaMainLinks.length; l++) {
				_updateALink(personaMainLinks[l], userName);
			}
		}
	}

	var _updateOtherUserLinks = function(containerClassName) {
		var friendsListLinks = $(containerClassName);
		if (friendsListLinks.length == 1) {
			friendsListLinks = friendsListLinks[0].getElementsByTagName('A');
			for (var l = 0; l < friendsListLinks.length; l++) {
				_updateALink(friendsListLinks[l], friendsListLinks[0].innerHTML.trim(), true);
			}
		}
	}

	var _updatePublicMessagesLinks = function(containerClassName) {
		var publicMessageTable = $(containerClassName);
		if (publicMessageTable.length) {
			var publicMessageRows = publicMessageTable[0].getElementsByTagName('TR');

			for (var r = 0; r < publicMessageRows.length; r++) {
				var imgN = 0;
				if (publicMessageRows[r].getElementsByTagName('IMG')[0].alt == 'Delete Item') {
					imgN ++;
				}
				userName = publicMessageRows[r].getElementsByTagName('IMG')[imgN].alt
					.replace(/ .*/, '');
				var links = publicMessageRows[r].getElementsByTagName('A');
				for (var l = 0; l < links.length; l++) {
					_updateALink( links[l], userName, true );
				}
			}
		}
	}


	var updateProfileLinks = function() {
		_updateProfileHeaderLinks();

		var userName = $('.PersonaHeader_Title')[0].innerHTML.replace(/'.*/, '').trim();

		_updateContainerLinks( '.PersonaHeader_Container', userName );
		_updateContainerLinks( '.PersonaTabs_Container', userName );
		_updateContainerLinks( '.Persona_2ColumnTable', userName );

		_updateOtherUserLinks('.Friends_List');
		_updateOtherUserLinks('.Reactions_Wrapper');

		_updatePublicMessagesLinks('.MessagePreview_Table');
		_updatePublicMessagesLinks('.Messages_MessageTable');

		if (tm.siteLife.logger) {
			tm.siteLife.logger.log(
					'info',
					'updatedProfileLinks',
					['','updated all profile links']
				);
		}
	}
	this.updateProfileLinks = updateProfileLinks;

    var setStaticUrl = function (url) {
        staticUrl = url;
    }
    this.setStaticUrl = setStaticUrl;

	//=========================================
	//		End display() definition
	//=======================================
}

tm.siteLife.display = new display();
