AUI().ready('aui-io-request','liferay-portlet-url', function(A){

	if (Liferay.ThemeDisplay.isSignedIn()) {

		var portletsOnPage = document.getElementsByTagName("section");
	
		for (var i = 0; i < portletsOnPage.length; i++) {
			var portletId = portletsOnPage[i].getAttribute("id");

			if(portletId && portletId !== undefined){
				var classPK,className,favouriteCssClass,containerCssClass;

				if(isBlog(portletId)) {
					classPK = getClassPK(portletId, 'classPK');
					if(classPK > 0) {
						className = 'com.liferay.blogs.model.BlogsEntry';
						containerCssClass = "div.widget-mode-detail .widget-toolbar";
						favouriteCssClass = "a.blog";
						
						existFavourite(classPK, className, addFavouriteBlogHTML);
						delegateFavouriteContentEvent(containerCssClass, favouriteCssClass, classPK, className);
					}
				} else if(isDocumentLibrary(portletId)) {
					classPK = getClassPK(portletId, 'classPK');
					if(classPK > 0) {
						className = 'com.liferay.document.library.kernel.model.DLFileEntry';
						containerCssClass = "div.sidenav-content";
						favouriteCssClass = "a.dlFileEntry";
						
						existFavourite(classPK, className, addFavouriteDLFileEntryHTML);
						delegateFavouriteContentEvent(containerCssClass, favouriteCssClass, classPK, className);
					}
					
				} else if(isForum(portletId)) {
					classPK = $('a[id*="_com_liferay_message_boards_web_portlet_MBPortlet_message_"]').attr("id").split("_com_liferay_message_boards_web_portlet_MBPortlet_message_")[1]
					if(classPK > 0) {
						className = 'com.liferay.message.boards.model.MBMessage';
						containerCssClass = "div.card-col-content.card-col-gutters";
						favouriteCssClass = "a.forum";

						existFavourite(classPK, className, addFavouriteForumHTML);
						delegateFavouriteContentEvent(containerCssClass, favouriteCssClass, classPK, className);
					}
				} else if(isWiki(portletId)) {
					classPK = getClassPK(portletId, 'classPK');
					if(classPK > 0) {
						className = 'com.liferay.wiki.model.WikiPage';
						containerCssClass = "div.page-actions.top-actions";
						favouriteCssClass = "a.wiki";

						existFavourite(classPK, className , addFavouriteWikiHTML);
						delegateFavouriteContentEvent(containerCssClass, favouriteCssClass, classPK, className);
					}
				}
			}
		}
	}

	function getClassPK(portletId, classPKparameter){
		var namespacedPortletId = portletId.replace('portlet_', '');
		namespacedPortletId = $('input[name^="namespace"]').val();
		var classPKDiv = $('#' + namespacedPortletId + classPKparameter);
		if(classPKDiv && classPKDiv !== undefined){
			return $(classPKDiv).val();
		}else{
			return 0;
		}
	}
	
	function delegateFavouriteContentEvent(containerCssClass, favouriteCssClass, classPK, className){
		$(containerCssClass).delegate(favouriteCssClass + '.favourite', 'click',function(e){
			var textSelector = $(e.currentTarget).find("span.taglib-text");
			addFavourite(e.currentTarget, textSelector, classPK, className);
		});
		
		$(containerCssClass).delegate(favouriteCssClass + '.unfavourite', 'click',function(e){
			var textSelector = $(e.currentTarget).find("span.taglib-text");
			deleteFavourite(e.currentTarget, textSelector, classPK, className);
		});
	}

	function addFavourite(favouriteLinkSelector, textSelector, classPK, className){
		A.io.request(
			getResourceUrlAsString('/user_favourite/add'),
			{
				after: {
					success: function() {
						var result = this.get('responseData').success;
						if(result === 'true'){
							markAsUnFavourite(favouriteLinkSelector, textSelector);
						}
					}
				},
				data: getQueryData(classPK, className),
				dataType: 'JSON'
			}
		);
	}

	function deleteFavourite(favouriteLinkSelector, textSelector, classPK, className){
		A.io.request(
			getResourceUrlAsString('/user_favourite/delete'),
			{
				after: {
					success: function() {
						var result = this.get('responseData').success;
						if(result === 'true'){
							markAsFavourite(favouriteLinkSelector, textSelector);
						}
					}
				},
				data: getQueryData(classPK, className),
				dataType: 'JSON'
			}
		);
	}

	function existFavourite(classPK, className, callBackAddHtml){
		A.io.request(
			getResourceUrlAsString('/user_favourite/exist'),
			{
				after: {
					success: function() {
						var result = this.get('responseData').exist;
						var favouriteText,linkClass,iconFavouriteClass;
						
						if(result === 'true'){
							favouriteText = getUnfavouriteText();
							linkClass = getUnFavouriteClass();
							iconFavouriteClass = getIconFavouriteActiveClass();
						}else{
							favouriteText = getFavouriteText();
							linkClass = getFavouriteClass();
							iconFavouriteClass = getIconFavouriteClass();
						}
						callBackAddHtml(favouriteText, linkClass, iconFavouriteClass);
					}
				},
				data: getQueryData(classPK, className),
				dataType: 'JSON'
			}
		);
	}

	function addFavouriteBlogHTML(favouriteText, linkClass, iconFavouriteClass){
		var favouriteHtml = [
		'<div class="autofit-col">',
		'<div class="favourite">',
		'<div class="taglib-favourite" title="' + favouriteText + '">',
		'<a href="javascript:;" class=" lfr-icon-item taglib-icon blog ' + linkClass + '" id="">', 
		'<span class="">', 
		'<span class="' + iconFavouriteClass + '">&nbsp;</span>',
		'<span class="taglib-text ">' + favouriteText + '</span>', 
		'</a>',
		'</span>', 
		'</div>',
		'</div>',
		'</div>'].join("\n");	

		$('.widget-mode-detail .widget-toolbar').prepend(favouriteHtml);
	}

	function addFavouriteDLFileEntryHTML(favouriteText, linkClass, iconFavouriteClass){
		var favouriteHtml = [
		'<div class="pb-3"><span class="favourite">',
		'<a href="javascript:;" class=" lfr-icon-item taglib-icon dlFileEntry ' + linkClass + '" id="">',
		'<span class="' + iconFavouriteClass + '">&nbsp;</span>',
		'<span class="taglib-text ">' + favouriteText + '</span>', 
		'</a>',
		'</span></div>'].join("\n");	
		
		$('.sidenav-content').prepend(favouriteHtml);
	}

	function addFavouriteForumHTML(favouriteText, linkClass, iconFavouriteClass){
		var favouriteHtml = [
 		'<a href="javascript:;" class=" lfr-icon-item taglib-icon forum ' + linkClass + '" id="" role="menuitem">', 
		'<span class="' + iconFavouriteClass + '">&nbsp;</span>',
		'<span class="taglib-text ">' + favouriteText+ '</span>',
		'</a>'
		].join("\n");
		
		$(favouriteHtml).insertBefore('.social-interaction');
	}

	function addFavouriteWikiHTML(favouriteText, linkClass, iconFavouriteClass){
		var linkClass = 'lfr-icon-item taglib-icon wiki ' + linkClass;

		var favouriteHtml = [
			'<span class="">',
			'<a href="javascript:;" class=" ' + linkClass + '" id="">', 
			'<span class="' + iconFavouriteClass + '">&nbsp;</span>',
			'<span class="taglib-text ">' + favouriteText + '</span>', 
			'</a>',
			'</span>'].join("\n");

		$('div.page-actions.top-actions').prepend(favouriteHtml);
	}

	function isBlog(portletId){
		return portletId.indexOf('com_liferay_blogs_web_portlet_BlogsPortlet') >= 0;
	}

	function isDocumentLibrary(portletId){
		return portletId.indexOf('com_liferay_document_library_web_portlet_DLPortlet') >= 0;
	}

	function isForum(portletId){
		return portletId.indexOf('com_liferay_message_boards_web_portlet_MBPortlet') >= 0;
	}

	function isWiki(portletId){
		return portletId.indexOf('com_liferay_wiki_web_portlet_WikiPortlet') >= 0;
	}

	function markAsUnFavourite(selector, textSelector){
		$(selector).removeClass(getFavouriteClass()).addClass(getUnFavouriteClass());
		$(textSelector).text(getUnfavouriteText());
		$('span.' + getIconFavouriteClass()).removeClass(getIconFavouriteClass()).addClass(getIconFavouriteActiveClass());
	}

	function markAsFavourite(selector, textSelector){
		$(selector).removeClass(getUnFavouriteClass()).addClass(getFavouriteClass());
		$(textSelector).text(getFavouriteText());
		$('span.' + getIconFavouriteActiveClass()).removeClass(getIconFavouriteActiveClass()).addClass(getIconFavouriteClass());
	}

	function getQueryData(classPK, className ){
		return '_com_placecube_digitalplace_communities_user_favourite_portlet_UserFavouritePortlet_classPK=' + classPK + "&_com_placecube_digitalplace_communities_user_favourite_portlet_UserFavouritePortlet_className=" + className;
	}

	function getResourceUrlAsString(resourceId){
		var resourceURL = Liferay.PortletURL.createResourceURL();
		resourceURL.setParameter("p_p_id", "com_placecube_digitalplace_communities_user_favourite_portlet_UserFavouritePortlet");
		resourceURL.setResourceId(resourceId);
		return resourceURL.toString();
	}

	function getUnfavouriteText(){
		return 'Remove\x20from\x20favourites';
	}

	function getFavouriteText(){
		return 'Add\x20to\x20favourites';
	}

	function getFavouriteClass(){
		return 'favourite';
	}

	function getUnFavouriteClass(){
		return 'unfavourite';
	}

	function getIconFavouriteClass(){
		return 'icon-favourite';
	}

	function getIconFavouriteActiveClass(){
		return 'icon-favourite-active';
	}
});
