
function CookieManager(){}

/** For more information on these cookies, please refer to the documentation attached to bug 199824 **/

CookieManager.SESSION = "RhapWeb.Session";
CookieManager.PERMANENT = "RhapWeb.Permanent";
CookieManager.PERMANENT_USER = "RhapWeb.PermanentUser";

CookieManager.SESSION_COOKIE_LIST = new Array(
	"autoReloadingTime", "AlreadySentToWelcomePage", "alreadyLoggedCampaignEvent",
	"agreedToUseAnonymousAccount", "RhapPlayerShowUpsells", "doPlayerLoadWithoutTrackLoad",
	"alreadyShowedPlaysLeftOverlay", "RhapPlayerDebug", "simulateUdsError",
	"RhapPlayer.TrackList", "RhapPlayer.hasSeenPopupTip" );

CookieManager.PERMANENT_USER_COOKIE_LIST = new Array(
	"libStateMgr", "RhapWeb.AuthKey", "RhapWeb.RhapUser", "RhapWeb.RhapMember", 'srvrDt', 'srvrDelta' );

CookieManager.PERMANENT_COOKIE_LIST = new Array(
	"didAutoplayBounce", "rhapsodyInstalled", "rhapwebPluginVersion", "rhapwebPluginInstalled", "rhapwebFlashInstalled", 
	"autoPlayChoice", "editRemind", "playedMusic", "rhapPlayerRandom", "hasPurchasedMusic",
	"RhapWeb.RhapPrefs", "has-seen-b-test", "trialCookieExpire", "trialCookieNoThanks", "anon_cart", "lastViewedUrl", "lastViewedUrlStore",
	"welcome-overlay", "flashPlayerRequiredMsgOverlay", 'RhapsodySampleModeSegment', 'downloadSettings' );

CookieManager.DELETE_ME = "RhapWeb.DeleteMe.Value";

/** Retreives the value of a specified cookie.
 *	@param	name	the name of the cookie to look up
 *	@returns the cookie's stored value
 */
CookieManager.getCookie = function( name, packageName, okToReturnDeleteMe ) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) {
			var cookieValue = unescape( c.substring(nameEQ.length,c.length) );
			if( cookieValue == CookieManager.DELETE_ME ) {
				return okToReturnDeleteMe ? CookieManager.DELETE_ME : null;
			}
			else {
				return cookieValue;
			}
		}
	}
	
	if( packageName ) {
		var cookieValueFromPackage = CookieManager.getCookieMemberByName( packageName, name );
		return cookieValueFromPackage;
	}
	
	return null;
}

CookieManager.getCookieMemberByName = function( name, memberName, packageName )
{
	var cookieHashString = CookieManager.getCookie( name, packageName );
	if( cookieHashString != null ){
    cookieHashString = cookieHashString.replace('"', '');
		var cookieHashStringArray = cookieHashString.split( "&" );
		for( var i=0; i<cookieHashStringArray.length; i++ ){
			var hashPair = cookieHashStringArray[i].split( "=" );
			var hashName = hashPair[0];
			var hashValue = hashPair[1];
			if( hashName == memberName ) return unescape(hashValue);
		}
	}
	return null;
}

/** Sets the value and meta data for a named cookie.
 *	@param	name			the name of the cookie
 *	@param	value			string value to store in the cookie
 *	@param	lifeInMillis	number of milliseconds before the cookie expires
 *	@param	path			the path to which this cookie is assigned
 *	@param	cookieDomain	the domain to which this cookie is assigned
 *	@param	secure			boolean indicating whether this cookie is to be stored securely
 */
CookieManager.setCookie = function( name, value, lifeInMillis, path, cookieDomain, secure )
{
	if ( lifeInMillis )
	{
		var date = new Date();
		date.setTime( date.getTime() + lifeInMillis );
		var expires = date.toGMTString();
	}
	else
	{
		var expires = null;
	}
	var cookie = name + "=" + escape(value) +
						( expires ? "; expires=" + expires : "" ) +
						( path ? "; path=" + path : "; path=/" )  +
						( cookieDomain ? "; domain=" + cookieDomain : "; domain=.rhapsody.com" ) +
						( secure ? "; secure" : "" );
	document.cookie = cookie;
	
}


/** Determines if a named cookie currently exists with a non-null value.
 *	@param	name	the name of the cookie to test.
 *	@returns true if the cookie exists with a non-null value or false otherwise.
 */
CookieManager.hasCookie = function( name, packageName ) {
	return CookieManager.getCookie( name, packageName ) != null;
}


/** Removes a named cookie
 *	@param	name	the name of the cookie to remove.
 */
CookieManager.deleteCookie = function( name ) {
	CookieManager.setCookie( name, CookieManager.DELETE_ME, 100000 );
}

CookieManager.actuallyDeleteCookie = function( name ) {
	CookieManager.setCookie( name, "", -100000 );
}

CookieManager.doCookieConsolidation = function( packageName, sourceCookies, isPermanent ) {
	// At some point, this might get set to true...
	var shouldSetPackageCookie = false;

	// Go through each cookie, and determine what its value ought to be (either from the 
	// source cookie itself or from the package cookie)...
	var currentValues = new Array();
	var packageCookieValue = CookieManager.getCookie( packageName );
	for( var i=0 ; i < sourceCookies.length ; i++ ) {
		var sourceCookieName = sourceCookies[i];
		var sourceCookieValueFromPackageCookie = null;
		if( packageCookieValue ) {
			sourceCookieValueFromPackageCookie = CookieManager.getCookieMemberByName( packageName, sourceCookieName );
		}
		var sourceCookieValue = CookieManager.getCookie( sourceCookieName, null, true );
		
		if( sourceCookieValue==CookieManager.DELETE_ME ) {
			// Source-cookie is set to be deleted; set the value to null...
			sourceCookieValue = null;
			shouldSetPackageCookie = true;
			currentValues[ sourceCookieName ] = null;
		}
		else if( sourceCookieValue && sourceCookieValueFromPackageCookie && sourceCookieValue!=sourceCookieValueFromPackageCookie ) {
			// Package-cookie and source-cookie both have value, but they don't match; use the source-cookie's value...
			shouldSetPackageCookie = true;
			currentValues[ sourceCookieName ] = sourceCookieValue;
		}
		else if( sourceCookieValue && !sourceCookieValueFromPackageCookie ) {
			// Value isn't in the package-cookie, need to set it to the source-cookie's value...
			shouldSetPackageCookie = true;
			currentValues[ sourceCookieName ] = sourceCookieValue;
		}
		else if( !sourceCookieValue && sourceCookieValueFromPackageCookie ) {
			// Source-cookie is gone, need to keep the package-cookie value...
			shouldSetPackageCookie = true;
			currentValues[ sourceCookieName ] = sourceCookieValueFromPackageCookie;
		}
		else {
			// Just resetting the same value back into the package-cookie...
			currentValues[ sourceCookieName ] = sourceCookieValue;
		}
		CookieManager.actuallyDeleteCookie( sourceCookieName );
	}
	
	// Now, if there was anything that needs to be updated in the package cookie, go 
	// ahead and set the package cookie...
	if( shouldSetPackageCookie ) {
		var newPackageCookieValue = "";
		for( var i=0 ; i < sourceCookies.length ; i++ ) {
			var cookieName = sourceCookies[i];
			var cookieValue = currentValues[cookieName];
			if( cookieValue ) {
				if( newPackageCookieValue.length ) { newPackageCookieValue += "&"; }
				newPackageCookieValue += cookieName + "=" + escape(cookieValue);
			}
		}
		if( isPermanent ) {
			var date = new Date();
			date.setTime( date.getTime() + 1000 * 3600 * 24 * 500 ); // 500 days
			var expires = date.toGMTString();
			document.cookie = packageName + "=" + escape(newPackageCookieValue) + "; expires=" + expires + "; path=/; domain=.rhapsody.com;";
		}
		else {
			document.cookie = packageName + "=" + escape(newPackageCookieValue) + "; path=/; domain=.rhapsody.com;";
		}
	}
}

CookieManager.doCookieConsolidation( CookieManager.SESSION, CookieManager.SESSION_COOKIE_LIST, false );
CookieManager.doCookieConsolidation( CookieManager.PERMANENT_USER, CookieManager.PERMANENT_USER_COOKIE_LIST, true );
CookieManager.doCookieConsolidation( CookieManager.PERMANENT, CookieManager.PERMANENT_COOKIE_LIST, true );



/**
 *	@class Static class for global cookie operations
 *	@constructor
 *	@param	groupName	the name of this cookie group
 */

function CookieGroup( groupName )
{
	this.__prefix = groupName ? groupName + "." : "";
}

/**
 *	namespace prefix for this group
 *	@private
 */
CookieGroup.prototype.__prefix = null;


/** Retreives the value of a specified cookie in this group.
 *	@param	name	the name of the cookie to look up
 *	@returns the cookie's stored value
 */
CookieGroup.prototype.getCookie = function( name, packageName )
{
	return CookieManager.getCookie( this.__getFullName( name ), packageName );
}

/** Sets the value and meta data for a named cookie in this group.
 *	@param	name			the name of the cookie
 *	@param	value			string value to store in the cookie
 *	@param	lifeInMillis	number of milliseconds before the cookie expires
 *	@param	path			the path to which this cookie is assigned
 *	@param	cookieDomain	the domain to which this cookie is assigned
 *	@param	secure			boolean indicating whether this cookie is to be stored securely
 */
CookieGroup.prototype.setCookie = function( name, value, lifeInMillis, path, domain, secure )
{
	CookieManager.setCookie( this.__getFullName( name ), value, lifeInMillis, path, "rhapsody.com", secure );
}

/** Determines if a named cookie currently exists in this group with a non-null value.
 *	@param	name	the name of the cookie to test.
 *	@returns true if the cookie exists with a non-null value or false otherwise.
 */
CookieGroup.prototype.hasCookie = function( name, packageName )
{
	return CookieManager.hasCookie( this.__getFullName( name ), packageName )
}

/** Removes a named cookie from this group
 *	@param	name	the name of the cookie to remove.
 */
CookieGroup.prototype.deleteCookie = function( name )
{
	return CookieManager.deleteCookie( this.__getFullName( name ) )
}

/** Builds the fully-qualified name of a cookie in this group
 *	@private
 *	@param	name	the local name of the cookie.
 */
CookieGroup.prototype.__getFullName = function( name )
{
	return this.__prefix + name;
}

CookieGroup.prototype.appendToCookie = function (cookie, nvObjs, life, packageName){
	var originalCookieValueObjectArray = new Array();
	var cookieValueObjectArray = new Array();
	var cookieValueString = "";
	var delimiter = "";
	if (this.hasCookie(cookie, packageName)){
		var cookieHashString = this.getCookie(cookie, packageName);
		if( cookieHashString != null ){
			var cookieHashStringArray = cookieHashString.split( "&" );
			for( var i=0; i<cookieHashStringArray.length; i++ ){
				var hashPair = cookieHashStringArray[i].split( "=" );
				originalCookieValueObjectArray.push( { cookieName: hashPair[0], cookieValue: hashPair[1] } );
			}
		}
	}
	if( RhapsodyUtility.isArray( nvObjs ) ){
		for( var i=0; i<nvObjs.length; i++ ){
			var theCookieName = nvObjs[i].cookieName;
			var theCookieValue = ( nvObjs[i].cookieValue == "" ) ? 'null' : nvObjs[i].cookieValue;
			cookieValueObjectArray.push( { cookieName: theCookieName, cookieValue: theCookieValue } );
		}
	} else if( typeof nvObjs == 'object' ) {
		var theCookieName = nvObjs.cookieName;
		var theCookieValue = ( nvObjs.cookieValue == "" ) ? 'null' : nvObjs.cookieValue;
		cookieValueObjectArray.push( { cookieName: theCookieName, cookieValue: theCookieValue } );
	} else return false;
	
	for( var i=0; i<cookieValueObjectArray.length; i++ ){
		for( var j=0; j<originalCookieValueObjectArray.length; j++ ){
			if( originalCookieValueObjectArray[j].name != cookieValueObjectArray[i].name ) cookieValueObjectArray.push( originalCookieValueObjectArray[j] );
		}
	}
	
	for( var i=0; i<cookieValueObjectArray.length; i++ ){
		cookieValueString += delimiter + cookieValueObjectArray[i].cookieName + "=" + cookieValueObjectArray[i].cookieValue;
		delimiter = "&";
	}
	if( this.getCookie( cookie, packageName ) != cookieValueString ) {
		this.setCookie( cookie, cookieValueString, life );
	}
} 
	


function isInWmp() {
	try {
		if(opener.window.external.version && opener.window.external.version != "" && opener.window.external.version != "undefined"){
			return true;
		}
	} catch (e) {
		return false;
	}
	return false;
}

var guidWasChangedInThisPage = false;

function setGuidInCookie(guid, rememberMe){
	guidWasChangedInThisPage = true;
	var cookieGroup = new CookieGroup("RhapWeb");
	if (rememberMe) {
		/* set it for a month */ 
		cookieGroup.setCookie("RhapAuth","guid="+guid,2629743000);
	} else if (isInWmp()) {
		/* Set a short permenant cookie for the wmp integratgion */
		cookieGroup.setCookie("RhapAuthWMP","guid="+guid,600000);
	} else {
		/* Set it for the session */
		cookieGroup.setCookie("RhapAuth","guid="+guid,null);
	}
	cookieGroup.setCookie("AuthKey","",null);
}

function setRhapFlashInstalledCookie( ) {
	try {
		var COOKIE_LIFE_DAYS = 700;
		var expireDate = new Date();
		expireDate.setTime( expireDate.getTime() + COOKIE_LIFE_DAYS*24*60*60*1000 );
	
		var theRhapFVersionString;
		
		if( RhapsodyPlayer.getFlashApp("embedded")!=null ) {
			theRhapFVersionString = "rhapE_" + RhapsodyPlayer.getFlashApp("embedded").getPlayerVersion(); 
		}
		else if( RhapsodyPlayer.getFlashApp("popout")!=null ) {
			theRhapFVersionString = "" + RhapsodyPlayer.getFlashApp("popout").getPlayerVersion(); 
		}
		else {
			return; 
		}
		
		document.cookie = "rhapwebFlashInstalled=" + theRhapFVersionString + "; path=/; domain=.rhapsody.com; expires="+expireDate.toGMTString()+";";
	}
	catch( e ) {
		debug("Exception:"+e);
	}
}

function setTokenInCookie(token, rememberMe){
	var cookieGroup = new CookieGroup("RhapWeb");
	if (rememberMe) {
		/* set it for a month */ 
		cookieGroup.setCookie( "FlashToken","token="+escape(token), 2629743000 );
	} else {
		/* Set it for the session */
		cookieGroup.setCookie( "FlashToken","token="+escape(token), null );
	}
}

function setSubTypeInCookie(subtype, rememberMe){
	var cookieGroup = new CookieGroup("RhapWeb");
	if (rememberMe == "true") {
		/* set it for a month */ 
		cookieGroup.setCookie("RhapUser","subtype="+subtype,2629743000);
	} else if (isInWmp()) {
		/* Set a short permenant cookie for the wmp integratgion */
		cookieGroup.setCookie("RhapUser","subtype="+subtype,600000);
	} else {
		/* Set it for the session */
		cookieGroup.setCookie("RhapUser","subtype="+subtype,null);
	}
}

function setAnonGuidInCookie(guid){
	var cookieGroup = new CookieGroup("RhapWeb");
	cookieGroup.setCookie("RhapAnon","anonguid="+guid,2629743000);
}

function setUserNameInCookie(username, rememberMe){
	var cookieGroup = new CookieGroup("RhapWeb");
	if (rememberMe == "true") {
		/* set it for a month */
		cookieGroup.setCookie("RhapUser","username="+username,2629743000);
	} else if (isInWmp()) {
		/* Set it for ten minutes */
		cookieGroup.setCookie("RhapUser","username="+username,600000);
	} else {
		/* Set it for the session */
		cookieGroup.setCookie("RhapUser","username="+username,null);
	}
} 

function getUserNameFromCookie(){
	var mReturn = CookieManager.getCookie( "RhapWeb.RhapUser", CookieManager.PERMANENT_USER );
	return mReturn ? mReturn : "";
}

function setWMPDetectCookie(){
	var cookieGroup = new CookieGroup("RhapWeb");
	cookieGroup.setCookie("wmp","inWMP=true",null);
}


function getCookieByGroup(group, cookie, packageName) {
	var cookieGroup = new CookieGroup(group);
	return cookieGroup.getCookie(cookie, packageName);
}

function hasCookieByGroup(group, cookie, packageName) {
	var cookieGroup = new CookieGroup(group);
	return cookieGroup.hasCookie(cookie, packageName);
}

