// Code for a dropdown menu that stores the favorite pages

/////////////////////////////////////////////////////
// CODE TO PROPERLY DISPLAY THE FAVORITES MENU //////
/////////////////////////////////////////////////////

// function that displays the favorites div if it is invisible, and
// hides it, if it is already visible. All three parameters require IDs
function displayExit(ExitDivId,elementToPositionUnder,aTagTab) {
	
	fixSaveandExitBug();
	
	var ExitMenu = document.getElementById(ExitDivId);
	var ExitMenuWidth = 0;
	ExitMenu.style.display = "block";
	ExitMenuWidth = ExitMenu.offsetWidth;
	ExitMenu.style.display = "none";
	var relatedATag = document.getElementById(aTagTab);
	if(getStyle(ExitMenu,'display') == 'none') {
		var relatedElement = document.getElementById(elementToPositionUnder);
		ExitMenu.style.left = (findPosX(relatedElement) - ( ExitMenuWidth - relatedATag.offsetWidth)) + "px";
		var finalTop = findPosY(relatedElement) + relatedElement.offsetHeight;
		ExitMenu.style.top = finalTop + "px";
		ExitMenu.style.display = 'block'
		relatedATag.className = "activeMenu";		
	}
	if(document.getElementById('EXIT_DROPDOWN').offsetHeight > 400) {
		document.getElementById('EXIT_DROPDOWN').style.height = "400px";
		document.getElementById('EXIT_DROPDOWN').style.overflow = "auto";
	}
}

function fixSaveandExitBug(){

		//Change Save & Exit Message
		var defaultExitMessageParent = document.getElementById("EXIT_DROPDOWN");
	
		if(defaultExitMessageParent){
	
			defaultExitMessageParent.removeChild(defaultExitMessageParent.firstChild);
			var p = document.createElement("p");
			p.innerHTML = "<a href='javascript:void(0);' class='FavoriteLink';>Click here to save your course progress.</a>";
			p.onclick = function(){p.innerHTML = "Your progress has been saved. You may now close this window."};
			defaultExitMessageParent.appendChild(p);

	}
}


function displayFavorites(favoritesDivId,elementToPositionUnder,aTagTab) {
	var favoritesMenu = document.getElementById(favoritesDivId);
	var favoritesMenuWidth = 0;
	favoritesMenu.style.display = "block";
	favoritesMenuWidth = favoritesMenu.offsetWidth;
	favoritesMenu.style.display = "none";
	var relatedATag = document.getElementById(aTagTab);
	if(getStyle(favoritesMenu,'display') == 'none') {
		var relatedElement = document.getElementById(elementToPositionUnder);
		favoritesMenu.style.left = (findPosX(relatedElement) - ( favoritesMenuWidth - relatedATag.offsetWidth)) + "px";
		var finalTop = findPosY(relatedElement) + relatedElement.offsetHeight;
		favoritesMenu.style.top = finalTop + "px";
		favoritesMenu.style.display = 'block'
		relatedATag.className = "activeMenu";		
	}
	if(document.getElementById('FAVORITES_DROPDOWN').offsetHeight > 400) {
		document.getElementById('FAVORITES_DROPDOWN').style.height = "400px";
		document.getElementById('FAVORITES_DROPDOWN').style.overflow = "auto";
	}
}


function displayFeedback(feedbackDivId,elementToPositionUnder,aTagTab) {
	var feedbackMenu = document.getElementById(feedbackDivId);
	var feedbackMenuWidth = 0;
	feedbackMenu.style.display = "block";
	feedbackMenuWidth = feedbackMenu.offsetWidth;
	feedbackMenu.style.display = "none";
	var relatedATag = document.getElementById(aTagTab);
	if(getStyle(feedbackMenu,'display') == 'none') {
		var relatedElement = document.getElementById(elementToPositionUnder);
		feedbackMenu.style.left = (findPosX(relatedElement) - ( feedbackMenuWidth - relatedATag.offsetWidth)) + "px";
		var finalTop = findPosY(relatedElement) + relatedElement.offsetHeight;
		feedbackMenu.style.top = finalTop + "px";
		feedbackMenu.style.display = 'block'
		relatedATag.className = "activeMenu";
	}
	if(document.getElementById('FEEDBACK_DROPDOWN').offsetHeight > 400) {
		document.getElementById('FEEDBACK_DROPDOWN').style.height = "400px";
		document.getElementById('FEEDBACK_DROPDOWN').style.overflow = "auto";
	}
}

// hides the favorites menu on a rollout from the menu's div, as well as
// the associated <a> tag
function hideFavorites(myFavoritesDivId,myElementToPositionUnder) {
	 setTimeout("hideFavoritesHelper('" + myFavoritesDivId + "','" + myElementToPositionUnder + "')",20);
}


// helper function that actually closes the menu. Note, that if the mouse has
// not strayed beyond the bounds of the div by the time this is called, the
// menu will stay open. check my_utility_functions.js for the mouseLiesWithinElement
// function
function hideFavoritesHelper(favoritesDivId,elementToPositionUnder) {
	var favoritesMenu = document.getElementById(favoritesDivId);
	var relatedATag = document.getElementById(elementToPositionUnder);	
	if(!mouseLiesWithinElement(favoritesMenu) && !mouseLiesWithinElement(relatedATag)){
		relatedATag.className = "";
		favoritesMenu.style.display = 'none';
	}
}


///////////////////////////////////////////
// LOGIC CODE FOR THE FAVORITES MENU //////
///////////////////////////////////////////
// the record for a favorite spans all three arrays. you get the information
// for each using a subscript, ie.
// favorite 8 title = favoriteTitles[8]; etc.

var favoriteReferences = new Array ();
var favoriteTitles = new Array ();
var favoriteTopics = new Array ();
// var articleRead = new Array ();
var numFavorites = 0; // the number of favorites a user has bookmarked

var currentPageBookmarked = false;
var currTopicId = -1;
var currPageId = -1;

var topicKeys = new Array();
var headingKeys = new Array();
var favTags = new Object();
var favLinks = new Object();
var favIDs = new Object();


function clearArrays() {
	topicKeys = new Array();
	headingKeys = new Array();
	favTags = new Object();
	favLinks = new Object();
	favIDs =  new Object();
}

function arrayContains(arr,obj) {
	for (var i = 0; i < arr.length; i++) {
		if(arr[i] == obj) { return true; }
	}
	return false;
}


function buildFavoriteTag(hPage) {
	if(currentPageBookmarked == false) { 
		if((parseInt(hPage.getTopic(),16)) == currTopicId && (parseInt(hPage.getPage(),16)) == currPageId) { 
			currentPageBookmarked = true;
		}
	}
	var thisPageTitle = hmmPageTitles[parseInt(hPage.getTopic(),16)][parseInt(hPage.getPage(),16)];
	var pageTitleArray = thisPageTitle.split(" - ");
	var pageLink = hmmPages[parseInt(hPage.getTopic(),16)][parseInt(hPage.getPage(),16)];
	var favLevel1 = pageTitleArray[pageTitleArray.length-3];
	
	if(!arrayContains(headingKeys,favLevel1)) {
		headingKeys.push(favLevel1);
		favTags[favLevel1] = new Array();
		favLinks[favLevel1] = new Array();
		favIDs[favLevel1] = new Array(); 
	}
	favTags[favLevel1].push(pageTitleArray[0]);
	favLinks[favLevel1].push(pageLink);
	favIDs[favLevel1].push(hPage.getTopic() + hPage.getPage());		
}

function fixSaveandExitBug(){

		//Change Save & Exit Message
		var defaultExitMessageParent = document.getElementById("EXIT_DROPDOWN");
	
		if(defaultExitMessageParent){
	
			defaultExitMessageParent.removeChild(defaultExitMessageParent.firstChild);
			var p = document.createElement("p");
			p.innerHTML = "<a href='javascript:void(0);' class='FavoriteLink';>Click here to save your course progress.</a>";
			p.onclick = function(){p.innerHTML = "Your progress has been saved. You may now close this window."};
			defaultExitMessageParent.appendChild(p);

	}
}


function getFavoritesMenu() {

	fixSaveandExitBug();
	
	currTopicId = pageInfo["topicID"];
	currPageId = pageInfo["pageID"];
	var elementToPopulate = document.getElementById('FAVORITES_DROPDOWN');
	for(var i = 0; i < hbspCookie.getNumFavorites(); i++) {
		var v = hbspCookie.getFavorite(i);
		if (parseInt(v.getTopic(),16) == currTopicId) {
			buildFavoriteTag(v);
		}
	}
	if(!currentPageBookmarked) {
		var addLink = document.createElement('a');
		addLink.className = "FavoriteLink";
		addLink.id = "addFavoriteLink";
		addLink.href = "#";
		addLink.onclick = clipLink;
		addLink.innerHTML = addMessage;
		elementToPopulate.appendChild(addLink);
	}
	numFavorites = hbspCookie.getNumFavorites();
	if(numFavorites > 0 ) {
			var clearLink = document.createElement('a');
			clearLink.className = "FavoriteLink";
			clearLink.id = "clearFavoritesLink";
			clearLink.onclick = clearFavoritesMenu;
			clearLink.innerHTML = clearMessage;
			clearLink.href = "#";
			elementToPopulate.appendChild(clearLink); 
	}
	var favlist = document.createElement('ul');
	favlist.id = 'FAV_LIST';
	elementToPopulate.appendChild(favlist);
	for(var i = 0; i < headingKeys.length; i++) {
		var favoriteTopicLi = document.createElement('li');
		var topicTag = document.createElement('span');
		topicTag.innerHTML = headingKeys[i];
		favoriteTopicLi.appendChild(topicTag);
		favlist.appendChild(favoriteTopicLi);
		var favoriteTopicUl = document.createElement('ul');
		favoriteTopicLi.appendChild(favoriteTopicUl);
		for(var j = 0; j < favTags[headingKeys[i]].length; j++) {
			var favorite = document.createElement('li');
			var favoriteTag = document.createElement('a');
			favoriteTag.style.display = 'inline';
			favoriteTag.href = favLinks[headingKeys[i]][j];
			favoriteTag.innerHTML = favTags[headingKeys[i]][j];
			favorite.appendChild(favoriteTag);
			favorite.innerHTML = favorite.innerHTML + "&nbsp;<span onclick=removeFavorite('"+favIDs[headingKeys[i]][j]+"')><a href='#' title='" + removeFav + "'>[delete]</a></span>";
			favoriteTopicUl.appendChild(favorite);
		}
	}
}

function buildFeedbackMenu() {
	var elementToPopulate = document.getElementById('FEEDBACK_DROPDOWN');
	var favlist = document.createElement('ul');
	fdbklist.id = 'FDBK_LIST';
	elementToPopulate.appendChild(fdbklist);
}

function addFastTrack() {
	var fastTrackDiv = document.getElementById("FAST_TRACK_LIST");
	var fastTrackItems = fastTrackDiv.getElementsByTagName("li");
	for (i=0;i< fastTrackItems.length;i++){
		var fastTrackAnchor = fastTrackItems[i].getElementsByTagName("a");
		var fastTrackURL = fastTrackAnchor[0].href;
		fastTrackURLParts = fastTrackURL.split("/");
		fastTrackLink = fastTrackURLParts[fastTrackURLParts.length - 1];
		pushLink(fastTrackLink);
	}
}

function clipLink() {
	currTopicId = pageInfo["topicID"];
	currPageId = pageInfo["pageID"];
	var pageToAdd = new hmmPage;
	pageToAdd.setTopic(decToHex(currTopicId));
	pageToAdd.setPage(decToHex(currPageId));
	hbspCookie.addFavorite(pageToAdd);
	var elementToPopulate = document.getElementById('FAVORITES_DROPDOWN');
	while(elementToPopulate.childNodes.length > 0) {
		elementToPopulate.removeChild(elementToPopulate.childNodes[0]);
	}
	clearArrays();
	getFavoritesMenu();
}

function pushLink(myPageId) {
	var pushPageInfo = grabLinkInfo(topicTitle,myPageId);
	linkTopicId = pushPageInfo["topicID"];
	linkPageId = pushPageInfo["pageID"];
	var pageToAdd = new hmmPage;
	pageToAdd.setTopic(decToHex(linkTopicId));
	pageToAdd.setPage(decToHex(linkPageId));
	hbspCookie.addFavorite(pageToAdd);
	var elementToPopulate = document.getElementById('FAVORITES_DROPDOWN');
	while(elementToPopulate.childNodes.length > 0) {
		elementToPopulate.removeChild(elementToPopulate.childNodes[0]);
	}
	clearArrays();
	getFavoritesMenu();
}


// wipes the favorites menu clean, removing all links
function clearFavoritesMenu() {
	var object=document.getElementById('FAVORITES_DROPDOWN');
	object.innerHTML = ""
	var addLink = document.createElement('a');
	addLink.className = "FavoriteLink";
	addLink.id = "addFavoriteLink";
	addLink.href = "#";
	addLink.onclick = clipLink;
	addLink.innerHTML = addMessage;
	object.appendChild(addLink);
	object.style.height = "auto";
	while(hbspCookie.getNumFavorites() > 0) {
		hbspCookie.removeFavorite(hbspCookie.getNumFavorites() - 1);
	}
}

function removeFavorite(strID) {
	var hPage = new hmmPage;
	hPage.setTopic(strID.substring(0,2));
	hPage.setPage(strID.substring(2));
	var index = hbspCookie.containsFavorite(hPage);
	if(index != -1) {
		hbspCookie.removeFavorite(index);
	}
	var elementToPopulate = document.getElementById('FAVORITES_DROPDOWN');
	while(elementToPopulate.childNodes.length > 0) {
		elementToPopulate.removeChild(elementToPopulate.childNodes[0]);
	}
	if (hbspCookie.getNumFavorites()==0){
		clearFavoritesMenu();
	}
	clearArrays();
	getFavoritesMenu();	
}





