
/** CONSTANTS AND CLASS DEFINITIONS - Start **/
var ML_COOKIE_NAME = "MyLinksCookie";
var ML_COOKIE_AGE = "30";
var ML_ROW_SPLITTER = "||";
var ML_COL_SPLITTER = ";;";

/* State constants to be used to indicate the current page type*/
var ML_CONTEXT_MAIN = "MAIN";
var ML_CONTEXT_ADD = "ADD";
var ML_CONTEXT_EDIT = "EDIT";
var ML_CONTEXT_RENAME = "RENAME";

var ML_YES = "y";
var ML_NO = "n";

var ML_LANG_ARR = new Array();
ML_LANG_ARR[0] = "en";
ML_LANG_ARR[1] = "fr";

/* Array to hold the default set of links */
var _arrDefaultLinks = new Array();
var _currentlang = "en";
var _arrCurrentLinks = new Array();
var _currentContext = "";

/* Message Codes */
var MSG_DUPLICATE_PAGE_TITLE = 1;
var MSG_MISSING_PAGE_TITLE = 2;

/* Class Link - represents an individual English or French link*/
//***TESTED***
function Link(){
	this.lang="";
	this.title="";
	this.url="";

	this.toString = function(){
		var stringVal = "";
		stringVal += this.lang;
		stringVal += ML_COL_SPLITTER + this.title;
		stringVal += ML_COL_SPLITTER + this.url;

		return stringVal;
	}
}

//***TESTED***
/* Class LinkInfo - represents a link - including its English and French versions*/
function LinkInfo(){
	this.index="";
	this.isDefault="";
	this.linkList= new Array();
	
	this.toString = function(){
		var stringVal = "";
		stringVal += this.index;		
		stringVal += ML_COL_SPLITTER + this.isDefault;

		for (j=0; j<this.linkList.length; j++){
			stringVal += ML_COL_SPLITTER + this.linkList[j].toString();			
		}

		return stringVal;
	}

	this.getLink = function(langCd){
		var listSize = this.linkList.length;

		for (k=0; k<listSize ; k++){
			if (this.linkList[k].lang == langCd){
				return this.linkList[k];
			}
		}
		return null;
	}
}


/* LinkInfo to hold the title, url of the current page (used by Add) */
var _currentPageInfo = new LinkInfo();

/* linkInfo to hold the selected link (used by Rename) */
var _selectedLinkInfo = new LinkInfo();

/** CONSTANTS AND CLASS DEFINITIONS - End **/


/** PAGE INIT CALLS  - Start **/

//***TESTED***
/* Init for the main My Links overlay */
function init_MLMain(){		

	//_arrDefaultLinks and _currentlang are assumed to have been populated already
	
	//Set _currentContext
	_currentContext = ML_CONTEXT_MAIN;

	//Perform common init activities
	init_Common();	

	setPageBodylang();
}

//***TESTED***
/* Init for Add pop-up */
function init_AddLink(){		
	
	//Set _currentContext
	_currentContext = ML_CONTEXT_ADD;

	//Perform common init activities
	init_Common();	

	//Get-Set the link to add (from Main)
	_currentPageInfo = getCurrentPageInfo();
	
	//Update Add display with title, url from _currentPageInfo for given lang
	if (_currentPageInfo){
		
		var objLinkUrlDiv = document.getElementById("addLink-url");
		var objLinkTitle = document.getElementById("addLink-title");
		
		if (objLinkUrlDiv && objLinkTitle){
			var link = _currentPageInfo.getLink(_currentLang);		
			objLinkUrlDiv.innerHTML = link.url;
			objLinkTitle.value = link.title;
		}
	}
	
}

//***TESTED***
/* Init for Edit pop-up */
function init_EditLink(){
	//Set _currentContext
	_currentContext = ML_CONTEXT_EDIT;

	//Perform common init activities
	init_Common();	
}


/* Init for Rename pop-up */
function init_RenameLink(){
	//Set _currentContext
	_currentContext = ML_CONTEXT_RENAME;

	//Perform common init activities
	init_Common();	

	//Get-Set the link to rename	
	var selectedLinks = getSelectedLinks();
	if (selectedLinks && selectedLinks.length>0){
		
		//Just consider the 1st link if multiple items are selected		
		_selectedLinkInfo = selectedLinks[0];
	}

	//Update display with title from _selectedLinkInfo for given lang
	if (_selectedLinkInfo){
		var selectedLink = _selectedLinkInfo.getLink(_currentLang);
		var objLinkTitle = document.getElementById("renameLink-title");

		if (objLinkTitle){			
			objLinkTitle.value = selectedLink.title;
		}
	}		
}

//***TESTED***
function init_Common(){

	//For contexts != ML_CONTEXT_MAIN
	if (_currentContext != ML_CONTEXT_MAIN){
		//Get-Set the default links
		_arrDefaultLinks = getDefaultLinks();
	
		//For context == ML_CONTEXT_MAIN, these are supposed to be constructed 
		//while building the HTML
	}	

	//Set the lang
	var objCurrLang = document.getElementById("myLinks-lang");
	if (objCurrLang)
		_currentLang = objCurrLang.value;
	
	//Get the current set of links and update display
	refreshMyLinks(false);
}

//Sets body class="en"/"fr" if no className sepcified
function setPageBodylang(){
	var objBody = document.getElementsByTagName("body")[0];
	if (objBody){
		if (objBody.className == "" && _currentLang != ""){
			objBody.className = _currentLang;
		}
	}
}


//***TESTED***
/**
 * Function to open the Rename pop-up
 */
function openRenamePopup(targetUrl){
	var arrSelectedLinkIndices = getSelectedLinkIndices();	

	if (arrSelectedLinkIndices && arrSelectedLinkIndices.length>0){
		var popPosTop = $('div.dashboard input[name="dashPosTop"]', opener.document).val();
		var popPosLeft = $('div.dashboard input[name="dashPosLeft"]', opener.document).val();
		Popup(targetUrl , 'rename', popPosTop, popPosLeft);
		return true;
	}else
		return false;
}

/** PAGE INIT CALLS  - End **/


/** ACTION CALLS  - Start **/

//***TESTED***
/**
 * Method to add a given link to My Links
 **/
function addLink(){	
	
	//Extract entered value and validate
	var objTitle = document.getElementById("addLink-title");
	var enteredTitle = ""; 
	var isValid = false;

	if (objTitle){
		enteredTitle = objTitle.value;		
		isValid = validateLinkToAdd(enteredTitle); //***
	}
	
	if (isValid){	
		//Update _currentPageInfo
		var linkList = _currentPageInfo.linkList;
		for (i=0; i<linkList.length; i++){
			_currentPageInfo.linkList[i].title = enteredTitle;
		}		

		//Append linkInfo to _arrCurrentLinks
		var currentLinkCount = _arrCurrentLinks.length;
		_arrCurrentLinks[currentLinkCount] = _currentPageInfo;
		
		
		//Update cookie	
		setLinkInfoToCookie(_arrCurrentLinks);

		//Get the current set of links and update display
		refreshMyLinks(true);

		window.close();
	}
}

/**
 * Method to rename a given link in My links
 **/
function renameLink(){	
	
	//Extract entered value and validate
	var objTitle = document.getElementById("renameLink-title");
	var enteredTitle = ""; 
	var isValid = false;

	if (objTitle){
		enteredTitle = objTitle.value;
		isValid = validateLinkToRename(enteredTitle); //***
	}

	if (isValid){		
		//Update LinkInfo with new name		
		if (_selectedLinkInfo.isDefault = ML_YES){
			var link = _selectedLinkInfo.getLink(_currentLang);
			link.title = enteredTitle;			
		}else{
			var linkList = _selectedLinkInfo.linkList;
			for (i=0; i<linkList.length; i++){
				_selectedLinkInfo.linkList[i].title = enteredTitle;
			}
		}

		//Update given linkInfo in _arrCurrentLinks
		updateLinkArray(_arrCurrentLinks, _selectedLinkInfo); //***
		
		//Update cookie	
		setLinkInfoToCookie(_arrCurrentLinks);

		//Get the current set of links and update display
		refreshMyLinks(true);

		window.close();
	}	
}

//***TESTED***
/**
 * Method to move set of links upward
 **/
function moveLinkUp(){	
	//Get the selected set of indices
	var arrSelectedLinkIndices = getSelectedLinkIndices();
	var arrChkLinks = document.getElementsByName("chkMyLink");
	var isValid = false;

	if (arrSelectedLinkIndices && arrSelectedLinkIndices.length>0){
		//Validate
		isValid = validateForMoveUp(arrSelectedLinkIndices);

		if (isValid){
			//Perform MOVE on _arrCurrentLinks
			_arrCurrentLinks = moveUp(arrSelectedLinkIndices, _arrCurrentLinks);

			//Update cookie	
			setLinkInfoToCookie(_arrCurrentLinks);

			//Get the current set of links and update display
			refreshMyLinks(true);
			//retain the selected check boxes
			
			if  (arrChkLinks)
			{
				
				for (i=0;i<=arrSelectedLinkIndices.length; i++)
				{
					
					var count=(arrSelectedLinkIndices[i])-1;
										
					(arrChkLinks[count]).checked='true';
						
					
				}
			}
		}
	}
}

//***TESTED***
function moveUp( arrSelectedLinkIndices, arrLinks){

	var numElements = arrLinks.length;
	var arrIndices = makeArrayOfIndices(numElements);

	//Contruct a mapping of initial positions to revised positions
	//Once this is done,
	//New position i will be occupied by element that was at the position 
	//stored in arrIndices[i] in the original links array
	//
	for (i=0; i<arrSelectedLinkIndices.length; i++){
		var selIndex = arrSelectedLinkIndices[i];

		//Swap this index with the one before
		var t = arrIndices[selIndex];
		arrIndices[selIndex] = arrIndices[selIndex-1];
		arrIndices[selIndex-1] = t;
	}

	//Now create a re-ordered array of links
	var arrRevisedLinks = new Array();
	for (i=0; i<numElements; i++){
		var oldIndex = arrIndices[i];
		arrRevisedLinks[i] = arrLinks[oldIndex];
	}

	return arrRevisedLinks;
}

//***TESTED***
function makeArrayOfIndices(numElements){
	arrIndices = new Array();

	for (i=0; i<numElements; i++){
		arrIndices[i] = i;
	}
	return arrIndices;
}


//***TESTED***
/**
 * Method to move set of links downward
 **/
function moveLinkDown(){	
	//Get the selected set of indices
	var arrSelectedLinkIndices = getSelectedLinkIndices();
	var arrChkLinks = document.getElementsByName("chkMyLink");
	var isValid = false;

	if (arrSelectedLinkIndices && arrSelectedLinkIndices.length>0){
		//Validate
		isValid = validateForMoveDown(arrSelectedLinkIndices);

		if (isValid){
			//Perform MOVE on _arrCurrentLinks
			_arrCurrentLinks = moveDown(arrSelectedLinkIndices, _arrCurrentLinks);

			//Update cookie	
			setLinkInfoToCookie(_arrCurrentLinks);

			//Get the current set of links and update display
			refreshMyLinks(true);
			//retain teh selected check boxes
			
			if  (arrChkLinks)
			{
				
				for (i=0;i<=arrSelectedLinkIndices.length; i++)
				{
					
					var cnt=(arrSelectedLinkIndices[i])+1;
										
					(arrChkLinks[cnt]).checked='true';
						
					
				}
			}
		}
	}
}

//***TESTED***
function moveDown( arrSelectedLinkIndices, arrLinks){

	var numElements = arrLinks.length;
	var arrIndices = makeArrayOfIndices(numElements);

	//Contruct a mapping of initial positions to revised positions
	//Once this is done,
	//New position i will be occupied by element that was at the position 
	//stored in arrIndices[i] in the original links array
	//
	for (i=arrSelectedLinkIndices.length-1; i>=0; i--){
		var selIndex = arrSelectedLinkIndices[i];

		//Swap this index with the one after
		var t = arrIndices[selIndex];
		arrIndices[selIndex] = arrIndices[selIndex+1];
		arrIndices[selIndex+1] = t;
	}

	//Now create a re-ordered array of links
	var arrRevisedLinks = new Array();
	for (i=0; i<numElements; i++){
		var oldIndex = arrIndices[i];
		arrRevisedLinks[i] = arrLinks[oldIndex];
	}

	return arrRevisedLinks;
}

//***TESTED***
//Note - Trying to remove all links will result in resetting list to defaults!
function removeLinks(){
	//Get the selected set of indices
	var arrSelectedLinkIndices = getSelectedLinkIndices();
	var isValid = false;

	if (arrSelectedLinkIndices && arrSelectedLinkIndices.length>0){
		//Validate
		isValid = validateForRemoval(arrSelectedLinkIndices);

		if (isValid){
			//Perform REMOVE on _arrCurrentLinks
			var revisedArray = new Array();
			var arrChkLinks = document.getElementsByName("chkMyLink");
			
			//Add those links to the new array - which have not been selected for removal
			if  (arrChkLinks){
				for (i=0, j=0; i<arrChkLinks.length; i++){
					if (arrChkLinks[i].checked == false){
						revisedArray[j++] = _arrCurrentLinks[i];						
					}
				}			
				
				//Update _arrCurrentLinks
				_arrCurrentLinks = revisedArray;

				//Update cookie	
				setLinkInfoToCookie(_arrCurrentLinks);

				//Get the current set of links and update display
				refreshMyLinks(true);
			}
		}
	}
}


//***TESTED***
/**
 * Method to restore the default set of links
 **/
function restoreLinks(){	
	//Restore defaults
	_arrCurrentLinks = _arrDefaultLinks;

	//Update cookie	
	setLinkInfoToCookie(_arrCurrentLinks);

	//Get the current set of links and update display
	refreshMyLinks(true);
}


//***TESTED***
function validateLinkToRename(enteredTitle){
	if (isLinkTitleInUse(enteredTitle)){
		alertWithMsg(MSG_DUPLICATE_PAGE_TITLE);
		return false;
	}else if (enteredTitle == ""){
		alertWithMsg(MSG_MISSING_PAGE_TITLE);
		return false;
	}
	else
		return true;
}

//***TESTED***
function validateLinkToAdd(enteredTitle){
	
	if (isLinkTitleInUse(enteredTitle)){
		alertWithMsg(MSG_DUPLICATE_PAGE_TITLE);
		return false;
	}else if (enteredTitle == ""){
		alertWithMsg(MSG_MISSING_PAGE_TITLE);
		return false;
	}
	else
		return true;
}

//***TESTED***
function isLinkTitleInUse(enteredTitle){
	//Go through the current links to chk if entered title is already in use
	if (_arrCurrentLinks){
		for (i=0; i<_arrCurrentLinks.length; i++){
			var link = _arrCurrentLinks[i].getLink(_currentLang);
			if (link.title == enteredTitle)
				return true;
		}
	}
	return false;
}


//***TESTED***
function validateForMoveUp(arrSelectedLinkIndices){
	
	//No item selected
	if ( !arrSelectedLinkIndices || arrSelectedLinkIndices.length==0){
		return false;
	}

	//if the 1st item is selected, we cannot move up any further
	if (arrSelectedLinkIndices[0] == 0){
		return false;
	}
	
	return true;
}

//***TESTED***
function validateForMoveDown(arrSelectedLinkIndices){
	
	//No item selected
	if ( !arrSelectedLinkIndices || arrSelectedLinkIndices.length==0){
		return false;
	}

	//if the last item is selected, we cannot move down any further
	if (arrSelectedLinkIndices[arrSelectedLinkIndices.length-1] == _arrCurrentLinks.length-1){
		return false;
	}

	return true;
}

//***TESTED***
function validateForRemoval(arrSelectedLinkIndices){
	
	//No item selected
	if ( !arrSelectedLinkIndices || arrSelectedLinkIndices.length==0){
		return false;
	}

	return true;
}

//***TESTED***
function alertWithMsg(msgCode){
	var msg = "";
	
	if (msgCode == MSG_DUPLICATE_PAGE_TITLE){
		if (_currentLang == "en")
			msg = "You already have a link with this name. Please choose another name.";
		else
			msg = "You already have a link with this name. Please choose another name.";
	}

	if (msgCode == MSG_MISSING_PAGE_TITLE){
		if (_currentLang == "en")
			msg = "Please specify the page title.";
		else
			msg = "Please specify the page title.";
	}
	
	if (msg != "")
		alert(msg);
}


/** ACTION CALLS  - End **/


/** UTILITY METHODS  - Start **/

//***TESTED***
/**
 * Method to populate the default set of links.
 * THis is generally invoked from the My links overlay
 *	
 **/
function populateDefaultLinks(linkString){
	if (linkString != ""){
		_arrDefaultLinks = convertLinkStringToArray(linkString);
	}	
}


//***TESTED***
/**
 * Method to get the default set of links.
 * These links are sourced from the main My links overlay
 *
 * Can be invoked on  
 *		- All pages
 *	
 * @return
 *		arrDefaultLinks - Array of LinkInfo objects representing the default set of links
 **/
function getDefaultLinks(){	
	arrDefaultLinks = new Array();

	if (_currentContext == ML_CONTEXT_MAIN){			
		arrDefaultLinks = _arrDefaultLinks;	
	}else{
		if (window.opener){			
			arrDefaultLinks = window.opener.getDefaultLinks();			
		}
	}	

	return arrDefaultLinks;
}	


//***TESTED***
/**
 * Method to get the current page's LinkInfo 
 *
 * Can be invoked on  
 *		- All pages
 *	
 * @return
 *		currPageInfo - LinkInfo holding the current page's title and URL
 **/
function getCurrentPageInfo(){
	var currPageInfo = new LinkInfo();

	if (_currentContext == ML_CONTEXT_MAIN){		
		//Extract current page's Title and URL		
		var title = document.title;
		var url = location.href;

		//Construct LinkInfo using these and _currentlang
		currPageInfo.isDefault=ML_NO;
		currPageInfo.index = _arrCurrentLinks.length;
		
		//Populate the same set of values for all languages 
		//since this is a custom link
		var linkList = new Array();
		for (i=0; i<ML_LANG_ARR.length; i++){
			linkList[i] = new Link();
			linkList[i].lang = ML_LANG_ARR[i];
			linkList[i].title = title;
			linkList[i].url = url;
		}
		currPageInfo.linkList = linkList;

	//If on Add/Edit pages, invoke this method on the parent
	}else if (window.opener){
		currPageInfo = window.opener.getCurrentPageInfo();
	}
	return currPageInfo;
}



/**
 * Method to return the selected set of links (from Edit page)
 *
 * Can be invoked on  
 *		- Edit page
 *		- Child windows of Edit (like Rename)
 *
 * @return
 *		arrSelectedLinks - Array of links selected
 **/
function getSelectedLinks(){
	var arrSelectedLinks = new Array();

	if (_currentContext == ML_CONTEXT_EDIT){			
		
		//Determine the selected indices
		var arrSelectedLinkIndices = getSelectedLinkIndices();

		//Retrieve the corresponding linkInfo's from _arrCurrentLinks
		//Add these to a new array and return
		for (i=0; i<arrSelectedLinkIndices.length; i++){
			var selIndex = arrSelectedLinkIndices[i];
			arrSelectedLinks[i] = _arrCurrentLinks[selIndex];
		}

	}else if (window.opener){
		
		arrSelectedLinks = window.opener.getSelectedLinks();
	}
	return arrSelectedLinks;	
}


//***TESTED***
/**
 * Method to return indices of the selected set of links (on Edit page)
 *
 * Can be invoked on  
 *		- Edit page
 *
 * @return
 *		arrSelectedLinkIndices - Array of indices of links selected
 **/
function getSelectedLinkIndices(){
	var arrSelectedLinkIndices = new Array();
	
	//Determine the selected indices	
	//Add these to a new array and return
	var arrChkLinks = document.getElementsByName("chkMyLink");
	if  (arrChkLinks){
		for (i=0, j=0; i<arrChkLinks.length; i++){
			if (arrChkLinks[i].checked == true){
				arrSelectedLinkIndices[j++] = i;				
			}
		}
	}

	return arrSelectedLinkIndices;
}

//***TESTED***
function updateLinkArray( arrLinks, linkInfo){
	if (arrLinks && linkInfo){
		for (i=0; i<arrLinks.length; i++){
			if (arrLinks[i].index == linkInfo.index){
				arrLinks[i] = linkInfo;
			}
		}
	}
	return arrLinks;
}


//***TESTED***
/**
 * Method to refresh the current set of links from the cookie
 * Also refreshes the parent's display if specified
 *	
 * Can be invoked on  
 *		- All pages
 *	
 * @param
 *		bRefreshParent - flag to indicate if the parent's display is to be refreshed too
 **/
function refreshMyLinks(bRefreshParent){
	//Get latest set of links from cookie 	
	_arrCurrentLinks = getLinkInfoFromCookie();
	if ( !_arrCurrentLinks || _arrCurrentLinks.length == 0){		
		_arrCurrentLinks = _arrDefaultLinks;
	}

	//Update display
	if (_currentContext == ML_CONTEXT_EDIT)
		updateDisplay_Edit();
	else
	if (_currentContext == ML_CONTEXT_MAIN)
		updateDisplay_Main();

	//Update parent's display
	if (bRefreshParent && window.opener)
		window.opener.refreshMyLinks(bRefreshParent);
	return;	
}


//***TESTED***
/**
 * Method to refresh the current set of links from the cookie
 * on the Edit page
 **/
function updateDisplay_Edit(){	
	
	var objDisplayList = document.getElementById("mylinks-editlist");
	var revisedList = "";
	
	//Construct the html for the list
	if (objDisplayList){
		if (_arrCurrentLinks){
			for (i=0; i<_arrCurrentLinks.length; i++){
				var link = _arrCurrentLinks[i].getLink(_currentLang);
				if (link)
					revisedList += '<li><input name="chkMyLink" type="checkbox" value="" /> ' 
									+ link.title
									+ ' </li>';
			}

			objDisplayList.innerHTML = revisedList;
		}
	}
}

//***TESTED***
/**
 * Method to refresh the current set of links from the cookie
 * on the Main My links overlay
 **/
function updateDisplay_Main(){	
	
	var objDisplayList = document.getElementById("mylinks-mainlist");
	var revisedList = "";
	
	//Construct the html for the list
	if (objDisplayList){
		if (_arrCurrentLinks){
			for (i=0; i<_arrCurrentLinks.length; i++){
				var link = _arrCurrentLinks[i].getLink(_currentLang);
				if (link)
					revisedList += '<li><a href="' + link.url + '">' + link.title + '</a></li>';
			}

			objDisplayList.innerHTML = revisedList;
		}
	}
}

//Highlights the appropriate menu item depending on what the current page
//is pointing to
function updateMLMenuBar(){
	
	var currPageId = getUrlParameter(window.location.href, "vgnextoid");

	var addPageId = getUrlParameter($('span.add a').attr('href'), "vgnextoid");
	var editPageId = getUrlParameter($('span.edit a').attr('href'), "vgnextoid");
	var helpPageId = getUrlParameter($('span.help a').attr('href'), "vgnextoid");
	
	if (currPageId == addPageId){
		$('span.add a').addClass('lit');		
	}else if (currPageId == editPageId){
		$('span.edit a').addClass('lit');
	}else if (currPageId == helpPageId){
		$('span.help a').addClass('lit');
	}
	
}

function getUrlParameter( url, param )
{  
	param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");  
	var regexS = "[\\?&]"+param+"=([^&#]*)";  
	var regex = new RegExp( regexS );  
	var results = regex.exec( url);  
	if( results == null )    
		return "";  
	else    
		return results[1];
}


function printItOut(arrLinkInfo){
	var msg = "Link Info array : \n\n";

	if (arrLinkInfo){
		for (i=0; i<arrLinkInfo.length; i++){
			printOutLinkInfo(arrLinkInfo[i]);

			msg = "Testing getLink";
			var link = arrLinkInfo[i].getLink("en");
			msg += link.lang + " : " + link.title + " : " + link.url;
			alert(msg);
		}
	}else{
		msg += "Array not defined\n";
	}

	msg = "Array converted back to string : \n\n";
	msg += convertLinksArrayToString(arrLinkInfo);
	alert(msg);
 
}

function printOutLinkInfo(linkInfo){
	var msg="";
	msg += "linkInfo.index : " + linkInfo.index + "\n";
	msg += "linkInfo.isDefault : " + linkInfo.isDefault + "\n";

	var linkList = linkInfo.linkList;
	for (j=0; j<linkList.length; j++){
		msg += "linklist " + j + "\n";
		msg += "link.lang : " + linkList[j].lang + "\n";
		msg += "link.title : " + linkList[j].title + "\n";
		msg += "link.url : " + linkList[j].url + "\n\n";
	}
	alert(msg);
}

/** UTILITY METHODS  - End **/


/** COOKIE MANIPULATION METHODS  - Start **/

//***TESTED***
/**
 * Method to set a given array of links into a cookie
 * @param arrLinkInfo - Array of links
 **/
function setLinkInfoToCookie(arrLinkInfo){	
	var cookieValue = convertLinksArrayToString(arrLinkInfo);		
	setCookie(ML_COOKIE_NAME, cookieValue, ML_COOKIE_AGE);
}

//***TESTED***
/**
 * Method to extract an array of links from a cookie 
 * @return
 *		arrLinkInfo - Array of links
 **/
function getLinkInfoFromCookie(){
	var cookieValue = getCookie(ML_COOKIE_NAME);

	//Array of LinkInfo objects to be constructed and returned
	var arrLinkInfo = new Array();

	if (cookieValue != ""){		
		arrLinkInfo = convertLinkStringToArray(cookieValue);
	}//End if

	return arrLinkInfo;
}

//***TESTED***
/**
 * Method to convert a given array of links to a string
 * @param arrLinkInfo - Array of links
 * @return
 *		stringVal - String representing given array of links
 **/
function convertLinksArrayToString(arrLinkInfo){	
	var stringVal = "";
	for (i=0; i<arrLinkInfo.length; i++){
		if (i>0)
			stringVal += ML_ROW_SPLITTER;		
		stringVal += arrLinkInfo[i].toString();		
	}
	return stringVal;
}

//***TESTED***
/**
 * Method to convert a given string of links into an array
 * @param stringVal - String representing given array of links
 * @return
 *		 arrLinkInfo - Array of links
 **/
function convertLinkStringToArray(stringVal){		

	//Array of LinkInfo objects to be constructed and returned
	var arrLinkInfo = new Array();

	if (stringVal != ""){
		var arrLinkRows = stringVal.split(ML_ROW_SPLITTER);

		for (i=0; i<arrLinkRows.length; i++){

			var arrLinkAttrs = arrLinkRows[i].split(ML_COL_SPLITTER);

			var linkInfo = new LinkInfo();
			linkInfo.linkList = new Array();
			var linkCtr=0;

			//***** Build Link Info [i]
			for (j=0; j<arrLinkAttrs.length; j++){				
				//Extract language-independent info - Index and IsDefault 
				switch(j){
					case 0:
						linkInfo.index=arrLinkAttrs[j];
						break;
					case 1:
						linkInfo.isDefault=arrLinkAttrs[j];
						break;
				}

				//Extract language-specific info 
				//We expect to have a max of 2 sets - en and fr - starting at positions 2 & 5 resp
				if (j==2 || j==5){
					var link = new Link();
					link.lang = arrLinkAttrs[j];

					link.title = (arrLinkAttrs.length>=j+1)?arrLinkAttrs[j+1]:"";
					link.url = (arrLinkAttrs.length>=j+2)?arrLinkAttrs[j+2]:"";
					
					//Add lang-specific Link to Link Info
					linkInfo.linkList[linkCtr++] = link;
				}
			}
			//***** End of building LinkInfo

			//Add Link Info to array
			arrLinkInfo[i] = linkInfo;

		}//End outer for
	}//End if

	return arrLinkInfo;
}

//***TESTED***
function getCookie(c_name)
{
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=");
  if (c_start!=-1)
    {
    c_start=c_start + c_name.length+1;
    c_end=document.cookie.indexOf(";",c_start);
    if (c_end==-1) c_end=document.cookie.length;
    return unescape(document.cookie.substring(c_start,c_end));
    }
  }
return "";
}

function delete_cookie ( cookie_name )
{
  var cookie_date = new Date ( );  // current date & time
  cookie_date.setTime ( cookie_date.getTime() - 1 );
  document.cookie = cookie_name += "=; expires=" + cookie_date.toGMTString() + ";path=/";
}


//***TESTED***
function setCookie(c_name,value,expiredays)
{
var exdate=new Date();
var domain = "";
var windowLocation = window.location.host;

delete_cookie(ML_COOKIE_NAME);

//***To handle both preview and live environments***
if(windowLocation.indexOf("sunlife.ca")>0) {
	domain = ".sunlife.ca";
}
else if (windowLocation.indexOf("ca.sunlife")>0) {
	domain = ".ca.sunlife";
}

exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toGMTString()) + ";path=/" + ";domain=" + domain;

}

/** COOKIE MANIPULATION METHODS  - End **/



