// ---------------------------------------------
//                Sample playing
// ---------------------------------------------
STOPPED = 1;
LOADING = 2;
PLAYING = 3;
ERROR = 4;

var gHomePage = 'http://www.pandora.com/';
var gCurrentSample = null;
var gCurrentName = null;
var gSampleState = STOPPED;
var gTimeoutID = null;
var gTimeoutStep = -1;
var gTokenList = [];
var gCurrentDisc = 0;

// This function assumes the samples have no unique "name" appended to the tokens
function playAllSamples(/*int*/ discNum, /*string[]*/ tokenList) {
	stopCurrentSample(false);
	gTokenList = tokenList;
	gCurrentDisc = discNum;
	var img = getDiv("sampleAllStop" + gCurrentDisc);
	if (img) {
		img.style.display = "inline";
	}
	img = getDiv("sampleAllPlay" + gCurrentDisc);
	if (img) {
		img.style.display = "none";
		img.src = gHomePage + 'images/sample-all.gif'
	}
	playNextSample();
}

function playNextSample(/*string*/ name) {
	if (gTokenList.length > 0) {
		var token = gTokenList.shift();
		playSampleAudio(token, "", true, true);
	} else {
		stopCurrentSample(false);
	}
}

// Play a 30-second clip for the specified token.  The "name" arg is a unique
// string that is appended to the token to come up with the DIV names for the DHTML.
// This is to allow the same sample to appear on a page in more than one location
// without interference (i.e. the profile page)
function playSampleAudio(/*string*/ token, /*string*/ name, /*boolean*/ leaveTokenList, /*boolean*/ allowExplicit) {
	stopCurrentSample(leaveTokenList);

	gCurrentSample = token;
	gCurrentName = name;
	setSampleDisplay(token, name, LOADING);

	flashVars = ["musicId=" + token + "&uniqueName=" + name + "&sampleURL=" + escape(gHomePage + "favorites/getSample.jsp?token=" + token + "&allowExplicit=" + allowExplicit)];
	getAudioDiv().innerHTML = [
			'<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"',
			'		codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"',
			'		WIDTH="1"',
			'		HEIGHT="1"',
			'       id="SamplePlayer">',
			'	<PARAM NAME=movie VALUE="' + gHomePage + 'SamplePlayer.swf">',
			'	<PARAM NAME=quality VALUE=high>',
			'	<PARAM NAME=bgcolor VALUE=#FFFFFF>',
			'	<PARAM NAME=allowscriptaccess VALUE=always>',
			'	<PARAM NAME=menu VALUE=false>',
			' <PARAM NAME="FlashVars" VALUE="' + flashVars + '">',
			'<EMBED src="' + gHomePage + 'SamplePlayer.swf"',
			'       quality=high',
			'       bgcolor=#FFFFFF',
			'       allowscriptaccess="always"',
			'       WIDTH="1"',
			'       HEIGHT="1"',
			'       MENU="false"',
			'       NAME="SamplePlayer" ALIGN="" TYPE="application/x-shockwave-flash"',
			'       PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"',
			'       FlashVars="' + flashVars + '">',
			'</EMBED>',
			'</OBJECT>'
			].join("");
}

// stop the current sample, unless it errored (we want errored load to stay
// displayed as errors)
function stopCurrentSample(/*boolean*/ leaveTokenList) {
	if (gCurrentSample != null && gSampleState != ERROR) {
		stopSampleAudio(gCurrentSample, gCurrentName, leaveTokenList);
	}
}

function stopSampleAudio(/*string*/ token, /*string*/ name, /*boolean*/ leaveTokenList) {
    if ($(".landing_sample_player_slider_container").length > 0){
        onLandingSampleComplete();
    }
    
	getAudioDiv().innerHTML = "";
	setSampleDisplay(token, name, STOPPED);
	if (!leaveTokenList) {
		gTokenList = [];
		var img = getDiv("sampleAllStop" + gCurrentDisc);
		if (img) {
			img.style.display = "none";
		}
		img = getDiv("sampleAllPlay" + gCurrentDisc);
		if (img) {
			img.style.display = "inline";
		}
	}
}

function onLandingSampleLoad(/*string*/ token, /*string*/ name, /*boolean*/ success) {
    var startTime = (new Date()).getTime();
    var travelDistance = 390;

    window['landingSampleInterval'] = setInterval(function(){
        var landing_sample_player_middle = $("#landing_sample_player_middle" + token + name);
        var landing_sample_player_right = $("#landing_sample_player_right" + token + name);
        var landing_sample_player_time = $("#landing_sample_player_time" + token + name);

        var msElapsed = ((new Date()).getTime() - startTime);
        var percentDone = msElapsed / 30000; // assumes a 30 seconds sample

        if (percentDone > 1){
            clearTimeout(window['landingSampleInterval']);
            landing_sample_player_time.text(":30");
        }else{
            landing_sample_player_middle.css("width", travelDistance * percentDone);
            landing_sample_player_right.css("left", 67 + travelDistance * percentDone);
            
            var secondsElapsed = Math.floor(msElapsed / 1000);
            landing_sample_player_time.text(":" + (secondsElapsed < 10 ? "0" : "") + secondsElapsed);
        }
    }, 50);
}

function onLandingSampleComplete(){
    clearTimeout(window['landingSampleInterval']);
    var landing_sample_player_middle = $(".landing_sample_player_middle");
    var landing_sample_player_right = $(".landing_sample_player_right");
    var landing_sample_player_time = $(".landing_sample_player_time");

    landing_sample_player_middle.css("width", 1);
    landing_sample_player_right.css("left", 67);
    landing_sample_player_time.text(":00");
}

function onSampleLoad(/*string*/ token, /*string*/ name, /*boolean*/ success) {
    if ($(".landing_sample_player_slider_container").length > 0){
        onLandingSampleLoad(token, name, success);
    }
    
    if (success) {
        setSampleDisplay(token, name, PLAYING);
    } else {
        setSampleDisplay(token, name, ERROR);
        // If "playing all", continue on to next sample (RADIO-6764)
        playNextSample();
    }
}

function onSampleComplete(/*string*/ token, /*string*/ name) {
	setSampleDisplay(token, name, STOPPED);
	playNextSample();
}

function getAudioDiv() {
	var div = getDiv("audioDiv");
	if (div == null) {
		div = document.createElement("DIV");
		div.id = "audioDiv";
		document.documentElement.appendChild(div);
	}
	return div;
}

function setSampleDisplay(token, name, state) {
	gSampleState = state;

	setDisplay("sampleStopped" + token + name, state == STOPPED);
	setDisplay("sampleLoading" + token + name, state == LOADING);
	setDisplay("samplePlaying" + token + name, state == PLAYING);
	setDisplay("sampleError" + token + name, state == ERROR);
	if (state == LOADING) {
		// workaround for Safari which doesn't send onmouseout when the stopped
		// div is hidden
		document.getElementById("sampleStoppedImg" + token + name).src = gHomePage + "images/30-play.gif";
	}

	// update the title text flashing except when we're transitioning from
	// LOADING to PLAYING (in that case, we want to keep flashing at regular
	// intervals rather than throwing of the rhythm)
	if (state != PLAYING) {
		if (gTimeoutID != null) clearTimeout(gTimeoutID);
		updateStep();
	}
}

function updateStep() {
	gTimeoutStep++;

	if (gTimeoutStep % 2 == 0) {
		setTitleDisplay(gCurrentSample, gCurrentName, gSampleState);
	} else {
		setTitleDisplay(gCurrentSample, gCurrentName, STOPPED);
	}

	if (gSampleState == LOADING || gSampleState == PLAYING) {
		gTimeoutID = setTimeout(updateStep, 1500);
	} else {
		gTimeoutStep = -1;
		gTimeoutID = null;
	}
}

function setTitleDisplay(token, name, state) {
	setVisibility("titleStopped" + token + name, state == STOPPED || state == ERROR);
	setVisibility("titleLoading" + token + name, state == LOADING);
	setVisibility("titlePlaying" + token + name, state == PLAYING);
}

function setDisplay(id, displayed) {
	if (document.getElementById(id) != null) {
		document.getElementById(id).style.display = displayed ? "" : "none";
	}
}

function setVisibility(id, displayed) {
	if (document.getElementById(id) != null) {
		document.getElementById(id).style.visibility = displayed ? "visible" : "hidden";
	}
}

function landingPageHTML(token, uniqueName) {
    if (window.ipBlocked) {
        return "&nbsp;";	// Don't allow 30-second samples for blocked IPs
    }
    var allowExplicit = false;
    var s = "";

    s += '<div>';
    s += '<a id="sampleStopped' + token + uniqueName + '" title="Play sample" href="javascript:playSampleAudio(\'' + token + '\', \'' + uniqueName + '\', false, ' + allowExplicit + ');">';
    s += '<img id="sampleStoppedImg' + token + uniqueName + '" src="' + gHomePage + 'images/landing/play_sample_button.gif" ';
    s += 'border=0 alt="play sample" onmouseover="this.src=\'' + gHomePage + 'images/landing/play_sample_button_hover.gif\'" onmouseout="this.src=\'' + gHomePage + 'images/landing/play_sample_button.gif\'">';
    s += '</a>';

    // Loading icon
    s += '<span id="sampleLoading' + token + uniqueName + '" style="display:none">';
    s += '<img src="' + gHomePage + 'images/landing/play_sample_button_hover.gif" alt="play sample"></span>';

    // Stop icon
    s += '<a id="samplePlaying' + token + uniqueName + '" href="javascript:stopSampleAudio(\'' + token + '\', \'' + uniqueName + '\');" style="display:none">';
    s += '<img src="' + gHomePage + 'images/landing/stop_sample_button.gif" ';
    s += 'border=0 alt="stop sample" onmouseover="this.src=\'' + gHomePage + 'images/landing/stop_sample_button_hover.gif\'" onmouseout="this.src=\'' + gHomePage + 'images/landing/stop_sample_button.gif\'">';
    s += '</a>';

    // Error icon
    s += '<span id="sampleError' + token + uniqueName + '" style="display:none">';
    s += '<img src="' + gHomePage + 'images/landing/play_sample_button.gif" alt="sample not available"></span>';



    s += '<div class="landing_sample_player_slider_container">';
    s += '<div class="landing_sample_player_sliderbar" id="landing_sample_player_sliderbar' + token + uniqueName + '"></div>';
    s += '<div class="landing_sample_player_left" id="landing_sample_player_left' + token + uniqueName + '"></div>';
    s += '<div class="landing_sample_player_middle" id="landing_sample_player_middle' + token + uniqueName + '"></div>';
    s += '<div class="landing_sample_player_right" id="landing_sample_player_right' + token + uniqueName + '"></div>';
    s += '<div class="landing_sample_player_time" id="landing_sample_player_time' + token + uniqueName + '">:00</div>';
    s += '</div>';
    s += '</div>';

    return s;
}

function sampleHTML(token, uniqueName, allowExplicit) {
	if (window.ipBlocked) {
		return "&nbsp;";	// Don't allow 30-second samples for blocked IPs
	}
	var s = "";
	if (allowExplicit == null) {
		allowExplicit = false;
	}

	s += '<a id="sampleStopped' + token + uniqueName + '" title="Play sample" href="javascript:playSampleAudio(\'' + token + '\', \'' + uniqueName + '\', false, ' + allowExplicit + ');">';
	s += '<img id="sampleStoppedImg' + token + uniqueName + '" src="' + gHomePage + 'images/30-play.gif" ';
	s += 'border=0 width="14" height="15" alt="play sample" onmouseover="this.src=\'' + gHomePage + 'images/30-play-hover.gif\'" onmouseout="this.src=\'' + gHomePage + 'images/30-play.gif\'"></a>';
	// Loading icon
	s += '<span id="sampleLoading' + token + uniqueName + '" style="display:none">';
	s += '<img src="' + gHomePage + 'images/30-play-hover.gif" width="14" height="15" alt="play sample"></span>';
	// Stop icon
	s += '<a id="samplePlaying' + token + uniqueName + '" href="javascript:stopSampleAudio(\'' + token + '\', \'' + uniqueName + '\');" style="display:none">';
	s += '<img src="' + gHomePage + 'images/30-play-stop.gif" border=0 width="14" height="15" alt="stop"></a>';
	// Error icon
	s += '<span id="sampleError' + token + uniqueName + '" style="display:none">';
	s += '<img src="' + gHomePage + 'images/30-play-error.gif" width="14" height="15" alt="sample not available"></span>';

	return s;
}

function trackHTML(token, title, linkToDetail, textClass, playingClass){
	if (window.ipBlocked && title == "Play Sample") {
		return "&nbsp;";	// Don't allow 30-second samples for blocked IPs
	}
	var s = "";

	// Loading icon
	s += '<span id="titleLoading' + token + '" class="' + playingClass + '">Loading Sample</span>';
	// Play indicator
	s += '<span id="titlePlaying' + token + '" class="' + playingClass + '">Playing Sample</span>';
	// Song title
	if (linkToDetail) {
		s += '<a href="' + gHomePage + 'music/song/' + token + '" class="' + textClass + '" title="Song details" id="titleStopped' + token + '">' + title + '</a>';
	} else {
		s += '<span id="titleStopped' + token + '" class="' + textClass + '">' + title + '</span>';
	}

	return s;
}

// Used by #sampleLink macro to render 30-second sample UI using javascript to reduce size of HTML
function insertSample() {
	var jqThis = $(this);

	var token = jqThis.attr('token');
	var uniqueName = jqThis.attr('uniqueName');
	var allowExplicit = jqThis.attr('allowExplicit');

	var s = sampleHTML(token, uniqueName, allowExplicit);

	$(this).html(s);
}


// Used by #trackTitle macro to render 30-second sample track title using javascript to reduce size of HTML
// NOTE: title must be HTML-escaped
function insertTrackTitle() {
	var jqThis = $(this);

	var token = jqThis.attr('token');
	var title = jqThis.attr('trackTitle');
	var linkToDetail = jqThis.attr('linkToDetail');
	var textClass = jqThis.attr('textClass');
	var playingClass = jqThis.attr('playingClass');

	var s = trackHTML(token, title, linkToDetail, textClass, playingClass);

	$(this).html(s);
}

function drawLandingPageSample(token, uniqueName, hasCleanAudio) {
    if (hasCleanAudio){
        document.write(landingPageHTML(token, uniqueName));
    } else {
        document.write('<img src="/images/clearspacer.gif" width="14" height="15">');
    }
}

// Used by #sampleLink macro to render 30-second sample UI using javascript to reduce size of HTML
// NOTE: podcasts call this method with two args (second one usually empty) so take care in
// modifying the number, order, or meaning of the arguments
function drawSample(token, uniqueName, hasCleanAudio, allowExplicit) {
	if (arguments.length <= 2) {
		// 2-arg support for backwards compatibility with old podcast entries (RADIO-6783)
		document.write(sampleHTML(token, uniqueName, true));
	} else if (hasCleanAudio || allowExplicit) {
		document.write(sampleHTML(token, uniqueName, allowExplicit));
	} else {
		document.write('<img src="/images/clearspacer.gif" width="14" height="15">');
	}
}


// Used by #trackTitle macro to render 30-second sample track title using javascript to reduce size of HTML
// NOTE: title must be HTML-escaped
// NOTE2: podcasts call this method with two args (second one usually empty) so take care in
// modifying the number, order, or meaning of the arguments
function trackTitle(token, title, linkToDetail, textClass, playingClass) {
	var s = trackHTML(token, title, linkToDetail, textClass, playingClass);

	document.write(s);
}