baseDomain = "http://home.de.napster.com";
baseURL = "/";
currentContentType = "";
documentRoot = baseDomain + baseURL;
dojo.require("dojo.io.cookie");
dojo.require("dojo.dom");
navBind = "";
menuInitialized = false;
initialURL = "";
addedPops = new Array();
loaderThrobberHtml = "<div id='loaderThrobber'><div><img src='/images/includes/loader_arrow.gif' alt='Loading...' /></div></div>";
previousTarget = "";

	function console_log(s) {
		if (typeof(console) != "undefined") {
			return console.log(s);
		}
		else if (typeof(window.console) != "undefined") {
			return window.console.log(s);
		}
	}

	function getLocationHash() {
		if(dojo.render.html.ie60) { // IE 6 doesn't pick up query strings on location.hash
			var locationPieces = new String(location).split("#");
			var hashId = "#";
			hashId += typeof(locationPieces[1]) != "undefined"?locationPieces[1]:"";
		} else {
			var hashId = location.hash;
		}
		return hashId;
	}


	function getChartData() {
		var dataForm = document.chart_data;
		var selectedSeason;
		// this is here in case there's only one season available
		if(!dataForm.seasons.length) {
			selectedSeason = dataForm.seasons.value;
		} else {
			for(i = 0; i < dataForm.seasons.length; i++) {
				if(dataForm.seasons[i].checked) {
					selectedSeason = dataForm.seasons[i].value;
				}
			}
		}
		navigate("http://home.de.napster.com/cgi-bin/searchXML?type_id=billboard&result_type=" + dataForm.result_type.value + "&select_by=chart&select_value=" + dataForm.chart_id.value + "&year=" + dataForm.year[dataForm.year.selectedIndex].value + "&seasoncode=" + selectedSeason + "&format=json");
	}
		
		fixedLinkFromURL = function (inURL,justURL,sideBar) {
			var outLink = "";
			if(typeof(justURL) == "undefined") { justURL = 0; }
			if(inURL === undefined || inURL == "") { inURL = "#"; }
			urlPieces = inURL.split(documentRoot, 2);
			//alert(urlPieces.toSource());
			if(!urlPieces[1]) { //we have a URL that doesn't have the documentRoot in it
				if(inURL.charAt(0) == "/") { //the URL points to documentRoot/
					inURL = baseDomain + inURL;
				} else {
					if(inURL.indexOf("://") >= 0) { //we have a URL on an external domain
						outLink = "<a href=\"";
						outLink += "javascript:var newWindow = window.open('" + inURL + "');\" ";
						outLink += "onclick=\"var newWindow = window.open('" + inURL + "'); return false;\" ";
						outLink += ">";
						return outLink;
					} else { //fall through, we have an absolute or relative URL
						inURL = documentRoot + inURL;
					}
				}
				if(justURL) { return urlPieces[0]; }
			} else {
				if(justURL) { return urlPieces[1]; }
			}
			if(inURL == documentRoot + "#") { inURL = ""; }
			outLink = "<a href=\"";
			// outLink += "javascript:navigate('" + inURL + "');\" ";
			/* outLink += "javascript:";
			sideBar?outLink += "sideBarNavigate('" + inURL + "', this);\" " : outLink += "navigate('" + inURL + "');\" "; */
			outLink += "javascript:;\" ";
			outLink += "onclick=\""
			sideBar?outLink += "sideBarNavigate('" + inURL + "', this); return false;\" " : outLink += "navigate('" + inURL + "'); return false;\" ";
			outLink += ">";
			return outLink;
		}
		
		fixLinks = function (elementID) {
			if(elementID) { 
				var links = elementID.getElementsByTagName("a");
			} else {
				var links = document.getElementsByTagName("a");
			}
			if(links.length) {
			    for(var i=0; i<links.length; i++) {
					var href = "";
					var targetDiv = "";
			        try { href = links[i].getAttribute("href"); } catch(e) { dojo.debug("href error: " + e.message); }
					try { targetDiv = links[i].getAttribute("rel"); } catch(e) { }
					if(targetDiv) {
						if(targetDiv.indexOf("naps_") == 0) {
							switch(targetDiv.substr(5)) {
								case "current": targetDiv = nav.target; break
								default: targetDiv = targetDiv.substr(5);
							}
						} else {
							targetDiv = "";
						}
					}
					urlPieces = href.split(documentRoot, 2);
					if(!urlPieces[1]) { //we have a URL that doesn't have the documentRoot in it
						if(href.charAt(0) == "/") { //the URL points to documentRoot/
							href = baseDomain + href;
						} else {
							if(href.indexOf("://") >= 0) { //we have a URL on an external domain
								if(!links[i].getAttribute("onclick")) {
									links[i].setAttribute("onclick", "var newWindow = window.open('" + links[i].getAttribute("href") + "'); return false;");
								}
								//FIXME: line below causes js-error for external links
								//links[i].setAttribute("href", "javascript:var newWindow = window.open('" + links[i].getAttribute("href") + "'); return false;");
							} else { //fall through, we have an absolute or relative URL
								href = documentRoot + href;
							}
						}
					}
					if(!links[i].getAttribute("onclick")) { //if our link doesn't already have an onclick (set above or in the html)
						if(href == documentRoot + "#") { href = ""; }
						var oc=links[i].onclick?links[i].onclick.toString():'';
						if(targetDiv) {
							if(targetDiv == "close") {
								var navString = "removeAddedPops(\"" + nav.target + "\");";
							} else {
								var navString = "navigate(\"" + href + "\", 0, \"" + targetDiv + "\");";
							}
						} else {
							var navString = "navigate(\"" + href + "\");";
						}
						if(oc) {
							if((oc.indexOf("s_lc(") > 1) && (links[i].onclick.length == 1)) {
								links[i].setAttribute("onclick", navString + " return false;");
								links[i].setAttribute("href", "javascript:" + navString);
							}
						} else {
							links[i].setAttribute("onclick", navString + " return false;");
							links[i].setAttribute("href", "javascript:" + navString);
						}
					}
			    }
			}
		}

		function fixMainContentArea() {
			alert("in fixMainContentArea()");
			if(dojo.render.html.ie) { // a proprietary solution to a proprietary issue with missing content				
				alert("about to fix content");
				
				var elems = dojo.html.getElementsByClass("zoomFix");
				
                for( i = 0; i < elems.length; i++ ){
					elems[i].style.zoom = ".99";
					elems[i].style.zoom = "1";
				}
			}
		}
		
		ApplicationState = function(bookmarkValue){
			this.changeUrl = bookmarkValue;
		}

		ApplicationState.prototype.back = function(){
			navigate(this.changeUrl);
		}

		ApplicationState.prototype.forward = function(){
			navigate(this.changeUrl);
		}
		
		function getHtmlNav(menuItems) {
			var menuHTML = "<ul>";
			for (var s = 0; s < menuItems.length; s++) {
				if(menuItems[s].type == "popup") {
					menuHTML += "<li";
					if(menuItems[s].expand) { menuHTML += " class=\"expanded\""; }
					menuHTML += "><a href=\"#\">" + menuItems[s].text + "</a>";
					menuHTML += getHtmlNav(menuItems[s].menuitem);
					menuHTML += "</li>";
				} else {
					var url = "";
					if(menuItems[s].home == 1) { initialURL = menuItems[s].url; }
					menuItems[s].url === undefined ? url = "#":url = menuItems[s].url;
					menuHTML += "<li>" + fixedLinkFromURL(url,0,1) + menuItems[s].text + "</a></li>";
				}
			}
			menuHTML += "</ul>";
			menuInitialized = true;
			return menuHTML;
		}
		
		function loadNav(navURL) {
			var bindDataArgs = {
				url:        navURL,
				mimetype:   "text/plain",
				transport: "XMLHTTPTransport",
				error:      function(type, errObj){ dojo.debug("Data Bind Failed"); },
				load:      function(type, dataIn, evt, ioRequest){
					jsonData = dojo.json.evalJson(dataIn);
					menuItems = jsonData.NAVIGATION.menuitem;
					var currNavItem = 3;
					for (var r = 0; r < menuItems.length; r++) {
						dojo.byId("sb" + currNavItem).innerHTML = menuItems[r].text; // for top-level nav items, set the tab title
						menuHTML = getHtmlNav(menuItems[r].menuitem);
						dojo.byId("bar" + currNavItem).innerHTML = menuHTML;
						ntreeCreate("bar" + currNavItem);
						currNavItem++;
					}
				}
			}
			var requestDataObj = dojo.io.bind(bindDataArgs);
			
			// dojo.debug(requestDataObj);
		}
		
		
		function _safeSendText(inText) {
			inText = inText.toString(); //convert our input text to a string
			var safeText = inText.replace(/'/g, "&rsquo;"); //escape all single quotes
			return safeText;
		}
		
		function getLinkAction(linkURL) {
			var linkActionReturn = "";
			if(linkURL.substr(0,9) == "MyLibrary") {
				linkURLpieces = linkURL.substr(9).split('/');
				if(linkURL == "MyLibrary") { linkURLpieces[1] = "MyLibrary"; }
				switch(linkURLpieces[1]) {
					case "": linkActionReturn = "libraryDisplay.displayRecentTracks('1')"; break
					case "MyLibrary": linkActionReturn = "libraryDisplay.displayRecentTracks('1')"; break
					case "RecentlyPlayed": linkActionReturn = "libraryDisplay.displayRecentTracks('1')"; break
					case "RecentlyAdded": linkActionReturn = "libraryDisplay.displayAddedTracks('1')"; break
					case "AllTracks": linkActionReturn = "libraryDisplay.displayAllTracks('1')"; break
					case "ArtistByGenre": linkActionReturn = "libraryDisplay.displayArtistTracks('" + linkURLpieces[2] + "','','','','genre','" + linkURLpieces[3] + "')"; break
					case "Artist": linkActionReturn = "libraryDisplay.displayArtistTracks('" + linkURLpieces[2] + "','')"; break
					case "Album": linkActionReturn = "libraryDisplay.displayAlbumTracks('" + linkURLpieces[2] + "','')"; break
					case "Playlist": linkActionReturn = "libraryDisplay.displayTracksFromPlaylist('" + linkURLpieces[2] + "','')"; break
					default: dojo.debug(linkURLpieces[1]); dojo.debug(linkURL); linkActionReturn = linkURL;
				}
			} else {
				linkActionReturn = linkURL;
			}
			return linkActionReturn;
		}
		
		function openInNewWindow(e) {
			var event;
			if (!e) event = window.event;
			else event = e;
			// Abort if a modifier key is pressed
			if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) {
				return true;
			}
			else {
				// Change "_blank" to something like "newWindow" to load all links in the same new window
				var newWindow = window.open(this.getAttribute('href'), '_blank');
				if (newWindow) {
					if (newWindow.focus) {
						newWindow.focus();
					}
					return false;
				}
				return true;
			}
		}
		
		function logOut() {
			if (dojo.render.html.opera) {
				top.location.href='http://sms.de.napster.com/ns/logout/?return_url=1';
			}
			initialized = false;
			displayLoadingMessage();
			collection.store.initialize(false, false, true);
			
			var logoutInterval = setInterval( function(){
				if(initialized) {
					clearInterval(logoutInterval);
					top.location.href='http://sms.de.napster.com/ns/logout/?return_url=5';
				}
			}, 500);
		}
		
		function displayLoadingMessage() {
			dojo.byId("breadcrumb_bar").innerHTML = "";
			dojo.byId("content_head").innerHTML = "";
			dojo.byId("content_head").style.display = "none";
			dojo.byId("content_footer").innerHTML = "";
			// dojo.byId("content_footer").style.display = "none";
			displayBodyLoadingMessage();
		}
		
		function displayBodyLoadingMessage() {
			dojo.byId("content_body").innerHTML = loaderThrobberHtml;
		}
		
		function displaySignInPrompt() {
			if (dojo.io.cookie.get('SL') == 'VIS') {
				showVisitorPop();
			} else {
				alert("You must be logged in to use this feature.");
			}
		}
		
		function _evalExternalScript(url) {
			if(url && url != "") {
				var bindArgs = {
					url:        url,
					mimetype:   "text/plain",
					transport: "XMLHTTPTransport",
					error:      function(type, errObj){
						// handle error here
						dojo.debug("Bind Failed");
					},
					load:      function(type, dataIn, evt, ioRequest){
						try {
							eval(dataIn);
						} catch(e_e) {
							dojo.debug(e_e.message);
						}
					}
				};
				// dispatch the request
				var requestObj = dojo.io.bind(bindArgs);
			}
		}
		
		function loadBodyMessage(url) {
			if(url && url != "") {
				var bindArgs = {
					url:        url,
					mimetype:   "text/plain",
					transport: "XMLHTTPTransport",
					error:      function(type, errObj){
						// handle error here
						dojo.debug("Bind Failed");
					},
					load:      function(type, dataIn, evt, ioRequest){
						try {
							dojo.byId("content_body").innerHTML = dataIn;
						} catch(e_e) {
							dojo.debug(e_e.message);
						}
					}
				};
				// dispatch the request
				var requestObj = dojo.io.bind(bindArgs);
			}
		}
		
		function loadContent(url, target) {
			dojo.byId(target).innerHTML = "";
			dojo.byId(target).style.display = "block";
			if(url && url != "") {
				var bindArgs = {
					url:        url,
					mimetype:   "text/plain",
					transport: "XMLHTTPTransport",
					error:      function(type, errObj){
						// handle error here
						dojo.debug("Bind Failed");
					},
					load:      function(type, dataIn, evt, ioRequest){
						try {
							dojo.byId(target).innerHTML = dataIn;
						} catch(e_e) {
							dojo.debug(e_e.message);
						}
						initalizePageHeight();
					}
				};
				// dispatch the request
				var requestObj = dojo.io.bind(bindArgs);
			}
		}
		
		function sideBarNavigate(url, menuItemRef) {
			navigate(url, 0);
			gStickyToggle(menuItemRef);
		}
		
		nav = {
			initialize: function(url, isInitial, target, postAction) { // initialize variables, set up URLs
				this.urlPieces = new Array,
				this.buildUrl = "";
				this.dataUrl = "";
				this.fullResultsUrl = "";
				this.linkAction = "";
				this.postAction = "";
				this.errorMessage = "There was an error with the page you requested.";
				this.successfulLoad = false;
				
				if(typeof(target) == "undefined") {
					this.target = "fullPage";
				} else {
					this.target = target;
				}
				
				if(typeof(postAction) != "undefined") {
					if(postAction == "reposition") {
						this.postAction = "repositionDiv(nav.target, xClickPos, yClickPos)";
						// this.postAction = "repositionDiv(nav.target, Math.floor(ciWidth/2 - document.getElementById(nav.target).offsetWidth/2), Math.floor(ciHeight/2 - document.getElementById(nav.target).offsetHeight/2))";
					}
				}
				
				this.pageData = new Object();
				
				if(url == documentRoot && typeof(isInitial) == "undefined" && typeof(this.appState) == "undefined") {
					url += "ns/logout/";
					top.location.href = url;
					return false;
				}
				//console_log("in navigate(" + url + ")");
				if(!url) return false;
				
				if(url.indexOf("cgi-bin/searchXML") >= 0 && (url.indexOf("type=artist") >= 0 || url.indexOf("type=album") >= 0 || url.indexOf("type=track") >= 0) || url.indexOf("type=all") >= 0){
					if(url.indexOf("count=") == -1){
						url = url + "&count=10&index=0";
					}
				}
				if (gStickylink != "" || gStickylink == null) { dojo.html.removeClass(gStickylink, "stickylink"); }
				this.urlPieces = url.split(documentRoot, 2);
				currentSort = new Array();
				
				if(this.urlPieces[0] == "") {
					if(this.urlPieces[1].indexOf("MyLibrary") >= 0) {
						this.buildUrl = "";
						this.linkAction = getLinkAction(this.urlPieces[1]) ? getLinkAction(this.urlPieces[1]) : "";
					} else {
						if((this.urlPieces[1] == "ns/home/?genre_id=0") || (this.urlPieces[1] == "ns/home/")) {
							this.urlPieces[1] = "ns/home/?genre_id=00";
						}
						this.buildUrl = documentRoot + this.urlPieces[1];
						if(this.target == "fullPage") { displayLoadingMessage(); hideInPagePopups(); }
					}
				} else {
					if(url.indexOf("MyLibrary") >= 0) {
						this.buildUrl = "";
						this.linkAction = getLinkAction(url) ? getLinkAction(url) : "";
					} else {
						this.buildUrl = "/ns/home/?genre_id=00";
						if(this.target == "fullPage") { displayLoadingMessage(); hideInPagePopups(); }
					}
				}
				
				this.buildUrlInitial = this.buildUrl;
				
				if(this.target != "fullPage") {
					var innerLoaderThrobberHtml = "<div id=\"innerLoader\">" + loaderThrobberHtml + "</div>";
					try {
						dojo.byId(this.target).innerHTML = innerLoaderThrobberHtml;
					} catch(e) {
						body = document.getElementsByTagName("body");
						var newdiv = document.createElement('div');
						newdiv.setAttribute('id', this.target);
						newdiv.innerHTML = innerLoaderThrobberHtml;
						body[0].appendChild(newdiv);
					}
					// alert("!");
					dojo.byId("innerLoader").style.position = "absolute";
					// if(previousTarget == "fullPage" || previousTarget == "") { repositionDiv(this.target, xClickPos, yClickPos); }
					previousTarget = this.target;
					// console_log("pre-repositionDiv xPos: " + xPos + " yPos: " + yPos);
					repositionDiv("innerLoader", xPos, yPos);
					// repositionDiv("innerLoader", Math.floor(ciWidth/2 - document.getElementById("innerLoader").offsetWidth/2), Math.floor(ciHeight/2 - document.getElementById("innerLoader").offsetHeight/2));
				}
				
				return true;
			},
			
			appendUrlParams: function() { // Add user type and preferences to the URL
				var COUNTRYCODEvalue = "";
				var LFMvalue = "";
				var EXPLICITvalue = "";
				var ampVal = "&";
				COUNTRYCODEvalue = dojo.io.cookie.get('COUNTRYCODE');
				EXPLICITvalue = dojo.io.cookie.get('EXPLICIT');
				switch (dojo.io.cookie.get('SL')) {
					case 'NTG': LFMvalue = 'N'; break;
					case 'SUB': LFMvalue = 'N'; break;
					case 'VIS': LFMvalue = 'Y'; break;
					case 'LFM': LFMvalue = 'Y'; break;
					default: var navAttempt = encodeURIComponent(documentRoot + getLocationHash()); top.location.href = "http://sms.de.napster.com/ns/login/?return_url=" + navAttempt;
				}
				if( COUNTRYCODEvalue != null && COUNTRYCODEvalue != '' ){
					if(this.buildUrl != "" && ((this.buildUrl.lastIndexOf("/") != (this.buildUrl.length - 1))) && (this.buildUrl.indexOf("?") >= 0)) {
						if(!(this.buildUrl.indexOf(ampVal + "LFM=" + LFMvalue) >= 0) && !(this.buildUrl.indexOf("&LFM=" + LFMvalue) >= 0)) {
							this.buildUrl = this.buildUrl + ampVal + "LFM=" + LFMvalue;
						}
						if(!(this.buildUrl.indexOf(ampVal + "COUNTRYCODE=" + COUNTRYCODEvalue) >= 0) && !(this.buildUrl.indexOf("&COUNTRYCODE=" + COUNTRYCODEvalue) >= 0)) {
							this.buildUrl = this.buildUrl + ampVal + "COUNTRYCODE=" + COUNTRYCODEvalue;
						}
						if(!(this.buildUrl.indexOf(ampVal + "EXPLICIT=" + EXPLICITvalue) >= 0) && !(this.buildUrl.indexOf("&EXPLICIT=" + EXPLICITvalue) >= 0)) {
							this.buildUrl = this.buildUrl + ampVal + "EXPLICIT=" + EXPLICITvalue;
						}
					}
				} else {
					// top.location.href='http://sms.de.napster.com/ns/logout/';
				}
			},
			
			pageData: new Object(),
			
			processHtmlPieces: function() {
				if(this.target == "fullPage") {
					importStylesElement = dojo.byId("importStyles");
					if(importStylesElement) {
						document.body.removeChild(importStylesElement);
					}
					dojo.byId("loader").innerHTML = this.pageData.htmlData;
					fixLinks(dojo.byId("loader"));
					
					if (document.getElementById("importStyles")) {
						this.pageData.style_block = document.getElementById("importStyles");
					}
					else {
						// What's this? Well, webkit doesn't allow 'style' elements in the body. So...
						// you don't get it for free by simply overwriting the 'loader' div with htmlData.
						// We have to parse it out of htmlData and copy it for later use.
						var doc = (new DOMParser()).parseFromString(this.pageData.htmlData, "text/xml");
						this.pageData.style_block = doc.getElementById("importStyles")?doc.getElementById("importStyles").cloneNode(true):"";
					}
					this.pageData.breadcrumb_bar = document.getElementById("breadCrumb").innerHTML?document.getElementById("breadCrumb").innerHTML:"";
					this.pageData.content_head = document.getElementById("head").innerHTML?document.getElementById("head").innerHTML:"";
					this.pageData.content_body = document.getElementById("main").innerHTML?document.getElementById("main").innerHTML:"";
					this.pageData.content_footer = document.getElementById("footer").innerHTML?document.getElementById("footer").innerHTML:"";
					try {
						this.pageData.embeddedScriptURL = document.getElementById("embeddedExternalScript").getAttribute("src")?document.getElementById("embeddedExternalScript").getAttribute("src"):"";
					} catch(e_es) {
						this.pageData.embeddedScriptURL = "";
					}
				} else {
					dojo.byId("loader").innerHTML = this.pageData.htmlData;
					fixLinks(dojo.byId("loader"));
					if (document.getElementById("importStyles")) {
						this.pageData.style_block = document.getElementById("importStyles");
					}
					else {
						// What's this? Well, webkit doesn't allow 'style' elements in the body. So...
						// you don't get it for free by simply overwriting the 'loader' div with htmlData.
						// We have to parse it out of htmlData and copy it for later use.
						var doc = (new DOMParser()).parseFromString(this.pageData.htmlData, "text/xml");
						this.pageData.style_block = doc.getElementById("importStyles")?doc.getElementById("importStyles").cloneNode(true):"";
					}
					this.pageData.content_body = document.getElementById("main").innerHTML?document.getElementById("main").innerHTML:"";
					try {
						this.pageData.embeddedScriptURL = document.getElementById("embeddedExternalScript").getAttribute("src")?document.getElementById("embeddedExternalScript").getAttribute("src"):"";
					} catch(e_es) {
						this.pageData.embeddedScriptURL = "";
					}
				}
			},
			
			setHtml: function() {
				if(this.target == "fullPage") {
					if (this.pageData.style_block) { // this appears to work across firefox, IE and WebKit
						try {
							if (dojo.byId("importedStyles")) {
								document.getElementsByTagName("head")[0].removeChild(dojo.byId("importedStyles"));
							}
							this.pageData.style_block.setAttribute('id', 'importedStyles');
							document.getElementsByTagName("head")[0].appendChild(this.pageData.style_block);
							nav.successfulLoad = true;
						} catch(e) {
							console_log(e.message);
						}
					}
					try {
						dojo.byId("breadcrumb_bar").innerHTML = this.pageData.breadcrumb_bar;
						dojo.byId("content_head").innerHTML = this.pageData.content_head;
						embeddedScriptURL = this.pageData.embeddedScriptURL;
						if(dojo.byId("content_head") != null && dojo.byId("content_head").innerHTML != "") {
							dojo.byId("content_head").style.display = "block";
						} else {
							dojo.byId("content_head").style.display = "none";
						}
						if(dojo.byId("footer") == null) {
							dojo.byId("content_footer").innerHTML = "";
							dojo.byId("content_footer").style.display = "none";
						} else {
							dojo.byId("content_footer").innerHTML = this.pageData.content_footer;
							dojo.byId("content_footer").style.display = "block";
						}
						if(dojo.byId("main") == null) {
							dojo.byId("content_body").innerHTML = "";
						} else {
							dojo.byId("content_body").innerHTML = this.pageData.content_body;
						}
						_evalExternalScript(embeddedScriptURL);
					} catch(e) {
						// alert("e_a: " + e.message);
					}
				} else { // We're loading a partial content piece
					/* dojo.byId(this.target).style.position = "auto";
					dojo.byId(this.target).style.left = "auto";
					dojo.byId(this.target).style.top = "auto"; */
					try { // this appears to work across firefox, IE and WebKit
						if (dojo.byId(this.target + "Styles")) {
							document.getElementsByTagName("head")[0].removeChild(dojo.byId(this.target + "Styles"));
						}
						this.pageData.style_block.setAttribute('id', this.target + "Styles");
						document.getElementsByTagName("head")[0].appendChild(this.pageData.style_block);
					} catch(e) {
						console_log(e.message);
					}
					try {
						dojo.byId(this.target).innerHTML = this.pageData.content_body;
					} catch(e) {
						body = document.getElementsByTagName("body");
						var newdiv = document.createElement('div');
						newdiv.setAttribute('id', this.target);
						newdiv.innerHTML = this.pageData.content_body;
						body[0].appendChild(newdiv);
					}
					
					try {
						embeddedScriptURL = this.pageData.embeddedScriptURL;
						_evalExternalScript(embeddedScriptURL);
					} catch(e) {
					}
					addedPops.addUnique(this.target);
					dojo.byId(this.target).style.display = "block";
					// repositionDiv(this.target, xClickPos, yClickPos);
					this.successfulLoad = true;
				}
					
				dojo.byId("loader").innerHTML = ""; // clean up our loader div
			},
			
			processHtml: function(htmlData) {
				try {
					this.pageData.htmlData = htmlData;
				} catch(e1) { /* alert("e1: " + e1.message); */ }
				try {
					this.processHtmlPieces();
				} catch(e2) { /* alert("e2: " + e2.message); */ }
				try {
					this.setHtml();
				} catch(e3) { /* alert("e3: " + e3.message); */ }
			},
			
			processJsonContent: function() {
				displayBodyLoadingMessage();
				jsonDataReturn = (this.pageData.jsonData.result)?this.pageData.jsonData.result:this.pageData.jsonData.CONTENT;
				try {
					if(typeof(this.pageData.jsonData.search_pass) != "undefined") {
						if(this.pageData.jsonData.total_results == 0) { loadBodyMessage("/info/fragments/no_search_results.html"); }
						libraryDisplay.displaySearchMessage(this.pageData.jsonData.type,this.pageData.jsonData.search_pass,this.pageData.jsonData.total_results);
					}
				} catch(e) {  }
				if(typeof(jsonDataReturn[0].type) != "undefined") {
					if(typeof(this.pageData.jsonData.contentType == "undefined") || (this.pageData.jsonData.contentType == "") || (this.pageData.jsonData.contentType == "content_name")){ this.pageData.jsonData.contentType = jsonDataReturn[0].type; }
					if(this.pageData.jsonData.contentType == "billboard") { this.pageData.jsonData.contentType += jsonDataReturn[0].type; }
				}
				if(typeof(this.pageData.jsonData.BROWSE_RESULT) != "undefined") {
					if(typeof(this.pageData.jsonData.contentType == "undefined") || (this.pageData.jsonData.contentType == "") || (this.pageData.jsonData.contentType == "content_name")){
						this.pageData.jsonData.contentType = this.pageData.jsonData.BROWSE_RESULT.type?this.pageData.jsonData.BROWSE_RESULT.type:jsonDataReturn[0].type;
					}
					if(this.pageData.jsonData.contentType == "billboard") {
						this.pageData.jsonData.contentType += this.pageData.jsonData.BROWSE_RESULT.type?this.pageData.jsonData.BROWSE_RESULT.type:jsonDataReturn[0].type;
					}
				}
				this.pageData.jsonData.contentType = this.pageData.jsonData.contentType?this.pageData.jsonData.contentType:"playlists";
				displayList(this.pageData.jsonData.contentType, jsonDataReturn);
			},
			
			processJson: function(jsonData) {
				displayBodyLoadingMessage();
				this.pageData.jsonData = dojo.json.evalJson(jsonData);
				
				try { if(this.pageData.jsonData.BROWSE_RESULT.content_name) { this.pageData.jsonData.contentType = this.pageData.jsonData.BROWSE_RESULT.content_name.toLowerCase(); } } catch(err) { }
				try { if(this.pageData.jsonData.BROWSE_RESULT.type) { this.pageData.jsonData.contentType = this.pageData.jsonData.BROWSE_RESULT.type.toLowerCase(); } } catch(err) { }
				try { if(this.pageData.jsonData.DATA_URL) { this.dataUrl = this.pageData.jsonData.DATA_URL; } } catch(err) { }
				try { if(this.pageData.jsonData.BROWSE_RESULT.member_id) { filter_value = this.pageData.jsonData.BROWSE_RESULT.member_id } } catch(err) { }
				if((this.dataUrl == "") || (this.pageData.jsonData.HTML_OUTPUT != "" && this.pageData.jsonData.CONTENT != "")){
					if(this.pageData.jsonData.HTML_OUTPUT) {
						this.processHtml(this.pageData.jsonData.HTML_OUTPUT);
					}
					nav.processJsonContent();
				} else {
					var bindDataArgs = {
						url:        nav.dataUrl,
						parentUrl:	nav.buildUrl,
						mimetype:   "text/plain",
						transport: "XMLHTTPTransport",
						error:      function(type, errObj){
							dojo.debug("Data Bind Failed for json url: " + nav.dataUrl);
							nav.successfulLoad = false;
							libraryDisplay.displayEmptyPage(nav.dataUrl);
						},
						load:      function(type, dataIn, evt, ioRequest){
							if(this.parentUrl == nav.buildUrl) { // Make sure the URL attached to our JSON request matches our current URL.
								var contentTypeTemp = nav.pageData.jsonData.contentType; // Need to persist the existing contentType
								nav.pageData.jsonData = dojo.json.evalJson(dataIn);
								nav.pageData.jsonData.contentType = contentTypeTemp; // Add the previous contentType to the new jsonData
								nav.processJsonContent();
							}
						}
					}
					if(nav.pageData.jsonData.HTML_OUTPUT) {
						nav.processHtml(this.pageData.jsonData.HTML_OUTPUT);
					}
					var requestDataObj = dojo.io.bind(bindDataArgs);
				}
			},
			
			load: function(type, dataIn, evt, ioRequest){ // Handle the ajax return
				//displayUMessage("", 1);
				if((this.buildUrl.indexOf("cgi-bin") >= 0) || (this.buildUrl.indexOf("search-cgi") >= 0)) { // we have a JSON page
					this.jsonPage = true;
					this.processJson(dataIn);
				} else {
					this.jsonPage = false;
					this.processHtml(dataIn);
				}
				if(nav.successfulLoad && nav.target == "fullPage") {
					ioRequest.appState = new ApplicationState(nav.buildUrlInitial);
				} else {
					if(nav.successfulLoad) {
						eval(nav.postAction);
					}
				}
				initDrag();
				//update site catalyst
				try {
					runSCPageLoad(nav.urlPieces[1]);
					/* if(this.target == "fullPage") {
						runSCPageLoad();
					} else {
						runSCPageLoad(nav.buildUrl);
					} */
				} catch(sc_e) {
					//alert(sc_e.message);
				}
				initalizePageHeight();
			},
			
			reload: function(){ // Handle instances where user type changes (ie - when purchasing a track in visitor mode)
				// alert("nav - " + nav.buildUrl + " this - " + this.buildUrl)
				locationHash = getLocationHash();
				top.location.href = "http://sms.de.napster.com/ns/login/?return_url=" + encodeURIComponent(documentRoot + "#" + locationHash.substring(1));
			}
		}
		
		function navigate(url, isInitial, target, postAction) {
			if(!nav.initialize(url, isInitial, target, postAction)) { return; }
			nav.appendUrlParams();
			
			if(nav.buildUrl != "/blank.html" || "") { dojo.debug(url); }
			if(nav.buildUrl && nav.buildUrl != "") {
				// turn on the visitor mode undercarriage
				setUndercarriage(nav.buildUrl);
				var bindArgs = {
					url:        nav.buildUrl,
					mimetype:   "text/plain",
					method:		"GET",
					transport: "XMLHTTPTransport",
					error:      function(type, errObj){
						// handle error here
						dojo.debug("Bind Failed");
						
						dojo.byId("content_body").innerHTML = errorMessage;
						dojo.debug("bind error: " + errObj);
						var outln = "";
						for(var i in errObj) {
							dojo.debug(i);
							outln += i + ' is ' + errObj[i] + "\n";
							var splitIt = errObj[i].split(": ");
							if (splitIt.length > 0) {
								var bob = (splitIt[1]);
								dojo.debug(splitIt);
								try{ 
									var junk = eval(bob);
								} catch(e) { dojo.debug(e.description); }
							}
						}
					},
					load:	function(type, dataIn, evt, ioRequest){
						nav.load(type, dataIn, evt, ioRequest);
					}
				};
				// Only attach history items if we're changing the main frameset so we don't add history for in-page pop-ups
				if(nav.target == "fullPage") {
					bindArgs.changeURL = nav.urlPieces[1];
					bindArgs.back = function() {
						// dojo.debug("Back: " + this.appState);
						if(this.appState) this.appState.back();
						/* var self = this;
						alert(this.changeURL);
						navigate(documentRoot + this.changeURL); */
						// if(self.appState) setTimeout("self.appState.back()", 100);
					}
					bindArgs.forward = function() {
						navBind = this;
						if(this.appState) setTimeout("navBind.appState.forward()", 100);
					}
				}
				if(nav.urlPieces[1].indexOf('ns/purchase/clear/inpage/') >= 0) {
					// bindArgs.method = "POST";
				}
				// dispatch the request
				var requestObj = dojo.io.bind(bindArgs);
			} else {
				historyUrl = nav.urlPieces[0] ? nav.urlPieces[0] : nav.urlPieces[1];
				if( dojo.io.cookie.get('USERNAME') != null && dojo.io.cookie.get('USERNAME') != "" ) {
					if(nav.urlPieces[1] != "MyLibrary/AllTracks") { // We don't want to blow away the current page if they cancel the all tracks view
						displayLoadingMessage();
					}
					eval(nav.linkAction);
					initalizePageHeight();
					//update site catalyst
					try {
						runSCPageLoad(historyUrl);
					} catch(sc_e) {
						//alert("SC Message: " + sc_e.message);
					}
				} else {
					displaySignInPrompt();
				}
			}
			document.title = "Napster"; // Fix for IE7 appending anchor link to page title
		}
		
		function refreshContent() {
			activeDisplay = "";
			navigate(documentRoot + window.location.hash.substring(1)); //refresh our current view by navigating to the page we were on
		}
		
		function displayList(contentTypeIn, jsonDataReturnIn, filterValue) {
			// dojo.debug("in displayList(" + contentTypeIn + "," + jsonDataReturnIn.toSource() + ")");
			// dojo.debug("in displayList(" + contentTypeIn + ")");
			if(nav.buildUrl.indexOf("&count=10&index=0") >= 0 && nav.pageData.jsonData.total_results > 10){
				nav.fullResultsUrl = nav.buildUrl.replace("&count=10&index=0","&count=500&index=0");
			}
			currentContentType = contentTypeIn;
			switch(contentTypeIn.toLowerCase()) {
				case "album": libraryDisplay.displayAlbums(jsonDataReturnIn); break
				case "topalbums": libraryDisplay.displayAlbums(jsonDataReturnIn); break
				case "billboard_album": libraryDisplay.displayAlbums(jsonDataReturnIn); break
				case "artistalbum": libraryDisplay.displayAlbums(jsonDataReturnIn); break
				case "recommends": libraryDisplay.displayAlbums(jsonDataReturnIn); break
				case "recommends_album": libraryDisplay.displayAlbums(jsonDataReturnIn); break
				case "staffpick": libraryDisplay.displayAlbums(jsonDataReturnIn); break
				case "newrelease": libraryDisplay.displayAlbums(jsonDataReturnIn); break
				case "track": libraryDisplay.displayTracks(jsonDataReturnIn, "track"); break
				case "toptracks": libraryDisplay.displayTracks(jsonDataReturnIn, "track"); break
				case "billboard_track": libraryDisplay.displayTracks(jsonDataReturnIn, "billboardtrack"); break
				case "albumtracks": libraryDisplay.displayTracks(jsonDataReturnIn, "albumtracks"); break
				case "albumtracks_track": libraryDisplay.displayTracks(jsonDataReturnIn, "albumtracks"); break
				case "artist": libraryDisplay.displayArtists(jsonDataReturnIn); break
				case "artistbyletter": libraryDisplay.displayArtists(jsonDataReturnIn); break
				case "topartists": libraryDisplay.displayArtists(jsonDataReturnIn); break
				case "radio": libraryDisplay.displayRadio(jsonDataReturnIn); break
				case "stations": libraryDisplay.displayRadio(jsonDataReturnIn); break
				case "playlist": libraryDisplay.displayPlaylistTracks(jsonDataReturnIn, 0); break
				case "playlists": libraryDisplay.displayPlaylist(jsonDataReturnIn); break
				case "allplaylist": libraryDisplay.displayPlaylist(jsonDataReturnIn); break
				case "video": libraryDisplay.displayVideos(jsonDataReturnIn); break
				case "artistvideos": libraryDisplay.displayVideos(jsonDataReturnIn); break
				case "videosbyletter": libraryDisplay.displayVideos(jsonDataReturnIn); break
				case "user": libraryDisplay.displayUsers(jsonDataReturnIn); break
				case "memberartists": libraryDisplay.displayMemberArtists(jsonDataReturnIn,filterValue); break
				case "memberplaylists": libraryDisplay.displayMemberPlaylists(jsonDataReturnIn,filterValue); break
				
				case "libraryartisttracks": libraryDisplay.updatePagination(jsonDataReturnIn); libraryDisplay.displayPageOfTracks("1"); break
				case "libraryaddedtracks": libraryDisplay.displayAddedTracks('1',jsonDataReturnIn); break
				case "libraryrecenttracks": libraryDisplay.displayRecentTracks('1',jsonDataReturnIn); break
				case "libraryalltracks": libraryDisplay.displayAllTracks('1',jsonDataReturnIn); break
				case "libraryplaylisttracks": libraryDisplay.displayPlaylistTracks(jsonDataReturnIn,1); break
				
				default: libraryDisplay.displayTracks(jsonDataReturnIn, contentTypeIn); break
			}
		}
		
		function removeAddedPops(closeTarget) {
			if(typeof(closeTarget) == "undefined") { closeTarget = ""; }
			for (var i = 0; i < addedPops.length; i++) {
				elemId = addedPops.shift();
				if(closeTarget) {
					if(closeTarget != elemId) {
						addedPops.addUnique(elemId);
						continue
					}
				}
				try {
					elemToRemove = dojo.byId(elemId);
					document.body.removeChild(elemToRemove);
				} catch(e){ }
				try {
					elemToRemove = dojo.byId(elemId + "Styles");
					document.body.removeChild(elemToRemove);
				} catch(e){ }
		    }
			
			previousTarget = "";
		}
		
		function hideInPagePopups() {
			hideAlbumArtPop();
			hidePlaylistPop();
			ripRenPlaylistPop();
			removeAddedPops();
		}
		
		dojo.addOnLoad( fixLinks );
		dojo.addOnLoad(function(){
			//wait until we have an initialized library before doing anything
			var objInterval = setInterval( function(){
				if(initialized && menuInitialized){
					clearInterval( objInterval );
					//See if there is a bookmark hash on the page URL.
					var bookmarkId = getLocationHash();
					if(bookmarkId && bookmarkId != "#ns/home/?genre_id=00" && bookmarkId != "#ns/home/?genre_id=0" && bookmarkId != "#"){
						bookmarkId = bookmarkId.substring(1, bookmarkId.length);
					} else {
						if(initialURL != "") {
							bookmarkId = fixedLinkFromURL(initialURL, 1);
						} else {
							bookmarkId = "ns/home/?genre_id=00";
						}
					}

					//If we have a bookmark, load that as the initial state.
					if(bookmarkId){
						buildUrl = documentRoot + bookmarkId;
						// alert("have a bookmark");
						//dojo.undo.browser.setInitialState("Initial State:" + bookmarkId);
						var appState = new ApplicationState(documentRoot);
						dojo.undo.browser.setInitialState(appState);
						//dojo.undo.browser.setInitialState({back:function(){},forward:function(){}});
						navigate(buildUrl, true);
					}else{
						// var appState = new ApplicationState("This is the initial state (page first loaded, no dojo.io.bind() calls yet)", "output", "dataOutput");
						// appState.showStateData();
						// dojo.undo.browser.setInitialState(appState);
						buildUrl = documentRoot + bookmarkId;
						dojo.undo.browser.setInitialState("Initial State: blank");
						var appState = new ApplicationState(documentRoot + "blank.html");
						navigate(documentRoot + "blank.html", true);
						dojo.undo.browser.setInitialState(appState);
					}
				}
			}, 50 );
		});

		function Buy(strIds, intType, isAFS) { //NOTE: this function has been mirrored in player.js so we can always launch from the player
			//NOTE: this function has also been duplicated on free.napster.com - in global.js
			console_log("buy");
			/* //mattnote: visitor mode check and popup
			if (dojo.io.cookie.get('SL') == 'VIS') {
				showVisitorPop();
				return;
			} */
			
			var opCode;
			var type = parseInt(intType);
			var purchaseString = "ids=" + strIds + "&type=";
			
			switch(type) {
				case 0:
					strIds = new String(strIds);
					if(strIds == "0" || strIds.indexOf(",") > 0) {
						if(strIds == "0") {
							var itemArray = getAllListReturnTracks();
							if(itemArray) {
								strIds = itemArray.join(",");
								purchaseString = "ids=" + strIds + "&type=";
							}
						}
					} else { // Launch in-page purchase prompt
						// navigate("http://home.de.napster.com/ns/purchase/clear/inpage/?ids=" + strIds + "&type=track", 0, "trackPurchase", "reposition");
						// navigate("http://home.de.napster.com/ns/install/" + strIds , 0);
						// return;
					}
					opCode = 'op=download_tracks&perm=y&ids=' + strIds;
					purchaseString += "track";
					break;
				case 1:
					opCode = 'op=download_album&perm=y&ids=' + strIds;
					purchaseString += "album";
					if (isAFS != null && typeof(isAFS) != 'undefined') {
						// opCode += '&afs=' + (isAFS ? 1 : 0);
						purchaseString += "&afs=" + (isAFS ? 1 : 0);
					}
					break;
				case 2:
                                        opCode = 'op=add_to&type_id=playlist&perm=y&ids=' + strIds + '&destination=playlist';
                                        purchaseString += "playlist";
					// opCode = 'op=add_to&type_id=playlist&perm=y&ids=' + strIds;
					//purchaseString += "playlist";
					// ids need to change - prepend "MIX_"
					// purchaseString = "ids=MIX_" + strIds + "&type=admin_playlist";
					break;
				case 3:
					// Personal Playlist
					// opCode = 'op=add_to&type_id=playlist&perm=y&ids=' + strIds + '&destination=playlist';
					var pid     = strIds;
					var tracks  = new String;
					currentPlaylistTracks = collection.store.getPlaylistTracks(pid);
					var comma = "";
					for (var t = 0; t < currentPlaylistTracks.length; t++)  {
						tracks += (comma +  currentPlaylistTracks[t].track_id);
						comma = ",";
					}
					opCode = 'op=download_tracks&perm=y&ids=' + tracks;
					purchaseString += "track";
                                        break;
				case 7:
					opCode = 'op=download_work&perm=y&ids=' + strIds;
					purchaseString += "work";
					break;
				default:
					return;
			}
			if(purchaseString) {
				// var purchasePop = window.open("http://home.de.napster.com/ns/purchase/clear/?" + purchaseString,"purchaseWin", "width=810,height=500,menubar=no,location=yes,resizable=yes,scrollbars=yes,status=yes");
//				var purchasePop = window.open("https://sms.napster.com/DE/de/ns/purchase/clear/?" + purchaseString,"purchaseWin", "width=810,height=500,menubar=no,location=yes,resizable=yes,scrollbars=yes,status=yes");
//				purchasePop.focus();
				if (dojo.io.cookie.get('SL') == 'VIS') {
					var success = $OC( opCode, dojo.io.cookie.get('LID'), 'window.open(\'http://sms.de.napster.com/ns/install/?opcode=' + escape(opCode.substring(3)) + '\',\'install\')');
				}
				else {
					var success = $OC( opCode, dojo.io.cookie.get('LID'), 'window.open(\'http://sms.de.napster.com/ns/install/?referral_id=NCOM&opcode=' + escape(opCode.substring(3)) + '\',\'install\')');
				}
				//var success = $OC( opCode, dojo.io.cookie.get('LID'), 'window.open(\'http://home.de.napster.com/ns/purchase/?referral_id=NCOM&opcode=' + escape(opCode.substring(3)) + '\',\'install\')')
				
			}
		}
	

	function setUndercarriage(loc) {
		var slCookie = dojo.io.cookie.get('SL');
		if(slCookie == 'VIS') {
			if(dojo.byId('vmode_undercarriage').style.display = 'none') {
				// if we're not on the marketing page, turn it on
				if(loc.indexOf('marketing/visitor.html') < 0) {
					dojo.byId('vmode_undercarriage').style.display = 'block';
				}
			}
			else {
				// it's on already so turn it off if we're on the marketing page
				if(loc.indexOf('marketing/visitor.html') > -1) {
					dojo.byId('vmode_undercarriage').style.display = 'none';
				}
			}
		}
	}

	
	Array.prototype.addUnique = function (elem) {
		for (var i = 0, len = this.length; i < len; i++) {
			if (this[i] == elem) { return; }
	    }
		this.push(elem);
	  }
