/******************************** Start of List generation *********************************/

Diogenes.List = function(divId, listName, options){
	
	var ptr = this; // self pointer

	this.mtv = ('mtv' in options) ? options.mtv : "";
	this.numericId = ('numericId' in options) ? options.numericId : false;
	
	this.outputFormat = ('outputFormat' in options) ? options.outputFormat : 'singleColumn';
	this.twoColumnLeft = ('twoColumnLeft' in options) ? options.twoColumnLeft : 'diogenes_list_container_left';
	this.twoColumnRight = ('twoColumnRight' in options) ? options.twoColumnRight : 'diogenes_list_container_right';
	
	this.divId = divId; // id of the div container to append everything to
	this.listName = listName; // name of the list, for pagination
	this.parentDiv = document.getElementById(divId); // dom obj of the parent container
	this.parentDivLeft = document.getElementById(this.twoColumnLeft); // dom obj of the parent container for two columns left
	this.parentDivRight = document.getElementById(this.twoColumnRight); // dom obj of the parent container for two columns right
	
	this.artistName = ('artistName' in options) ? options.artistName : "";
	this.artistId = ('artistId' in options) ? options.artistId : "";
	
	//this._getThumbsDSURL = "http://services.mtvmusic.com/sitewide/dataservices/hive-meter-image-feed/";
	this._getThumbsDSURL = this.dsURL + 'feedproxy/?type=getListThumbs';
	
	this.datasource = ('datasource' in options) ? options.datasource : null;
	this.initiated = false; // if the list has been initiated
	
	this.listType = ('type' in options) ? options.type : ""; // type of lists, empty for hotttness, otherewise underradar, recd, wreckd etc
	this.vStyle = ('style' in options) ? options.style : "full"; // visual style, 'simple' or omit
	
	this.start = ('start' in options) ? options.start : 0; // start position
	this.rows = ('rows' in options) ? options.rows : 10; // per page
	this.total = ('total' in options) ? options.total : 10; // total entry to return, default *TBD*
	
	this.returnType = ('returnType' in options) ? options.returnType : "xml";
	
	this.cardsDataArray = new Array(); // to store all the entry data returned from the dataservices for pagination
	
	this.cards = new Object(); // to store pointers to each card with their id's
	
	this.list = document.createElement('div');
	this.list.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-list');
	//this.list.setAttribute('id','dio-list-'+divId);
	this.listLeft = document.createElement('div');
	this.listLeft.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-list');
	this.listRight = document.createElement('div');
	this.listRight.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-list');
	
	this.printAjaxErrors = function(err){
		//console.log("Ajaxing Error: " + err);
		var errMesg = 'Oops, something wrong while getting the list. Please refresh page.<br/>Error: ';
		if (ptr.outputFormat=="twoColumn"){
			ptr.removeAllChildren(ptr.listLeft);
			ptr.removeAllChildren(ptr.listRight);
			
			ptr.listLeft.innerHTML = errMesg + err;
		}else{
			ptr.removeAllChildren(ptr.list);
			ptr.list.innerHTML = errMesg + err;
		}
	}
	
	this.paginate = function(startPos, perPage){ // pagination method
		var startPos = parseInt(startPos);
		var perPage = parseInt(perPage);
		
		this.removeAllChildren(this.list);

		var startPoint = startPos-1;
		var EndPoint = ((startPoint+perPage) < this.cardsDataArray.length) ? startPoint+perPage : this.cardsDataArray.length;

		for (var i = startPoint; i < EndPoint; i++){
			//console.log(i);
			var cardData = this.cardsDataArray[i];
			this.genCard(cardData);
		}

		// generate pagination links
		if (this.cardsDataArray.length > this.rows){
			
			var paginDiv = document.createElement('div');
			paginDiv.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-column-more-link');
			
			var pagingStart = 0; var pageNum = 1;
			
			while (pagingStart < this.cardsDataArray.length){
				
				var linkPagingStart = pagingStart;
				
				var pageText = document.createElement('span');
				pageText.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-column-more-link-paging');
				pageText.innerHTML = pageNum;
				if (pagingStart == startPoint){ 
					pageText.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-column-more-link-paging-current');
				}
				pageText.onmouseover = function(){this.style.cursor = 'pointer';}
				pageText.onclick = function(){  ptr.paginate(((parseInt(this.innerHTML)-1)*perPage)+1, perPage); };
				paginDiv.appendChild(pageText);
				pagingStart += perPage; pageNum++;
			}
			
			this.list.appendChild(paginDiv);
		}
	}
	
	this.getRandomDefaultThumb = function(){ // generate random thumbnail image url
		var randomDefaultThumbDir = diogenesServer+'/sitewide/img/meter/cardThumbRands/';
		var randomDefaultThumbUrl = '';
		var randNum = parseInt(Math.random()*33);
		if (randNum==0 || isNaN(randNum)) {
			randNum = 1;
		}
		randomDefaultThumbUrl = randomDefaultThumbDir + 'randoms-' + randNum + '.jpg';	
		return randomDefaultThumbUrl;
	}
	
	/* Adding ellipsis to artist name when they exceed container width */
	this.fixFlatMeterArtistName = function(flatMeterCardDivId, ellipsis){
		var meterListBox = $('#' + flatMeterCardDivId + ' .dio-card-info-flat'); // the flat meter jquery obj
		var meterArtName = $('#' + flatMeterCardDivId + ' .dio-card-info-flat-name'); // the artist name jquery obj
		var meterArtNameString = meterArtName.text(); // artist name string
		if (ellipsis){
			meterArtNameString = meterArtNameString.replace('...',''); 
			meterArtName.text(meterArtNameString);
		}
		var meterListBoxWidth = meterListBox.width(); // the flat meter box width
		var meterArtNameWidth = meterArtName.width(); // the artist name width unwrapped
		//console.log(meterListBoxWidth); 
		//console.log(meterArtNameWidth);
		//console.log(meterArtNameString);
		if ((meterArtNameWidth + 3) >= meterListBoxWidth){
			meterArtNameString = meterArtNameString.substring(0, (meterArtNameString.length-1)); // remove a character
			meterArtName.text(meterArtNameString + '...');
			this.fixFlatMeterArtistName(flatMeterCardDivId, true); // recheck
		} else if (ellipsis){
			meterArtName.text(meterArtNameString + '...');
		}
	}
	
	this.genCard = function(cardDataObj){
		/********** sample card initialization
		<div id="diogenes_hotttblack_eyed_peas" class="dio-card-root"></div>
		
		var diogenes_hotttblack_eyed_peas
		= 
		new Diogenes.Card("diogenes_hotttblack_eyed_peas", 
		"black_eyed_peas",
		{mtvn:true, artistMtvnId:'30064',artistName:"The Black Eyed Peas",rank:"3"}
		);
		***********/
		
		var cardDivId = cardDataObj.cardDivId;
		//var cardDivId = "diogenes_" + this.listType + "_" + new String(cardDataObj.rank);
		
		var card_container = document.createElement('div');
			
		if (ptr.outputFormat=="twoColumn"){
			/*
			if (cardDataObj.rank % 2) 
				this.listLeft.appendChild(card_container); // appending card container to parent div left
			else
				this.listRight.appendChild(card_container); // appending card container to parent div right
			*/ 
			//console.log(ptr.cardsDataArray.length); console.log(ptr.rows); 
			var maxOneColumn = (ptr.rows < ptr.cardsDataArray.length) ? Math.ceil(ptr.rows/2) : Math.ceil(ptr.cardsDataArray.length/2);
			if (cardDataObj.count < maxOneColumn) 
				this.listLeft.appendChild(card_container); // appending card container to parent div left
			else
				this.listRight.appendChild(card_container); // appending card container to parent div right
		} else {
			this.list.appendChild(card_container); // appending card container to parent div which should be appended to document by now
		}
		
		var card_id = (cardDataObj.mtvnAlias!="") ? cardDataObj.mtvnAlias : "";
		if (card_id == "" && cardDataObj.mtvnId!="") card_id = cardDataObj.mtvnId;
		if (card_id == "") card_id =  cardDataObj.echoId;
		
		var cardRank = (this.listType == "wreckd" || this.listType == "recd" || this.listType == "favs" || this.listType == "editorial")? 0 : cardDataObj.rank;
		
		if (this.vStyle == 'flat'){ // flat design for mtv hive home page, 2/2011
			
			card_container.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-root-flat');
			card_container.setAttribute('id', cardDataObj.cardDivId);
			var startPoint = this.start;
			var EndPoint = ((startPoint+this.rows) < this.cardsDataArray.length) ? startPoint+this.rows : this.cardsDataArray.length;
				
			var flatCardArtistName = cardDataObj.artistName;
			
			var card_link = document.createElement('a');
				card_link.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-link-flat');
				card_link.setAttribute('href', MTVM.config.meterUrl + '/' + DiogenesConfig.siteRoot + '?exp=' + cardDataObj.cardDivId);
				card_link.setAttribute('target','_blank');
				
			var card_inner_container = document.createElement('div');
				card_inner_container.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-inner-cont-flat');
				
			var card_info_container = document.createElement('div');
				card_info_container.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-info-container-flat');
			var card_info = document.createElement('div');
				card_info.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-info-flat');
			var card_rank_bg = document.createElement('div');
				card_rank_bg.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-rank-bg-flat');
				card_rank_bg.innerHTML = '<img src="'+diogenesServer+'/sitewide/img/meter/spacer.gif" border="0" width="1" height="1">';
			var card_rank = document.createElement('div');
				card_rank.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-rank-flat');
				card_rank.innerHTML = (cardRank < 10) ? '0' + cardRank : cardRank;
			
			card_info.innerHTML = '<span class="dio-card-info-flat-name">' + flatCardArtistName + '</span>';
			var clear1 = this.createClearDiv();
			
			card_container.appendChild(card_link);
			card_link.appendChild(card_inner_container);
			card_inner_container.appendChild(card_info_container);
			card_inner_container.appendChild(card_info);
			if (this.rank != 0){
				//card_info_container.appendChild(card_rank_bg);
				card_info_container.appendChild(card_rank);
			}
			card_info_container.appendChild(clear1);
			
			/* Adding ellipsis to artist name when they exceed container width */
			this.fixFlatMeterArtistName(cardDataObj.cardDivId, false);
			
			if (cardRank == EndPoint){
				var endofListClearDiv = this.createClearDiv();
				this.list.appendChild(endofListClearDiv);
			}
			
		} else if (this.vStyle == 'simple'){ // if making a simple style list, ie. for homepage
			
			card_container.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-root-simple');
			card_container.setAttribute('id', cardDataObj.cardDivId);
			var startPoint = this.start;
			var EndPoint = ((startPoint+this.rows) < this.cardsDataArray.length) ? startPoint+this.rows : this.cardsDataArray.length;
			if (cardRank != EndPoint) card_container.setAttribute('style', 'margin:0 7px 0 0');
			if (cardRank != EndPoint && card_container.style.setAttribute) {
				if (document.all&&(Dio_IE_Ver<7.0)){
					card_container.style.setAttribute('cssText', 'margin:0 4px 0 0');
				} else {
					card_container.style.setAttribute('cssText', 'margin:0 7px 0 0');
				}
			}
				
			var simpleCardArtistName = cardDataObj.artistName;
			
			var card_link = document.createElement('a');
				card_link.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-link-simple');
				card_link.setAttribute('href', MTVM.config.meterUrl + '/?exp=' + cardDataObj.cardDivId);
			
			var card_inner_container = document.createElement('div');
				card_inner_container.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-inner-cont-simple');
				
			var card_thumb = document.createElement('div');
				card_thumb.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-thumb-simple');
				card_thumb.setAttribute('id', 'dio-card-thumb-simple-'+card_id);
				card_thumb.innerHTML = "";
			var card_info_container = document.createElement('div');
				card_info_container.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-info-container-simple');
			var card_info = document.createElement('div');
				card_info.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-info-simple');
			var card_rank_bg = document.createElement('div');
				card_rank_bg.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-rank-bg-simple');
				card_rank_bg.innerHTML = '<img src="'+diogenesServer+'/sitewide/img/meter/spacer.gif" border="0" width="1" height="1">';
			var card_rank = document.createElement('div');
				card_rank.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-rank-simple');
				card_rank.innerHTML = (cardRank < 10) ? '0' + cardRank : cardRank;
			
			card_info.innerHTML = simpleCardArtistName;
			var clear1 = this.createClearDiv();
			
			card_container.appendChild(card_link);
			card_link.appendChild(card_inner_container);
			card_inner_container.appendChild(card_thumb);
			card_inner_container.appendChild(card_info_container);
			card_inner_container.appendChild(card_info);
			if (this.rank != 0){
				card_info_container.appendChild(card_rank_bg);
				card_info_container.appendChild(card_rank);
			}
			card_info_container.appendChild(clear1);
				
			card_container.onmouseover = function(){
				card_rank.setAttribute('style', 'display: none');
				card_rank_bg.setAttribute('style', 'display: none');
				this.style.cursor = 'pointer';
			}
			card_container.onmouseout = function(){
				card_rank.setAttribute('style', 'display: block');
				card_rank_bg.setAttribute('style', 'display: block');
			}
			
			if (cardDataObj.mtvnId!=""){
				//console.log('Getting images for '+this.artistName+', mtvn id:'+this.artistMtvnId)
				// temporary solution
				$.getJSON('http://services.mtvmusic.com/sitewide/diogenes/dataservices/image-selector/?id='+cardDataObj.mtvnId+'&w=142&h=86&callback=?', function(data) {
					
					var resultArray = data.images;
					var thumbAdded = 0;
					
					if (resultArray != null && resultArray.length > 0){ // client side request successful, process json
						var card_thumbnails = "";
						var card_primary_thumbs = [];
						var card_non_primary_thumbs = [];
						var card_has_primary_thumbs = false;
						for (var i=0; i < resultArray.length; i++){
							if (resultArray[i].flag == "primary"){
								card_primary_thumbs.push(resultArray[i]);
								card_has_primary_thumbs = true;
							} else {
								card_non_primary_thumbs.push(resultArray[i]);
							}
						}
						if (card_has_primary_thumbs){
							card_thumbnail = card_primary_thumbs[0].url;
						} else if (card_non_primary_thumbs.length > 0) {
							card_thumbnail = card_non_primary_thumbs[0].url;
						} else {
							card_thumbnail = ptr.getRandomDefaultThumb();
						}
						$('#dio-card-thumb-simple-'+card_id).html('<img src="'+card_thumbnail+'" alt="" height="55" width="91" border="0">');
						
					} else { 
						$('#dio-card-thumb-simple-'+card_id).html('<img src="'+ptr.getRandomDefaultThumb()+'" alt="" height="55" width="91" border="0">');
					}
				});
			
			} else {
				$('#dio-card-thumb-simple-'+card_id).html('<img src="'+ptr.getRandomDefaultThumb()+'" alt="" height="55" width="91" border="0">');
			}
			
			if (cardRank == EndPoint){
				var endofListClearDiv = this.createClearDiv();
				this.list.appendChild(endofListClearDiv);
			}
			
		}else{ // normal lists
			
			card_container.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-card-root');
			card_container.setAttribute('id', cardDataObj.cardDivId);
			
			var mtvnParams = "";
			if (cardDataObj.mtvnId!=""){
				mtvnParams += "mtvn:true, numericId:true,";
				mtvnParams += "artistMtvnId:'"+ cardDataObj.mtvnId +"',";
			}
	
			// generate js string for initializing card objects
			var cardInitString = cardDivId + " = new Diogenes.Card(\"" + cardDivId + "\", \"" + card_id + "\", {" + mtvnParams + " rank:'" + cardDataObj.rank + "'})";
			
			//console.log(cardInitString);
			//eval(cardInitString); // initialize;
				
			var cardParamsObj = {
					//artistName:cardDataObj.artistName.replace(/\'/gi, "\\'"),
					artistName:escape(cardDataObj.artistName),
					rank:cardRank,
					echoId:cardDataObj.echoId
				}
	
			if (cardDataObj.mtvnAlias!=""){
				cardParamsObj.mtvn = true;
				cardParamsObj.numericId = false;
			}
			if (cardDataObj.mtvnId!="" && cardDataObj.mtvnAlias==""){ 
				cardParamsObj.mtvn = true;
				cardParamsObj.numericId = true;
			}
			cardParamsObj.artistMtvnId = cardDataObj.mtvnId;
			
			if (cardDataObj.thumbs != null){
				// if thumbs are found generate card with the provided thumbs
				cardParamsObj.thumbDatasource = cardDataObj.thumbs;
			}
			
			// initialize the card as a global variable
			//console.log(cardDataObj.cardDivId)
			//console.log(card_id)
			//console.log(cardParamsObj)
	
			window[cardDataObj.cardDivId] = new Diogenes.Card(cardDataObj.cardDivId, card_id, cardParamsObj); // initialize card
			
			/*** Auto expand card if there's a hash specified ***/
			var listPageUrlParams = MTVM.util.parseUrlParamsToJSON();
			//console.log(listPageUrlParams.exp);
			if (listPageUrlParams && listPageUrlParams.exp!=null){
				var jumpToCardId = listPageUrlParams.exp;
				if (cardDataObj.cardDivId == jumpToCardId){

					//lock the header
					dioLockHeader();

					eval(cardDataObj.cardDivId + '.toggle()');
					//var jumpToCardYPos = $('#'+jumpToCardId).position().top;
					
					//needs to compensate for the locked header height for scrolling:
					/* var jumpToCardYPos = $('#'+jumpToCardId).position().top - 
					($("#global-top-navigation-wrapper").height()+$("#adContainer").height()); */
					var wrapperId = "global-top-navigation-wrapper", 
						dioHeaderWrapperId = "dio-header-wrapper";
					var jumpToCardYPos = $('#'+listPageUrlParams.exp).position().top - ($('#'+dioHeaderWrapperId).height() + $('#'+wrapperId).height() + 60);

					$('html, body').animate({scrollTop:jumpToCardYPos}, 'fast');
					
				}
			}
			
			/*** End of auto expanding card ***/
			
		} // end of vStyle list types
		
	}
	
	this.getThumbsForList = function(data){

		try{
			//console.log(data)
			//var startPoint = ptr.start;
			var startPoint = 0;
			var EndPoint = ((startPoint+ptr.rows) < ptr.cardsDataArray.length) ? startPoint+ptr.rows : ptr.cardsDataArray.length;
			
			if (ptr.outputFormat=="twoColumn"){
				ptr.removeAllChildren(ptr.listLeft);
				ptr.removeAllChildren(ptr.listRight);
			}else{
				ptr.removeAllChildren(ptr.list);
			}
			for (var i = startPoint; i < EndPoint; i++){
				var cardData = ptr.cardsDataArray[i];
				for (var j = 0; j < data.artists.length; j++){
					if (data.artists[j].artistId == cardData.mtvnId){
						cardData.thumbs = data.artists[j].images;
					}
				}				
			}
			
			for (var i = startPoint; i < EndPoint; i++){
				var cardData = ptr.cardsDataArray[i];
				ptr.genCard(cardData); 
			}
			
			/*
			if (ptr.cardsDataArray.length > ptr.rows){
				var clickForMore = document.createElement('div');
				clickForMore.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-column-more-link');
				
				var clickForMoreText = document.createElement('span');
				clickForMoreText.innerHTML = 'More '+ptr.listName;
				clickForMoreText.onmouseover = function(){this.style.cursor = 'pointer';}
				clickForMoreText.onclick = function(){ ptr.paginate(EndPoint+1, ptr.rows); };
				
				clickForMore.appendChild(clickForMoreText);
				ptr.list.appendChild(clickForMore);
			}
			*/
		
		}
		catch(e){ 
			console.log("Diogenes.List widget: getting thumbnails failed " + e); 
			//console.log(e.name); 
			//console.log(e.message); 
	
			var errorsDiv = document.createElement('div');
				errorsDiv.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-error-list-div');
				if (e.name == 'TypeError')
					errorsDiv.innerHTML = 'List empty.';
				else 
					errorsDiv.innerHTML = 'List generation failed.';
				
			var displayColumn = (ptr.outputFormat=="twoColumn") ? ptr.listLeft : ptr.list;
			
			if (ptr.outputFormat=="twoColumn"){
				ptr.removeAllChildren(ptr.listLeft);
				ptr.removeAllChildren(ptr.listRight);
			}else{
				ptr.removeAllChildren(ptr.list);
			}
			
			displayColumn.appendChild(errorsDiv);
		}
	}
	
	this.processList = function(data){ // process data from dataservices, then generate each card according to pagination position
		try{
			var position = parseInt(ptr.start) + 1;
			var count = 0;
			var idx = 1;
			
			if (ptr.listType=="wreckd"){ // alpha wreckommender has different xml schema
							
				$(data).find("artist").each(function(){

					var cardObj = {}

					var artistName = $(this).find("name").text();
					var echoId = $(this).find("id").text();
						echoId = echoId.substring(ptr.ECHONEST_ID_PREFIX.length);
					var mtvnId = "";
					var mtvnAlias = "";
					var cardDivId = "diogenes_"+ptr.listType+"_"+echoId;
					var rank = position;

					cardObj = {
						artistName: artistName,
						echoId: echoId,
						mtvnId: mtvnId,
						mtvnAlias: mtvnAlias,
						cardDivId: cardDivId,
						rank: rank,
						count: count,
						thumbs: null
					}

					ptr.cardsDataArray.push(cardObj);
					position++;
					count++;
				});
			}
			else if (ptr.listType=="editorial"){
				for (var i=0; i<ptr.datasource.length; i++){
					var cardObj = {}
					
					var artistName = ptr.datasource[i].name;
					var echoId = "";
					var mtvnId = ptr.datasource[i].id;
					var mtvnAlias = ptr.datasource[i].alias;
					var cardDivId = "diogenes_"+ptr.listType+"_"+mtvnId;
					var rank = position;
					
					cardObj = {
						artistName: artistName,
						echoId: echoId,
						mtvnId: mtvnId,
						mtvnAlias: mtvnAlias,
						cardDivId: cardDivId,
						rank: rank,
						count: count,
						thumbs: null
					}

					ptr.cardsDataArray.push(cardObj);
					position++;
					count++;
				}
			}
			else if (ptr.listType=="favs"){
				
				for (var i=0; i<ptr.datasource.length; i++){
					var cardObj = {}
					
					var artistName = unescape(ptr.datasource[i].n);
					var echoId = (ptr.datasource[i].m=='n') ? ptr.datasource[i].id : "";
					var mtvnId = "";
					var mtvnAlias = (ptr.datasource[i].m=='y') ? ptr.datasource[i].id : "";
					var favedArtistId = (ptr.datasource[i].m=='y') ? mtvnAlias : echoId ;
					var cardDivId = "diogenes_" + ptr.listType+"_" + favedArtistId;
					var rank = position;
					
					cardObj = {
						artistName: artistName,
						echoId: echoId,
						mtvnId: mtvnId,
						mtvnAlias: mtvnAlias,
						cardDivId: cardDivId,
						rank: rank,
						count: count,
						thumbs: null
					}
					//console.log(cardObj);
					ptr.cardsDataArray.push(cardObj);
					position++;
					count++;
				}
				
			}
			else {
				//console.log(data)

				var buzzedArtists = null;
				if (data != null) buzzedArtists = data.artists;
				if (ptr.datasource != null) buzzedArtists = ptr.datasource.artists; 
				
				$(buzzedArtists).each(function(){
					if (idx >= position){
						var buzzedArtist = this;
						var cardObj = {}
						
						var artistName = buzzedArtist.name;
						var echoId = buzzedArtist.echoNestId;
						var mtvnId = buzzedArtist.mtvnId;
						var mtvnAlias = buzzedArtist.mtvnAlias;
						var cardDivId = "diogenes_"+ptr.listType+"_"+echoId;
						var rank = position;
						
						cardObj = {
							artistName: artistName,
							echoId: echoId,
							mtvnId: mtvnId,
							mtvnAlias: mtvnAlias,
							cardDivId: cardDivId,
							rank: rank,
							count: count,
							thumbs: null
						}
	
						ptr.cardsDataArray.push(cardObj);
						position++;	
						count++;
					}
					idx++;
				});
				
				$(data).find("artist").each(function(){
					if (idx >= position){
						var cardObj = {}
						
						var artistName = $(this).find("name").text();
						var echoId = "";
						var mtvnId = "";
						var mtvnAlias = "";
						var cardDivId = "";
						var rank = position;
						
						echoId = $(this).find("id").text();
						$(this).find("foreign_id").each(function(){
							var idBucket = $(this).find("catalog").text();
							if (idBucket == "mtv_numeric"){
								mtvnId = $(this).find("foreign_id").text();
								mtvnId = mtvnId.substring(ptr.ECHONEST_ID_PREFIX_MTVN_NUMERIC.length);
							}else if (idBucket == "mtv"){
								mtvnAlias = $(this).find("foreign_id").text();
								mtvnAlias = mtvnAlias.substring(ptr.ECHONEST_ID_PREFIX_MTVN.length);
							}
						});
						
						cardDivId = "diogenes_"+ptr.listType+"_"+echoId;
	
						cardObj = {
							artistName: artistName,
							echoId: echoId,
							mtvnId: mtvnId,
							mtvnAlias: mtvnAlias,
							cardDivId: cardDivId,
							rank: rank,
							count: count,
							thumbs: null
						}
	
						ptr.cardsDataArray.push(cardObj);
						position++;
						count++;
					}
					idx++;
				});
				
			} // end of if list type is mostbuzzed or similar
			
			var startPoint = 0;
			var EndPoint = ((startPoint+ptr.rows) < ptr.cardsDataArray.length) ? startPoint+ptr.rows : ptr.cardsDataArray.length;
			
			if (ptr.listType=="recd"){
				
				if (ptr.outputFormat=="twoColumn"){
					ptr.removeAllChildren(ptr.listLeft);
					ptr.removeAllChildren(ptr.listRight);
				}else{
					ptr.removeAllChildren(ptr.list);
				}
				for (var i = startPoint; i < EndPoint; i++){
					var cardData = ptr.cardsDataArray[i];
					ptr.genCard(cardData); 
				}
				
			} else {
				
				var _getThumbsParams = "ids=";
				var count = 0;
				for (var i = startPoint; i < EndPoint; i++){
					var cardData = ptr.cardsDataArray[i];
					_getThumbsParams += (count > 0) ? ',' : '';
					if (cardData.mtvnId.length > 0){
						_getThumbsParams += cardData.mtvnId;
					} else {
						_getThumbsParams += 'NA';
					}
					count++;
				}

				//ptr.__loadData({url:ptr._getThumbsDSURL,data:_getThumbsParams,successHandler:ptr.getThumbsForList,errorHandler:ptr.printAjaxErrors, dataType:'jsonp'});
				if (ptr.vStyle == 'flat'){
					if (ptr.outputFormat=="twoColumn"){
						ptr.removeAllChildren(ptr.listLeft);
						ptr.removeAllChildren(ptr.listRight);
					}else{
						ptr.removeAllChildren(ptr.list);
					}
					for (var i = startPoint; i < EndPoint; i++){
						var cardData = ptr.cardsDataArray[i];
						ptr.genCard(cardData); 
					}
				}else{
					ptr.__loadData({url:ptr._getThumbsDSURL,data:_getThumbsParams,successHandler:ptr.getThumbsForList,errorHandler:function () { 
						
						if (ptr.outputFormat=="twoColumn"){
							ptr.removeAllChildren(ptr.listLeft);
							ptr.removeAllChildren(ptr.listRight);
						}else{
							ptr.removeAllChildren(ptr.list);
						}
						for (var i = startPoint; i < EndPoint; i++){
							var cardData = ptr.cardsDataArray[i];
							ptr.genCard(cardData); 
						}
						
					}, dataType:'json'});
				}
				//}, dataType:'jsonp', jsonpCallback:'jsonp'+(parseInt(ptr.start)+1)+'_'+(parseInt(ptr.start)+parseInt(ptr.rows))});
			}
			
		}
		catch(e){ 
			console.log("Diogenes.List widget: processing data failed " + e); 
			//console.log(e.name); 
			//console.log(e.message); 

			var errorsDiv = document.createElement('div');
				errorsDiv.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-error-list-div');
				if (e.name == 'TypeError')
					errorsDiv.innerHTML = 'List empty.';
				else 
					errorsDiv.innerHTML = 'List generation failed.';
				
			var displayColumn = (ptr.outputFormat=="twoColumn") ? ptr.listLeft : ptr.list;
			
			if (ptr.outputFormat=="twoColumn"){
				ptr.removeAllChildren(ptr.listLeft);
				ptr.removeAllChildren(ptr.listRight);
			}else{
				ptr.removeAllChildren(ptr.list);
			}
			
			displayColumn.appendChild(errorsDiv);
		}
	}
	
	this.load = function(url, params){
		var parentDiv = this.parentDiv;
		var parentDivLeft = this.parentDivLeft;
		var parentDivRight = this.parentDivRight;
		
		try {
		
			if (this.outputFormat=="twoColumn" && (parentDivLeft && parentDivRight)){
				this.parentDivLeft.appendChild(this.listLeft);
				this.parentDivRight.appendChild(this.listRight);
			}

			if (parentDiv){
				this.parentDiv.appendChild(this.list);
			}

			var ajax_loading_ani = document.createElement('div');
				ajax_loading_ani.innerHTML = '<img src="/sitewide/img/meter/ajax-ani-list.gif" border="0" style="margin: 20px;" />';
				if (this.vStyle == 'flat') ajax_loading_ani.innerHTML = '<img src="/sitewide/img/meter/ajax-ani-big.gif" border="0" style="margin: 20px;" />'; 

			if (this.outputFormat=="twoColumn")
				this.listLeft.appendChild(ajax_loading_ani);
			else
				this.list.appendChild(ajax_loading_ani);

			var _params = ""; var _dsURL = ""; var mtvnUniverse = ""
				if ( this.mtv != "" ) mtvnUniverse = "&mtv="+this.mtv;
				if ( this.numericId != "" ) mtvnUniverse += "&mtvnumeric="+this.mtv;

			switch(this.listType){
				case "recd":
					//rec'd list
					//_params = "type=xml&rows="+this.total+"&req="+this.simReq+"&id="+this.artistId+mtvnUniverse;
					//_params = "minFam=0.63&type=xml&rows=25&req="+this.simReq+"&id="+this.artistId+mtvnUniverse;
					_dsURL = this.dsURL + 'meter/recd/?id='+this.artistId+mtvnUniverse;
					_params = "start="+this.start;
				break;
				case "wreckd":
					//wreck'd list
					_dsURL = this.dsURL + 'meter/wrecked/?id='+this.artistId+mtvnUniverse;
					_params = "";
				break;
				case "underradar":
					//upcoming list
					//_params = "type=xml&rows="+this.total+"&req="+this.underRadarReq;
					_dsURL = this.dsURL + 'meter/upcoming/';
					_params = "";
				break;
				default:
					//hotttness list, query.jhtml by default returns hotttness list
					//_params = "minFam=0.73&type=xml&rows="+this.total;
					_dsURL = this.dsURL + 'meter/mostbuzzed/';
					//_params = "start="+this.start;
					_params = "";
			}

			if (this.listType == 'editorial' || this.listType == 'favs' || this.datasource != null){
				this.processList();
			} else {
				this.__loadData({url:_dsURL,data:_params,successHandler:this.processList,errorHandler:this.printAjaxErrors, dataType:'json'});
			}
		} catch (e) {
			console.log(e);
			//alert("List generation failed. Needs a parent div to attach the list to..");
		}
	}
	
	this.load();
	
}
Diogenes.List.prototype = new Diogenes();

	//SITE HELPER FUNCTIONS
	function dioRemoveAllChildren (domObj){
			if ( domObj.hasChildNodes() ) {
				while ( domObj.childNodes.length >= 1 ){
					domObj.removeChild( domObj.firstChild );       
				} 
			}
	}
	
	function dioLaunchList (navigationObj, additionalObj){
		//console.log(navigationObj)
		if (navigationObj!=null){
			var listType = navigationObj.textBody;
			var listHeader = navigationObj.title;
			var listDescription = navigationObj.description;
			var pagingStart = null;
			var datasource = null;
			if (additionalObj != null){ 
				pagingStart = additionalObj.start;
				datasource = ('datasource' in additionalObj) ? additionalObj.datasource : null;
			}
			//console.log("pagingStart: "+pagingStart)
			var animGifHeader = '<img src="/sitewide/img/meter/ajax-ani-small.gif" border="0">';
			var animGifList = '<img src="/sitewide/img/meter/ajax-ani-list.gif" border="0">';

			var dioHeader = document.getElementById('diogenes_heading');
			var dioHeaderTextDiv = document.getElementById('diogenes_heading_title');
			var dioHeaderSimDiv = document.getElementById('diogenes_heading_similar');
			var dioHeaderDivider = document.getElementById('diogenes_heading_divider');
			var dioHeaderDividerTwo = document.getElementById('diogenes_heading_divider_two');
			
			//var dioSearchSubHeader = document.getElementById('diogenes_similar_header');
			//var dioArtistPageHeader = document.getElementById('diogenes_similar_header');
			//var dioContainerDiv = document.getElementById('diogenes_list_container');
			var dioDescriptionDiv = document.getElementById('dio-column-description');
			var dioDescriptionHoverDiv = document.getElementById('dio-more-info-container');
			var dioListDiv = document.getElementById('diogenes_list_container_left');
			
			/*
			var resultListDiv = document.getElementById('diogenes_search_result');
			//var resultListDiv = document.getElementById('diogenes_list_container_left');
			if (resultListDiv){
				resultListDiv.innerHTML = "";
				resultListDiv.style.height ="0";
				resultListDiv.style.marginTop ="0";
				resultListDiv.style.marginLeft ="0";
			}
			*/
			
			if (dioHeaderTextDiv){
				dioHeaderTextDiv.innerHTML = animGifHeader;
			}
			//dioDescriptionDiv.innerHTML = animGifHeader;
			//dioListDiv.innerHTML = animGifList;
			var dioListDivLeft = document.getElementById('diogenes_list_container_left');
			var dioListDivRight = document.getElementById('diogenes_list_container_right');
			dioListDivLeft.innerHTML = "&nbsp";
			dioListDivRight.innerHTML = "&nbsp";

			var dreDS = 'http://services.mtvmusic.com/sitewide/diogenes/dataservices/drelist/?id=';
			var dreId = '';
			if (listType.match(/^\d+$/)){dreId = listType; listType="editorial";} // if q is all numbers (ie. dre list number)
			
			if (dioHeaderTextDiv){
				//dioHeader.innerHTML = unescape(listHeader).toUpperCase();	
				//dioHeaderTextDiv.innerHTML = unescape(listHeader);
				dioHeaderTextDiv.innerHTML = "<div id=\"genreLabel\">Genre</div> ";
			}
			/*
			if (dioSearchSubHeader && navigationObj.textBody == "search"){
				//dioHeader.innerHTML = unescape(listHeader).toUpperCase();
				dioSearchSubHeader.style.display="block";
				//dioSearchSubHeader.innerHTML = unescape(listHeader.replace('Searched for', 'Similar to'));
				dioSearchSubHeader.innerHTML = DiogenesConfig.recdListHeaderText;
				dioSearchSubHeader.innerHTML = dioSearchSubHeader.innerHTML + '<div style="clear:both;"></div><div class="header-divider"><img src="/sitewide/img/meter/spacer.gif" border="0" width="1" height="1"></div>';						

			}
			*/
			if (navigationObj.textBody == "search"){
				dioHeaderDivider.style.display="none";
				dioHeaderDividerTwo.style.display="block";
				dioHeaderSimDiv.style.display="block";
				dioHeaderTextDiv.innerHTML = listHeader;
				dioHeaderTextDiv.style.marginRight = '77px';
				dioHeaderTextDiv.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-column-two');
			}

			//dioDescriptionDiv.innerHTML = unescape(listDescription);
			if (dioDescriptionHoverDiv && navigationObj.textBody == "search"){
				//dioDescriptionHoverDiv.innerHTML = unescape(listDescription);				
			}
			
			
			
			var launchedList = "";
			
			switch(listType){
				case "favorites":
					//favorites list, generate list from an array in local cookie
					var dioFavs = dioUtilGetCookie('diogenesFavorites');
					try {
						var dioFavsObj = eval(dioFavs);
						
						var diogenes_list_container = new Diogenes.List("diogenes_list_container", "favorites", {"type":"favs", "datasource":dioFavsObj, "rows":1000, "outputFormat":"twoColumn", "twoColumnLeft":"diogenes_list_container_left", "twoColumnRight":"diogenes_list_container_right"});
					} catch (e) {
						//console.log(e);
					}
					
					launchedList = ''; // not registering in journey
				break;
				case "recd":
					//rec'd list
					var diogenes_list_container = new Diogenes.List("diogenes_list_container", "Similar", {"datasource":datasource, "start":pagingStart,type:'recd', artistId: additionalObj.artistId, mtv: additionalObj.mtvn,"numericId":"'+additionalObj.numericId+'", "outputFormat":"twoColumn", "twoColumnLeft":"diogenes_list_container_left", "twoColumnRight":"diogenes_list_container_right"});
					
					launchedList = '{"navId":"'+listType+'","aObj":{"aid":"'+additionalObj.artistId+'","an":"'+additionalObj.artistName+'","mtvn":"'+additionalObj.mtvn+'","num":"'+additionalObj.numericId+'"}}';
				break;
				case "wreckd":
					//wreck'd list
					var diogenes_list_container = new Diogenes.List("diogenes_list_container", "Wrecked", {"datasource":datasource, type:'wreckd', artistName:additionalObj.artistName, "outputFormat":"twoColumn", "twoColumnLeft":"diogenes_list_container_left", "twoColumnRight":"diogenes_list_container_right"});
					
					launchedList = '{"navId":"'+listType+'","aObj":{"aid":"'+additionalObj.artistId+'","an":"'+additionalObj.artistName+'","mtvn":"'+additionalObj.mtvn+'"}}';
				break;
				case "upcoming":
					//upcoming list		
					var diogenes_list_container = new Diogenes.List("diogenes_list_container", "Under the Radar", {"datasource":datasource, type:'underradar', "outputFormat":"twoColumn", "twoColumnLeft":"diogenes_list_container_left", "twoColumnRight":"diogenes_list_container_right"});
					
					launchedList = '{"navId":"'+listType+'"}';
				break;
				case "editorial":
					//programmed dre list
					/* // sample data objects coming back
						{
							"globalId":"mgid:hcx:content:mtvmusic.com:620ab857-ee46-4688-8f3f-93596b49e546",
							"urlKey":"gci-diogenes-navigation-new-hip-hop",
							"title":"New Hip Hop",
							"shortTitle":"Null",
							"description":"list description here",
							"shortDescription":"Null",
							"textBody":"uma list id here",
							"url":"list of artist aliases here",
							"images":[
							]
						}
					*/

					$.ajax({
						url: dreDS+dreId+'&callback=?',
						type: 'GET',
						data: '',
						dataType: 'json',
						timeout: 5000,
						error: function(hr) { 
							dioListDiv.innerHTML = "Problem reaching the dre list dataservice.";
						},
						success: function(data) {
							
							dioListDiv.innerHTML = "&nbsp;";
							
							var listName = data.listName;
							var listSize = data.listSize;

							if (data.artists.length > 0){
								var datasource = data.artists; 
								var diogenes_list_container = new Diogenes.List("diogenes_list_container", listHeader, {"rows":100, type:'editorial', datasource:datasource, "outputFormat":"twoColumn", "twoColumnLeft":"diogenes_list_container_left", "twoColumnRight":"diogenes_list_container_right"});
							}
							
						},
						beforeSend: function(){
							dioListDiv.innerHTML = '<br/>'+animGifList;
						}
					});
					
					/*
					$.getJSON(dreDS+dreId+'&callback=?', function(data) {

						var listName = data.listName;
						var listSize = data.listSize;

						dioListDiv.innerHTML = animGifList;

						if (data.artists.length > 0){
							var datasource = data.artists; 
							var diogenes_list_container = new Diogenes.List("diogenes_list_container", listHeader, {type:'editorial', datasource:datasource, "outputFormat":"twoColumn", "twoColumnLeft":"diogenes_list_container_left", "twoColumnRight":"diogenes_list_container_right"});
						}
					});
					*/
					
					launchedList = '{"navId":"'+dreId+'"}';
				break;
				case "search":
					
					//resultListDiv.style.height ="100%";
					//resultListDiv.style.marginTop ="20px";
					//resultListDiv.style.marginLeft ="20px";
					
					//window["diogenes_search_result"] = new Diogenes.Card("diogenes_search_result", additionalObj.artistId, {artistMtvnId: additionalObj.artistId, artistName:additionalObj.artistName, rank:0, mtvn: additionalObj.mtvn, numericId: true});
					//window["diogenes_list_container_left"] = new Diogenes.Card("diogenes_list_container_left", additionalObj.artistId, {"rank":0, "style":"artist"});
					window["diogenes_list_container_left"] = new Diogenes.Card("diogenes_list_container_left", additionalObj.artistId, {"rank":0});
					//diogenes_list_container_left.ANIMATION_DELAY = 0;
					diogenes_list_container_left.expand();
					
					var artistCardParent = document.getElementById("diogenes_list_container_left");
					var topSpacer = document.createTextNode("\u00a0");
					artistCardParent.insertBefore(topSpacer , artistCardParent.childNodes[0]);
					
					//dioListDiv.innerHTML += '<h1>Artists similar to '+additionalObj.artistName+'</h1><div class="header-divider" style="margin-bottom: 20px; width: 456px;"><img src="/sitewide/img/meter/spacer.gif" border="0" width="1" height="1"></div>';
					//<h1>Artists similar to <valueof param="artistName"/></h1>
					//<div class="header-divider"><img src="/sitewide/img/meter/spacer.gif" border="0" width="1" height="1"></div>
					var boolNumId = (additionalObj.mtvn) ? true : false;
					//var diogenes_list_container = new Diogenes.List("diogenes_list_container", "Similar", {"datasource":datasource, type:'recd', artistId: additionalObj.artistId, mtv: additionalObj.mtvn, numericId: boolNumId, "outputFormat":"twoColumn", "twoColumnLeft":"diogenes_list_container_left", "twoColumnRight":"diogenes_list_container_right"});
					var diogenes_list_container_right = new Diogenes.List("diogenes_list_container_right", "Similar", {"datasource":datasource, "type":"recd", "artistId": additionalObj.artistId, "mtv": additionalObj.mtvn, "numericId": boolNumId});
					
					launchedList = '{"navId":"'+listType+'","aObj":{"aid":"'+additionalObj.artistId+'","an":"'+additionalObj.artistName+'","mtvn":"yes"}}';
					
				break;
				default:
					//hotttness list, query.jhtml by default returns hotttness list
					var diogenes_list_container = new Diogenes.List("diogenes_list_container", "Artists", {"datasource":datasource, "start":pagingStart,"outputFormat":"twoColumn", "twoColumnLeft":"diogenes_list_container_left", "twoColumnRight":"diogenes_list_container_right"});
					//$("#dio-list-more-info-link").bind("mouseover", function(){document.getElementById("dio-more-info-container").style.display = "block";});				
					//$("#dio-list-more-info-link").bind("mouseout", function(){document.getElementById("dio-more-info-container").style.display = "none";});
				
					//document.getElementById("dio-list-more-info-diz").style.display = "block";
					launchedList = '{"navId":"'+listType+'"}';
					//dioHeaderTextDiv.innerHTML += " " + (parseInt(pagingStart)+1) + " - " + (parseInt(pagingStart)+10);
					if(selectedGenre != "undefined") { //check for the exiting value, if isn't there we dont need the setup .
						var genreSelector = document.createElement("select");
						genreSelector.id = "genreSelector";
						genreSelector.setAttribute("class", "genreSelector")
						genreSelector.options[0] = new Option("Up & Coming","upcoming");
						genreSelector.options[1] = new Option("Rock","rock");
						genreSelector.options[2] = new Option("Hip Hop","hip-hop");
						genreSelector.options[3] = new Option("Indie","indie");
						genreSelector.options[4] = new Option("Electronic","electronic");
						genreSelector.options[5] = new Option("Mainstream","mainstream");
						
						var genreSelectorWraper = document.createElement("div");
											
						genreSelectorWraper.id = "genreSelectorWraper";
						genreSelectorWraper.appendChild(genreSelector);
						
		
						dioHeaderTextDiv.appendChild(genreSelectorWraper);
						//selected genre default value
						$('#genreSelector').val(selectedGenre);
					}
			}
			
			//console.log(launchedList);
			if (launchedList!='') dioRegisterJourneyPoint(launchedList);
			else dioShowJourney();
			
			// Highlight page navigation element:
			if (typeof navItems != 'undefined'){
				for (var j=0; j<navItems.length; j++){ // clear highlight status for navigation elements
					var navigationElement = document.getElementById('dio-list-navigation-item-'+navItems[j].textBody+'-container');
					if (navigationElement!=null) navigationElement.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'');
				}
				var matchingNavigationElement = document.getElementById('dio-list-navigation-item-'+listType+'-container');
				if (listType=="editorial") matchingNavigationElement = document.getElementById('dio-list-navigation-item-'+dreId+'-container');
				if (matchingNavigationElement!=null) matchingNavigationElement.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'hl');
			}
		}
		
	}
	
	
	
	
	
	// START OF Journey functions
	var dioHistoryScrollTimer = null;
	var dioHistoryScrollInterval = 30;
	var dioHistoryScrollSpeed = 20;
	
		function dioUtilSetCookie(c_name,value,expiredays){
			var exdate=new Date();
			exdate.setDate(exdate.getDate()+expiredays);
			//document.cookie=c_name+ "=" +escape(value)+
			document.cookie=c_name+ "=" +value+
			";path=/" +
			((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
		}
		function dioUtilGetCookie(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 document.cookie.substring(c_start,c_end);
				}
			}
			return "";
		}
		
		
	function dioResetJourney(){
		$('#dio-browse-history').css('marginTop','0px');
		dioUtilSetCookie('diogenesJourney','');
		dioShowJourney();
	}
	function dioShowJourney(){
		//var dioJourney = eval(dioUtilGetCookie('diogenesJourney'));
		var dioJourney = dioUtilGetCookie('diogenesJourney');
		var historyContainerBox = document.getElementById('dio-browse-history-box');
		var historyContainer = document.getElementById('dio-browse-history');
		if (historyContainer!=null){
			//console.log(dioJourney);
			var journeyArray = eval(dioJourney);
			//console.log('journey length: ' + journeyArray.length);
			var dioJourneyHTML = "";
			if (journeyArray instanceof Array){
				for (var i=0; i<journeyArray.length; i++){
					
					//Find the matching description objects from the page, if not found, see if it's of type recd, wreckd or search
					var journey = journeyArray[i];
					var matchingObj = null;
					for (var j=0; j<navItems.length; j++){
						if (journey.navId == navItems[j].textBody){
							matchingObj = navItems[j];
						}
					}
					//console.log(matchingObj);
					// if a matching object is found, register it with the corresponding values
					if (matchingObj!=null){ 
						if (DiogenesConfig.useLauncher){
							dioJourneyHTML += '<a href="javascript:dioLaunchList({\'textBody\':\''+matchingObj.textBody+'\',\'title\':\''+dioEscapeSymbols(matchingObj.title)+'\',\'description\':\''+dioEscapeSymbols(matchingObj.description)+'\'}';

							//Find additional object values to populate
							if ('aObj' in journey){
								dioJourneyHTML += ',{\'artistId\':\''+dioEscapeSymbols(journey.aObj.aid)+'\',\'artistName\':\''+dioEscapeSymbols(journey.aObj.an)+'\',\'mtvn\':\''+journey.aObj.mtvn+'\'}';
							}
							dioJourneyHTML += ')">'+unescape(matchingObj.title)+'</a><br/>';
						}else{
							//dioJourneyHTML += '<a href="index.jhtml?q='+matchingObj.textBody+'">'+unescape(matchingObj.title)+'</a><br/>';
							dioJourneyHTML += '<a href="/meter/'+matchingObj.alias+'">'+unescape(matchingObj.title)+'</a><br/>';
						}
					} else {
						switch(journey.navId){
							case "recd":
								if (DiogenesConfig.useLauncher){
								dioJourneyHTML += '<a href="javascript:dioLaunchList({\'textBody\':\'recd\',\'title\':\''+DiogenesConfig.recdListHeaderText+dioEscapeSymbols(journey.aObj.an)+'\',\'description\':\''+DiogenesConfig.recdListDescText+dioEscapeSymbols(journey.aObj.an)+'\'}';
								//Find additional object values to populate
								if ('aObj' in journey){
									dioJourneyHTML += ',{\'artistId\':\''+dioEscapeSymbols(journey.aObj.aid)+'\',\'artistName\':\''+dioEscapeSymbols(journey.aObj.an)+'\',\'mtvn\':\''+journey.aObj.mtvn+'\',\'numericId\':\''+journey.aObj.num+'\'}';
								}
								dioJourneyHTML += ')">'+DiogenesConfig.recdListHeaderText+unescape(journey.aObj.an)+'</a><br/>';
								}else{
									dioJourneyHTML += '<a href="/meter/artist/'+dioFlattenArtistNames(journey.aObj.an)+'/'+dioEscapeSymbols(journey.aObj.aid)+'/similar?mtv='+journey.aObj.mtvn+'&mtvnumeric='+journey.aObj.num+'">'+DiogenesConfig.recdListHeaderText+unescape(journey.aObj.an)+'</a><br/>';
								}
							break;
							case "wreckd":
								if (DiogenesConfig.useLauncher){
								dioJourneyHTML += '<a href="javascript:dioLaunchList({\'textBody\':\'wreckd\',\'title\':\''+DiogenesConfig.wreckListHeaderText+dioEscapeSymbols(journey.aObj.an)+'\',\'description\':\''+DiogenesConfig.wreckListDescText+dioEscapeSymbols(journey.aObj.an)+'\'}';
								//Find additional object values to populate
								if ('aObj' in journey){
									dioJourneyHTML += ',{\'artistId\':\''+dioEscapeSymbols(journey.aObj.aid)+'\',\'artistName\':\''+dioEscapeSymbols(journey.aObj.an)+'\',\'mtvn\':\''+journey.aObj.mtvn+'\'}';
								}
								dioJourneyHTML += ')">'+DiogenesConfig.wreckListHeaderText+unescape(journey.aObj.an)+'</a><br/>';
								}else{
									dioJourneyHTML += '<a href="/meter/artist/'+dioFlattenArtistNames(journey.aObj.an)+'/'+dioEscapeSymbols(journey.aObj.aid)+'/dissimilar?artistName='+dioEscapeSymbols(journey.aObj.an)+'">'+DiogenesConfig.wreckListHeaderText+unescape(journey.aObj.an)+'</a><br/>';
								}
							break;
							case "search":
								if (DiogenesConfig.useLauncher){
								dioJourneyHTML += '<a href="javascript:dioLaunchList({\'textBody\':\'search\',\'title\':\''+DiogenesConfig.searchHeaderText+dioEscapeSymbols(journey.aObj.an)+'\',\'description\':\''+DiogenesConfig.searchDescText+dioEscapeSymbols(journey.aObj.an)+'\'}';
								//Find additional object values to populate
								if ('aObj' in journey){
									dioJourneyHTML += ',{\'artistId\':\''+dioEscapeSymbols(journey.aObj.aid)+'\',\'artistName\':\''+dioEscapeSymbols(journey.aObj.an)+'\',\'mtvn\':\''+journey.aObj.mtvn+'\'}';
								}
								dioJourneyHTML += ')">'+DiogenesConfig.searchHeaderText+unescape(journey.aObj.an)+'</a><br/>';
								}else{
									dioJourneyHTML += '<a href="/meter/artist/'+dioFlattenArtistNames(journey.aObj.an)+'/'+dioEscapeSymbols(journey.aObj.aid)+'/">'+DiogenesConfig.searchHeaderText+unescape(journey.aObj.an)+'</a><br/>';
								}
							break;
							default:
								//console.log("Journey has no match");
						}
					}
				}	
			}
			
			/*
			historyContainer.innerHTML = dioJourneyHTML;
			
			if (journeyArray instanceof Array) historyContainerBox.style.display = 'block';
			else historyContainerBox.style.display = 'none';
			*/
		}
		
		//dioJourneyHistoryScrollToBottom();
	}
	function dioRegisterJourneyPoint(jp){
		
		var maxJourneyPoints = 200;
		
		if (jp!=""){
			var dioJourney = dioUtilGetCookie('diogenesJourney');
			// due to cookie value size restriction, phase out the oldest entry when reaching the 200th destination
			try {
				if (dioJourney=="") {
					dioUtilSetCookie('diogenesJourney', '['+jp+']');
				} else {	
					
					var dioJourneyArray = eval(dioJourney);
					if (dioJourneyArray.length > maxJourneyPoints){ // if number of destinations are over 200
						var dioJourneyStrings = dioJourney.split(",");
						var dioJourneyNewString = "[";
						for (var i=1; i<maxJourneyPoints; i++){
							if (i!=1) dioJourneyNewString += ",";
							dioJourneyNewString += dioJourneyStrings[i].replace(/\[\]/gi,"");
						}
						dioJourneyNewString +=  ',' + jp + ']';
						dioUtilSetCookie('diogenesJourney', dioJourneyNewString);
					}
					else {
						dioJourney = dioJourney.substring(0, dioJourney.length-1) + ',' + jp + ']';
						dioUtilSetCookie('diogenesJourney', dioJourney);
					}
				}
				
				dioShowJourney();
				
			} catch(e) { 
				// fails to eval
				//console.log(e);
				dioUtilSetCookie('diogenesJourney', '');
			}
			
		}
	}
	function dioRemoveJourneyPoint(jp){
		if (jp!=""){
		}
	}
	function dioEscapeSymbols(term){
		term = term.replace(/'/gi,"\\'");
		return term;
	}
	
	function dioJourneyCheckHistoryScroll(){
		var dioHistoryTopArrow = $('#dio-browse-history-top-arrow');
		var dioHistoryBottomArrow = $('#dio-browse-history-bottom-arrow');
		
		var historyBox = $('#dio-browse-history-container');
		var historyBoxHeight = parseInt(historyBox.css('maxHeight'));
		var historyList = $('#dio-browse-history');
		var historyListHeight = parseInt(historyList.height());

		var historyListYPos = parseInt(historyList.css('marginTop'));

		if (historyListYPos < 0){
			//console.log('activate top arrow');
			dioHistoryTopArrow.html('<img src="/sitewide/img/meter/button-scroller-up-greybg.gif" border="0">');
			//dioHistoryTopArrow.click(dioHistoryScrollUp);
			dioHistoryTopArrow.mousedown(dioHistoryScrollUp);
			dioHistoryTopArrow.mouseup(dioHistoryScrollClearTimer);
			dioHistoryTopArrow.mouseover(dioMouseCursorOverHistory).mouseout(dioMouseCursorOutHistory);
		} else {
			dioHistoryTopArrow.html('<img src="/sitewide/img/meter/button-scroller-up-grey-greybg.gif" border="0">');
			dioHistoryTopArrow.unbind();
			dioHistoryTopArrow.removeClass("dio-mouse-over");
		}

		if ((historyListHeight+historyListYPos) > historyBoxHeight){
			//console.log('activate bottom arrow');
			dioHistoryBottomArrow.html('<img src="/sitewide/img/meter/button-scroller-down-greybg.gif" border="0">');
			//dioHistoryBottomArrow.click(dioHistoryScrollDown);
			dioHistoryBottomArrow.mousedown(dioHistoryScrollDown);
			dioHistoryBottomArrow.mouseup(dioHistoryScrollClearTimer);
			dioHistoryBottomArrow.mouseover(dioMouseCursorOverHistory).mouseout(dioMouseCursorOutHistory);
		} else {
			dioHistoryBottomArrow.html('<img src="/sitewide/img/meter/button-scroller-down-grey-greybg.gif" border="0">');
			dioHistoryBottomArrow.unbind();
			dioHistoryBottomArrow.removeClass("dio-mouse-over");
		}
	}
	
	function dioMouseCursorOverHistory(){
		$(this).addClass("dio-mouse-over");
	}
	function dioMouseCursorOutHistory(){
		$(this).removeClass("dio-mouse-over");
		dioHistoryScrollClearTimer();
	}
	
	function dioHistoryScrollClearTimer(){
		dioJourneyCheckHistoryScroll();
		clearTimeout(dioHistoryScrollTimer);
	}
	function dioHistoryScrollDown(){
		var historyBox = $('#dio-browse-history-container');
		var historyBoxHeight = parseInt(historyBox.css('maxHeight'));
		var historyList = $('#dio-browse-history');
		var historyListHeight = parseInt(historyList.height());
	
		var historyList = $('#dio-browse-history');
		var historyListYPos = parseInt(historyList.css('marginTop'));
		
		//console.log('ypos before '+historyListYPos);
		
		if ((historyListHeight + historyListYPos) <= historyBoxHeight){ dioHistoryScrollClearTimer();}
		else{	
			historyList.css('marginTop',(historyListYPos - dioHistoryScrollSpeed) + 'px');
			//console.log('ypos after '+historyList.css('marginTop'));
			
			dioHistoryScrollTimer = setTimeout("dioHistoryScrollDown()", dioHistoryScrollInterval);
		}
	}
	function dioHistoryScrollUp(){
		var historyBox = $('#dio-browse-history-container');
		var historyBoxHeight = parseInt(historyBox.css('maxHeight'));
		var historyList = $('#dio-browse-history');
		var historyListHeight = parseInt(historyList.height());
	
		var historyList = $('#dio-browse-history');
		var historyListYPos = parseInt(historyList.css('marginTop'));
		//console.log('ypos before '+historyListYPos);
		
		if (historyListYPos >= 0){ dioHistoryScrollClearTimer();}
		else{	
			historyList.css('marginTop',(historyListYPos + dioHistoryScrollSpeed) + 'px');
			//console.log('ypos after '+historyList.css('marginTop'));
			
			dioHistoryScrollTimer = setTimeout("dioHistoryScrollUp()", dioHistoryScrollInterval);
		}
	}
	
	function dioJourneyHistoryScrollToBottom(){
		var historyBox = $('#dio-browse-history-container');
		var historyBoxHeight = parseInt(historyBox.css('maxHeight'));
		var historyList = $('#dio-browse-history');
		var historyListHeight = parseInt(historyList.height());
		
		if (historyListHeight > historyBoxHeight) historyList.css('marginTop',(historyBoxHeight - historyListHeight) + 'px');
		dioJourneyCheckHistoryScroll();
	}
	
	
	// END OF Journey functions


	// START of Favorites (local cookie) functions
	function dioListFavorites(){
		/*
		var favoritesCardsObj = []
		if (datasource==null){
			var dioFavs = dioUtilGetCookie('diogenesFavorites');
			favoritesCardsObj = (dioFavs!='') ? eval(dioFavs) : [];
		} else {
			favoritesCardsObj = datasource;
		}
		*/
		//console.log(favoritesCardsObj)
		//dioLaunchList({'textBody':'favorites', 'title':DiogenesConfig.favoritesHeaderText, 'description':DiogenesConfig.favoritesDescText}, favoritesCardsObj);
		dioLaunchList({'textBody':'favorites', 'title':DiogenesConfig.favoritesHeaderText, 'description':DiogenesConfig.favoritesDescText});
	}
		function dioClearFavorites(){
			dioUtilSetCookie('diogenesFavorites', '', 365*10);
			//dioListFavorites();
			var dioListDiv = document.getElementById('diogenes_list_container_left');
			dioRemoveAllChildren(dioListDiv);
			var errorsDiv = document.createElement('div');
				errorsDiv.setAttribute(((document.all&&(Dio_IE_Ver<8.0)) ? 'className' : 'class'),'dio-error-list-div');
				errorsDiv.innerHTML = 'Favorites cleared.';
				errorsDiv.style.padding = '12px 0';
				
			dioListDiv.appendChild(errorsDiv);
			
		}
		
		//function dioRegisterFavorites(cardParamsObj, linkPtr, popUpId){
		function dioRegisterFavorites(cardParamsObj, linkPtr){

			var dioFavs = dioUtilGetCookie('diogenesFavorites');
			var dioFavLimit = 60; // max 70 ish due to cookie size limitation

			try {
				/*
				('id' in cardParamsObj) // artist id
				('n' in cardParamsObj) // artist name
				('m' in cardParamsObj) // mtv universe
				('mn' in cardParamsObj) // mtv numeric
				*/
				
				/*
				var diogenesButtonPopUps = null
				var correspondingPopup = null;
				if (popUpId!=null){
					diogenesButtonPopUps = eval(popUpId+'.buttonPopUps');
					for (var i=0; i<diogenesButtonPopUps.length; i++){
						if (diogenesButtonPopUps[i].id == popUpId+'_addfav_popup'){
							correspondingPopup = diogenesButtonPopUps[i];
						}
					}
				}
				*/
				
				if ('id' in cardParamsObj){
					// params needed to generate cards are available, add this to favorites
					var dioFavsObj = null;
					var newDioFavs = dioFavs;
					var dup = false;
					var limit = false;
					
					newDioFavs = '[';

					if (dioFavs!=""){
						//console.log("Favs presenting, looping through and add one more");
						//console.log(dioFavs);
						dioFavsObj = eval(dioFavs);
						
						if (dioFavsObj.length>=dioFavLimit) limit = true;
						
						for (var i=0; i<dioFavsObj.length; i++){
							var itemString = '"id":"'+dioFavsObj[i].id+'"';
							itemString += ('n' in dioFavsObj[i]) ? ',"n":"'+dioFavsObj[i].n+'"' : '';
							itemString += ('m' in dioFavsObj[i]) ? ',"m":"'+dioFavsObj[i].m+'"' : '';
							itemString += ('mn' in dioFavsObj[i]) ? ',"mn":"'+dioFavsObj[i].mn+'"' : '';
							if (i!=0) newDioFavs += ',';
							newDioFavs += '{'+ itemString +'}';
							if (cardParamsObj.id == dioFavsObj[i].id) dup=true;
						}
					}
					
					if (limit){
						//linkPtr.innerHTML = "Favorites limit reached";
					} else {
					
						if (!dup){
							if (dioFavs!="") newDioFavs += ',';
							itemString = '"id":"'+cardParamsObj.id+'"';
							itemString += ('n' in cardParamsObj) ? ',"n":"'+cardParamsObj.n+'"' : '';
							itemString += ('m' in cardParamsObj) ? ',"m":"'+cardParamsObj.m+'"' : '';
							itemString += ('mn' in cardParamsObj) ? ',"mn":"'+cardParamsObj.mn+'"' : '';
							newDioFavs += '{'+ itemString +'}';

							//linkPtr.innerHTML = "ADDED";
							/*
							var correspondingPopupJ = $(correspondingPopup.obj);
							var oldCorrespondingPopupWidth = correspondingPopupJ.width();
							var oldLeft = parseInt(correspondingPopupJ.css('left'));
							if (correspondingPopup!=null) correspondingPopup.textObj.innerHTML = DiogenesConfig.favoritedText;
							*/
							linkPtr.innerHTML = '<img src="/sitewide/img/meter/footer-button-favorite.gif" border="0"><br/>Favorite';
							/*
							var newCorrespondingPopupWidth = correspondingPopupJ.width();
							var newOffset = Math.round((oldCorrespondingPopupWidth - newCorrespondingPopupWidth) / 2);
							correspondingPopupJ.css('left', oldLeft+newOffset);
							*/
						} else {
							//linkPtr.innerHTML = "Already in list";
							//if (correspondingPopup!=null) correspondingPopup.textObj.innerHTML = DiogenesConfig.favoritedAlreadyText;
							linkPtr.innerHTML = '<img src="/sitewide/img/meter/footer-button-favorite.gif" border="0"><br/>Favorite';
						}
					
					}

					newDioFavs += ']';

					//console.log(newDioFavs);
					//show myfav tab in browser
					if(typeof MTVM != "undefined"){
						MTVM.services.ui.showMyFav();
					}
					
					dioUtilSetCookie('diogenesFavorites', newDioFavs, 365*10);

				} else {
					// not enough params to generate cards, report error
					alert("Not enough card generating params");
					
				}
			} catch (e) {
				console.log(e);
				console.log("could not eval the current favorites bookmarking, resetting");
				dioUtilSetCookie('diogenesFavorites', '', 365*10);
			}
		}


	// END OF Favorites (local cookie) functions

/******************************** End of List generation *********************************/


