var cur_display;
var c_locked = false;
var first_mainstageswitch = true;
var current_has_movieplayer;
var movieplayer;
var audioplayer;
var vid_initialized;
var aud_initialized;
var audioplayer_text_span;
var playlist;
var trans_dur = 0.5;
var first_mainbodyswitch = true;
var shows_direct = false;
var dur_default = 0.3;//not really used
var using_plist = true;

/*
innoculateNonFFForFB();
function innoculateNonFFForFB(){if (!window.console || !console.firebug) { var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; window.console = {}; for (var i = 0; i < names.length; ++i) window.console[names[i]] = function() {} } }
*/

// PNGHack:
// Note: PNGs can't be in the "style" tag of a div
// Note: PNGs affected will lose style=opacity information (set to 1) at least in some cases in IE
var ph = new PNGHack('images/spacer.gif'); addEvent(window, 'load', function() { ph.hackExtension(); });

addEvent(window, 'load', initMainBody);

function initMainBody()
{
	if (c_locked) return; else c_locked = true; // just to be safe

	initMainBodyVideoObject('movieplayer');

	var pagechoice = get_url_param('p');
	var discochoice = get_url_param('d');

	var ttime = trans_dur;

	if (!pagechoice || pagechoice.toLowerCase() == 'main')
	{
		initAudioPlayerObject(true, 0);
		initInvisibleThings();
		initMainstagePages();
		current_has_movieplayer = true; // only necessary on init
		ttime = 4;
		switchMainstageDiv('main_body', ttime, true, true);
	}
	else
	{
		initAudioPlayerObject(false, 1);
		initInvisibleThings();
		initMainstagePages();

		pagechoice = pagechoice.toLowerCase();

		if (pagechoice == 'disco' || pagechoice == 'discography')
		{
			if (discochoice != null)
			{
				discochoice = discochoice.toLowerCase();

				if (discochoice == 'gggghosts')
					switchMainstageDiv('disco_body', trans_dur, false, true, false, 'gggghosts');
				else if (discochoice == 'blindlover' || discochoice == 'blover')
					switchMainstageDiv('disco_body', trans_dur, false, true, false, 'bl');
				else if (discochoice == 'chasingourtail')
					switchMainstageDiv('disco_body', trans_dur, false, true, false, 'cot');
				else if (discochoice == 'closewhisper')
					switchMainstageDiv('disco_body', trans_dur, false, true, false, 'cw');
				else switchMainstageDiv('disco_body', trans_dur, false, true, false, 'gggghosts');
			}
			else switchMainstageDiv('disco_body', trans_dur, false, true);
		}
		else if (pagechoice == 'email')
		{
			switchMainstageDiv('email_body', trans_dur, false, true);
		}
		else if (pagechoice == 'bio' || pagechoice == 'press')
		{
			switchMainstageDiv('bio_body', trans_dur, false, true);
		}
		else if (pagechoice == 'lyrics')
		{
			switchMainstageDiv('lyrics_body', trans_dur, false, true);
		}
		else if (pagechoice == 'contact')
		{
			switchMainstageDiv('contact_body', trans_dur, false, true);
		}
		else if (pagechoice == 'other')
		{
			switchMainstageDiv('other_body', trans_dur, false, true);
		}
		else if (pagechoice == 'shows')
		{
			$c('shows_dirlink').style.display="none";
			switchMainstageDiv('shows_body', trans_dur, false, true);
		}
		else
		{
			ttime = 0.5;
			switchMainstageDiv('error_body', ttime, false, true);
		}
	}

	setTimeout(addNavbarEvents, 50);
	
	$('name_title').morph('error_message', {style: 'top: 6px', duration: 2.5, transition: Effect.Transitions.sinoidal});

	setTimeout(showNavBar, 2000); /* wait for pageload, etc */
	
	c_unlock(ttime + 0.1);
}

function initMainstagePages()
{
	// audio player
	$c('audioplayer_text').style.display = "block";

	// bio page
	IEifyBioImgSection();

	// contact page
	var m_domain = "ar";
	var other = "pe";
	$c('cf_scheck').value = other + m_domain;
	$c('cf_r').value = uncool("succeeded");

	// discography
	addEvent($c('d_track_descr_wrap'), 'click', function() { hideTrackDescr(); });
	addEvent($c('d_description_wrap'), 'click', function() { hideTrackDescr(); });

	// email signup
	handleCheckClick('2', 'allsh');

	// lyrics
	switchAlbumLyr('gggg_songs', '<i>g-g-g-ghosts?</i>');
}

function addNavbarEvents()
{
	addEvent($c("name_title"), 'click', function() { switchMainstageDiv('main_body', trans_dur, true); });

	addEvent($c("n_lyrics_img"), 'click', function() { switchMainstageDiv('lyrics_body', trans_dur); });
	addEvent($c("n_bio_img"), 'click', function() { switchMainstageDiv('bio_body', trans_dur); });
	addEvent($c("n_disco_img"), 'click', function() { switchMainstageDiv('disco_body', trans_dur); });
	addEvent($c("n_email_img"), 'click', function() { switchMainstageDiv('email_body', trans_dur); });
	addEvent($c("n_contact_img"), 'click', function() { switchMainstageDiv('contact_body', trans_dur); });
	addEvent($c("n_other_img"), 'click', function() { switchMainstageDiv('other_body', trans_dur); });
	addEvent($c("n_shows_img"), 'click', function() { switchMainstageDiv('shows_body', trans_dur); });

	addEvent($c("n_lyrics_img"), 'mouseover', function() { hilit('n_lyrics_img'); });
	addEvent($c("n_bio_img"), 'mouseover', function() { hilit('n_bio_img'); });
	addEvent($c("n_disco_img"), 'mouseover', function() { hilit('n_disco_img'); });
	addEvent($c("n_email_img"), 'mouseover', function() { hilit('n_email_img'); });
	addEvent($c("n_contact_img"), 'mouseover', function() { hilit('n_contact_img'); });
	addEvent($c("n_other_img"), 'mouseover', function() { hilit('n_other_img'); });
	addEvent($c("n_shows_img"), 'mouseover', function() { hilit('n_shows_img'); });

	addEvent($c("n_lyrics_img"), 'mouseout', function() { dimlit('n_lyrics_img'); });
	addEvent($c("n_bio_img"), 'mouseout', function() { dimlit('n_bio_img'); });
	addEvent($c("n_disco_img"), 'mouseout', function() { dimlit('n_disco_img'); });
	addEvent($c("n_email_img"), 'mouseout', function() { dimlit('n_email_img'); });
	addEvent($c("n_contact_img"), 'mouseout', function() { dimlit('n_contact_img'); });
	addEvent($c("n_other_img"), 'mouseout', function() { dimlit('n_other_img'); });
	addEvent($c("n_shows_img"), 'mouseout', function() { dimlit('n_shows_img'); });
}

function growMallow()
{
	$('mallow').morph('error_message', {style: 'bottom:0px', duration: '8.0',
					  	transition: Effect.Transitions.sinoidal, afterFinish: justGrewMallow});
//	new Effect.Move($('mallow'), {x: '0', y: '-400', duration: '3.0', transition: Effect.Transitions.sioidal, afterFinish: justGrewMallow});
}

function justGrewMallow()
{
}

/*
function sm_sinoidal(pos)
{
	var val = -Math.cos(pos*Math.PI);

	return ((Math.abs(val) == val)?(Math.pow(Math.abs(val), .8)/2 + .5):(-Math.pow(Math.abs(val), .8)/2 + 0.5));
}
*/

function showNavBar()
{
/*
$('navbar_parent').style.display='block';
	$('navbar_parent').morph('error_message', {style: 'width:600px', duration: '1.0', afterFinish: justShowedNavBar, transition: Effect.Transitions.spring});
*/


//	$('navbar_parent').appear({duration:1.5}); // using Prototype $ function here
//	$('navbar_parent').morph('error_message', {style: 'width:600px', duration: '2.0', afterFinish: justShowedNavBar, transition: function(pos) {return(2*pos);}});
//	new Effect.Morph('navbar_parent', {style: 'width:600px', duration: '2.0', afterFinish: function() {alert('done');}});

	//	new Effect.Morph('nav_disco', {style: 'top: 5px, left: 490px', duration: '1.0', transition: Effect.Transitions.spring});
//	new Effect.Move('nav_disco', {style: 'top: 5px, left: 490px', mode: 'absolute', duration: '1.0', transition: Effect.Transitions.spring});

/*
	new Effect.Parallel([
						 new Effect.Morph($('nav_disco'), {style: 'top: 5px; left: 490px;', duration: '2.0', transition: Effect.Transitions.spring}),
						 new Effect.Opacity($('nav_disco'), {from: 0, to: 1, duration: 0.2})
						 ]);
*/

	$('nav_disco').morph('error_message', {style: 'top: 5px; left: 490px;', duration: 2.0, transition: Effect.Transitions.spring});
	$('nav_lyrics').morph('error_message', {style: 'top: 45px; left: 396px;', duration: 2.4, transition: Effect.Transitions.spring});
	$('nav_shows').morph('error_message', {style: 'top: 6px; left: 356px;', duration: 1.5, transition: Effect.Transitions.spring});
	$('nav_bio').morph('error_message', {style: 'top: 48px; left: 566px;', duration: 3.2, transition: Effect.Transitions.spring});
	$('nav_contact').morph('error_message', {style: 'top: 83px; left: 797px;', transition: Effect.Transitions.spring, duration: 3.2});
	$('nav_other').morph('error_message', {style: 'top: 39px; left: 669px;', transition: Effect.Transitions.spring, duration: 2.9});
	$('nav_email').morph('error_message', {style: 'top: 49px; left: 784px;', transition: Effect.Transitions.spring, duration: 2.8});
}

function justShowedNavBar() {}

/* IE6 won't fade a transparent PNG up from display:none the first time, so
   have to manually PNGHack those invisibly */
function initInvisibleThings()
{
	var elms = $a('invisibles'); // $a gets by class name as well
	var el;
	var wid,hgt,dis;

	for (var i=0; i<elms.length; i++)
	{
		el = elms[i];

		wid = el.style.width; hgt = el.style.height;
		dis = el.style.display;
		
		el.style.wid = '0px'; el.style.hgt = '0px';
		el.style.display='block';
		ph.hackExtension({scope: el});
		el.style.display=dis; el.style.width=wid;
		el.style.height=hgt;
	}
}

function initMainBodyVideoObject(div_name)
{
//console.log('init\'ing vid');
	vid_initialized = false;

	/* skin: 'flash/stijl-jw-skin.swf' - use height 384 for swfobject, but 1 pixel error? */
	/* stretching: 'none' */
	/* videos are 640x352, std skin is 20px high, so 640x372, or 320x196, or 480x284*/
	/* playlist: 'bottom' */
	/* in second {}, param allowscriptaccess: true doesn't seem necessary? Maybe that's only for the SWFobj */
	/* recommended version req: '9.0.124.0' */
	swfobject.embedSWF('flash/jwplayer4.swf', div_name, '320', '196', '9.0.28.0', 'flash/expressInstall5.swf',
// on linux must set id flashvar? still didn't come through.
//	swfobject.embedSWF('flash/jwplayer4.swf', div_name, '320', '200', '9.0.28.0', 'flash/expressInstall22.swf',
					   {file: '../video/allthree.xml', title: 'Casey Connor videos', backcolor: 'FFFFFF', playerready: 'playerReady', id: 'vid',
					    stretching: 'uniform', playlistsize: '35', repeat: 'list'},
					   {allowfullscreen: true},
					   {id: 'vid', name: 'vid'});

//console.log('blah');

//	movieplayer = $c('vid');
//	setTimeout('movieplayer.sendEvent(\'PLAY\');', 8000);
}

function initAudioPlayerObject(autostart, initial_index)
{
	aud_initialized = false;

	// audio player:
// on linux must set id flashvar
	swfobject.embedSWF('flash/jwplayer4.swf', 'audioplayer', '300', '20', '8', 'flash/expressInstall22.swf',
					   {file: '../audio/webplayer.xml', title: 'Casey Connor audio', backcolor: 'FFFFFF', playerready: 'playerReady', id: 'aud',
					    repeat: 'list', autostart: autostart, item: initial_index},
					   {allowfullscreen: false},
					   {id: 'aud', name: 'aud'});

//	audioplayer = $c('aud');

	playlist = ['tracks from <span id="ap_dname">g-g-g-ghosts?</span>',
				'<span id="ap_tname">ballistics</span> - from <span id="ap_dname">g-g-g-ghosts?</span>',
				'<span id="ap_tname">all at once</span> - from <span id="ap_dname">g-g-g-ghosts?</span>',
				'<span id="ap_tname">zalzala</span> - from <span id="ap_tname">g-g-g-ghosts?</span>'];
	playlist_index = initial_index;
	playlist_length = 4;

	audioplayer_text_span = $c('audioplayer_text_span');
	// refreshAudioPlayerText();
}

function refreshAudioPlayerText(newtrack, newdisc)
{
	if (!newtrack) audioplayer_text_span.innerHTML = playlist[playlist_index];
	else audioplayer_text_span.innerHTML = '<span id="ap_tname">' + newtrack + '</span> - <span id="ap_dname">' + newdisc + '</span>';
}

function moviePlayedEvent(obj)
{
//alert('MPE ' + obj + ' ap ' + audioplayer + ' mp ' + movieplayer);
	// called for starts AND stops apparently?
//if (!audioplayer || !aud_initialized) alert('mpe called but ap: ' + audioplayer);
//	if ((obj.index != undefined) || obj.state) alert('playing');
	if (audioplayer && aud_initialized) audioplayer.sendEvent('STOP'); // always last in call stacks? might stop thread?
}

function audioPlayedEvent(obj)
{
//alert('APE ' + obj + ' ap ' + audioplayer + ' mp ' + movieplayer);
//if (!movieplayer || !vid_initialized) alert('ape called but vp: ' + movieplayer);
	if (using_plist) refreshAudioPlayerText(); // redundant, but useful for init'ing on non-main page to overwrite default div content
//	if (audioplayer_text_span) audioplayer_text_span
	if (movieplayer && vid_initialized) movieplayer.sendEvent('STOP'); // always last in call stacks? might stop thread?
}

function audioItemEvent(obj)
{
//	if (obj.index == 0) { audioplayer.sendEvent('ITEM', 1); return; } // won't work on autostart first time now, since item: sends event
	if (using_plist)
	{
		playlist_index = obj.index;
		refreshAudioPlayerText();
	}

	audioPlayedEvent(obj); // might call sendEvent, so last
}

/* for the video player; making sure it's initialized; called every time the div appears again, need to rehook events */
/* often mp gets called playerReady twice on one page view, e.g. main */
function playerReady(obj)
{
//console.log('pr', obj);

	if (obj.id && obj.id == 'vid')
	{
//console.log('here1', movieplayer);
//		if (movieplayer == null) movieplayer = window.document[obj.id]; else return;
		movieplayer = $c(obj.id);
// weirdness was pr being called twice on main page... second time, addControllerL was undefined, perhaps due to $/document[] call stuff
//console.log('after assign, mp', movieplayer, 'func is', movieplayer.addControllerListener);
		vid_initialized = true;

		// these want to be in playerReady
		movieplayer.addControllerListener("PLAY", 'moviePlayedEvent');
		movieplayer.addControllerListener("ITEM", 'moviePlayedEvent');
	}

	if (obj.id && obj.id == 'aud')
	{
		if (audioplayer == null) audioplayer = window.document[obj.id]; else return;
		aud_initialized = true;

		audioplayer.addControllerListener("PLAY", 'audioPlayedEvent');
		audioplayer.addControllerListener("ITEM", 'audioItemEvent'); // different

		//discography page:
		audioplayer.addControllerListener('PLAYLIST', 'audPlaylistEvent');
		audioplayer.addModelListener('STATE', 'audStateChange');

/*
		var vol = audioplayer.getConfig().volume;
		audioplayer.sendEvent('VOLUME',0);
		audioplayer.sendEvent('NEXT');
		audioplayer.sendEvent('PREV');
		audioplayer.sendEvent('VOLUME', vol);
		alert('done');
*/
	}

	/* later add support for different preview images for different vids
		this has a to-be-fixed bug (this could be triggered by a LOAD event to us):
	player.sendEvent("LOAD", {type:"video", image:jpgfile, file:flvfile});
	*/
}

function switchMainstageDiv(div_id, dur, dest_has_movieplayer, ignorelock, reentrant, initial_disco)
{
	if (!ignorelock && c_locked) return; else if (!ignorelock) c_locked = true; // never return without unlocking!

	new_disp = $(div_id); // using Prototype $ function here
	if (cur_display === new_disp) { if (!ignorelock) c_locked = false; return;}
//console.log('switch div, mp', movieplayer, 'sendEvent', (movieplayer?movieplayer.sendEvent:'undefined'));
	try
	{
		if (current_has_movieplayer && !first_mainstageswitch && movieplayer && vid_initialized) movieplayer.sendEvent('STOP');
	}
	catch(e)
	{
		// to get around FF bug:

		if (reentrant)
		{
			if (reentrant >= 3)
			{
				alert('Sorry, had an error. Please try reloading the page... You might have to restart your browser. Sometimes, having multiple tabs open in Firefox causes this.');
				if (!ignorelock) c_locked=false;
				return;
			}
			else
			{
//console.log('reinit-a ' + reentrant, dest_has_movieplayer);
				setTimeout(function () { switchMainstageDiv(div_id, dur, dest_has_movieplayer, ignorelock,
															  (reentrant + 1), intial_disco) },
										   (500 + (reentrant * 200)));
				initMainBodyVideoObject('vid');
				if (!ignorelock) c_locked=false;
				return;
			}
		}
		else
		{
//console.log('reinit-b ' + reentrant, dest_has_movieplayer);
			setTimeout(function() { switchMainstageDiv(div_id, dur, dest_has_movieplayer, ignorelock, 1, initial_disco) }, 500);
			initMainBodyVideoObject('vid');
			if (!ignorelock) c_locked=false;
			return;
		}
	}

	if (cur_display) cur_display.fade({ duration: (dur?dur:dur_default) });
	cur_display = new_disp;
	current_has_movieplayer = dest_has_movieplayer;
	cur_display.appear({ duration: (dur?dur:dur_default), afterFinish: function() {if (!ignorelock) c_locked=false;
																			  justSwitchedMainstage(div_id, initial_disco);} });

	//if (!ignorelock) c_unlock(.4);
}

function justSwitchedMainstage(div_id, initial_disco)
{
	if (first_mainstageswitch)
	{
		first_mainstageswitch = false;
	}

	if (div_id == 'main_body' && first_mainbodyswitch)
	{
		first_mainbodyswitch = false;
		growMallow();
//		setTimeout(growMallow, 1000); // if setTimeout, chance that nav-away means no mallow, but otherwise thread holds page until growth
	}
	else if (div_id == 'shows_body')
	{
		justShowedShows();
	}
	else if (div_id == 'disco_body')
	{
		justShowedDisco(initial_disco);
	}
	else if (div_id =='bio_body')
	{
		justShowedBio();
	}
}

function hilit(div_id)
{
	var newleft;
	var newtop;

	// who's crazy?
	switch(div_id)
	{
		case 'n_lyrics_img': newleft = -241; newtop = -45; break;
		case 'n_bio_img': newleft = -366; newtop = -129; break;
		case 'n_disco_img': newleft = -218; newtop = 0; break;
		case 'n_email_img': newleft = -239; newtop = -165; break;
		case 'n_contact_img': newleft = -242; newtop = -90; break;
		case 'n_other_img': newleft = -385; newtop = -43; break;
		case 'n_shows_img': newleft = -243; newtop = -128; break;
		default: alert('unknown nav id: ' + div_id + ' - please tell admin'); return; break;
	}

	var obj = $c(div_id);

	obj.style.left = newleft + 'px';
	obj.style.top = newtop + 'px';
}

function dimlit(div_id)
{
	var newleft;
	var newtop;

	switch(div_id)
	{
		case 'n_lyrics_img': newleft = -2; newtop = -45; break;
		case 'n_bio_img': newleft = -127; newtop = -129; break;
		case 'n_disco_img': newleft = -4; newtop = 0; break;
		case 'n_email_img': newleft = 0; newtop = -165; break;
		case 'n_contact_img': newleft = -4; newtop = -90; break;
		case 'n_other_img': newleft = -138; newtop = -43; break;
		case 'n_shows_img': newleft = -4; newtop = -128; break;
		default: alert('unknown nav id: ' + div_id + ' - please tell admin'); return; break;
	}

	var obj = $c(div_id);

	obj.style.left = newleft + 'px';
	obj.style.top = newtop + 'px';
}

function c_unlock(secs)
{
	setTimeout('c_locked=false;', secs*1000);
}

/**********************
##PAGES
##subpages
##mainstage
**********************/

// ##contact

var mr_d = "caseyconnor.org"
function myad(usName) {
	var sb_recipient=uncool(usName);
	document.write(sb_recipient.link('mailto:' + sb_recipient));
}
function uncool(coolname)
{
	var asign = "&#64;";
	var sb_r = coolname + asign + mr_d;
	return (sb_r);
}

// ##BIO PAGE

var IEphotocred = false;

// MS vs. the world!
function IEifyBioImgSection()
{
	if (isIE6ish() || isIE7ish())
	{
		$c('bio_photo_cred_img').style.display='none';
		$c('biop_img').onmouseover=showBioPhotoCred;

		IEphotocred = true;
	}
}

function hideBioPhotoCred()
{
	$('biophotocred').fade({duration:0.25});
}

function showBioPhotoCred()
{
	if (IEphotocred) { $('biophotocred').appear({duration:0.25}); setTimeout(hideBioPhotoCred, 1200);}
	else $('biophotocred').appear({duration:0.25});
}

function showPreview(img_index, width, left)
{
//	$c('img_preview').src = imgsrc;
	$c('preview_pane').replaceChild(bio_imgs[img_index], $c('preview_pane').getElementsByTagName('img')[0]);
	$c('preview_pane').style.width = width + "px";
	$c('preview_pane').style.left = left + "px";
//	$c('preview_pane').style.display = "block";
	$('preview_pane').appear({duration:0.25});
}

function hidePreview()
{
//	$c('preview_pane').style.display = 'none';
	$('preview_pane').fade({duration:0.25});
}

function justShowedBio()
{
	Function.defer(preloadBioImg());
}

var bio_imgs = new Array(2);

function preloadBioImg()
{
/*	
var img1 = new Image()
img1.src = "promo/bio-2008/caseyconnor_bio_prev.jpg";
var img2 = new Image()
img2.src = "promo/presspics/casey_connor_porch_prev.jpg";*/
	bio_imgs[0] = document.createElement('img');
	bio_imgs[1] = document.createElement('img');
	bio_imgs[0].src = "promo/bio-2008/caseyconnor_bio_prev.jpg";
	bio_imgs[1].src = "promo/presspics/casey_connor_porch_prev.jpg";
}

// ##DISCOGRAPHY

var disco_err = "Sorry, had trouble fetching the album info!";

var d_d_location;
var d_track_descr;
var d_track_names;
var d_disc_name;
var d_track_audio_hrefs;//0:mp3lo,1:mp3hi,2:cd
var d_track_audio_dlhrefs;
var cur_dl_sel = 1;//mp3hi
var curalbum;//code, not printable
var curtrack;
var first_d_show = true;
var first_dd_show = true;

function justShowedDisco(initial_disco_page)
{
	if (first_d_show)
	{
		$('disco_album_chooser').morph('error_message', {style: 'top: 40px; right: 111px;', duration: 1.0, transition: Effect.Transitions.spring});

		if (initial_disco_page != null) switchAlbumDisco(initial_disco_page);
		else switchAlbumDisco('gggghosts');

		first_d_show = false;
	}
}

function refreshPrefDiv()
{
	var sel_spn = $c('ddl_sel_spn');
	var sel_sel = document.createElement('select');
	sel_sel.id = "ddl_sel";

	if (d_track_audio_hrefs[0]) sel_sel.appendChild(makeSelOpt(0, 'ddl_sel0', 'MP3 - lower quality', cur_dl_sel));
	else if (cur_dl_sel == 0) cur_dl_sel = 1;

	if (d_track_audio_hrefs[1]) sel_sel.appendChild(makeSelOpt(1, 'ddl_sel1', 'MP3 - high quality', cur_dl_sel));
	else if (cur_dl_sel == 1)
	{
		if (d_track_audio_hrefs[0]) cur_dl_sel = 0;
		else cur_dl_sel = 2;
	}

	if (d_track_audio_hrefs[2]) sel_sel.appendChild(makeSelOpt(2, 'ddl_sel2', 'CD quality', cur_dl_sel));
	else if (cur_dl_sel == 2)
	{
		if (d_track_audio_hrefs[1]) cur_dl_sel = 1;
		else cur_dl_sel = 0; //next else shouldn't happen
	}

	addEvent(sel_sel, 'change', function () { dlSelChanged(); });
	
	if (sel_spn.childNodes.length > 0) sel_spn.replaceChild(sel_sel, sel_spn.childNodes[0]);
	else sel_spn.appendChild(sel_sel);

	$c('d_dl_options').style.display="block";
}

function makeSelOpt(opt_num, opt_id, opt_copy, opt_cur_sel)
{
	var sel_opt;

	sel_opt = document.createElement('option');
	sel_opt.id = opt_id;
	sel_opt.setAttribute('value', opt_num);
	if (opt_cur_sel == opt_num) sel_opt.setAttribute('selected', 'true');
	sel_opt.innerHTML = opt_copy;

	return(sel_opt);
}

function dlSelChanged()
{
	var sel_sel = $c('ddl_sel');

	if ($c('ddl_sel1') && $c('ddl_sel1').selected) cur_dl_sel = 1;
	else if ($c('ddl_sel0') && $c('ddl_sel0').selected) cur_dl_sel = 0;
	else if ($c('ddl_sel2') && $c('ddl_sel2').selected) cur_dl_sel = 2;
}

function switchAlbumDisco(albumname)
{
	if (curalbum == albumname) return;

	curalbum = albumname;

	var dmsg = 'Hang on, fetching album info from server...';
	$c('disco_status_line').innerHTML = dmsg;
//	$('disco_status_line').appear({duration: 0.75}); //IE6 is too slow with hack-png to render ani; even still...
	// if want back, set css to block and div tag to none
	$c('disco_status_line').style.display = 'block';

	$c('d_cdb').style.display = 'none';
	hideTrackDescr();

	setTimeout(function() {switchAlbumDiscoI(albumname, dmsg)}, 10); // frees the UI thread to show the status line
}

function switchAlbumDiscoI(albumname, dmsg)
{
	loadXML('includes/disco/' + albumname + '.xml', $c('disco_status_line'), $c('disco_status_line'), dmsg, disco_err, discoStateChange);
}

function discoStateChange()
{
	if(xmlhttp.readyState!=4) return;
	if(xmlhttp.status!=200)
	{
    	$c('disco_status_line').innerHTML = "<b>" + disco_err + " Problem retrieving XML data: " + xmlhttp.statusText + "</b>";
		return;
	}

	if (applyAlbumXML(getXMLRoot(xmlhttp))) $('disco_status_line').fade({duration: 0.50});

	if (first_dd_show)
	{
		var dpi = $c('d_play_instr');
		dpi.style.width = '302px'; // IE6 forever
		dpi.style.height = '112px';
		dpi.style.display = 'block';

		setTimeout(fadeInstructions, 2000);
		first_dd_show = false;
	}
}

function fadeInstructions()
{
	$('d_play_instr').fade({duration: 3.00});
}

function applyAlbumXML(album)
{
	try {
	d_disc_name = album.getElementsByTagName('title')[0].childNodes[0].nodeValue;
	$c('d_title').innerHTML = d_disc_name;
	$c('d_year').innerHTML = album.getElementsByTagName('year')[0].childNodes[0].nodeValue;
	$c('d_c_year').innerHTML = album.getElementsByTagName('year')[0].childNodes[0].nodeValue;
	$c('d_month').innerHTML = album.getElementsByTagName('month')[0].childNodes[0].nodeValue;
	// get bigs safely (ff bug):
	$c('d_description').innerHTML = safeNodeRetrieve(album.getElementsByTagName('description')[0].childNodes);
	$c('d_description_wrap').style.display='block';
	$c('d_titleline').style.display = 'block';

	if (album.getElementsByTagName('cdbaby')[0] &&
		album.getElementsByTagName('cdbaby')[0].childNodes.length > 0)
	{
		$c('d_cdb_a').href = album.getElementsByTagName('cdbaby')[0].childNodes[0].nodeValue;
		$c('d_cdb').style.display="block";
	}
	else $c('d_cdb').style.display="none";

	$c('d_copyright').style.display = "block";

	imgroot = album.getElementsByTagName('imgroot')[0].childNodes[0].nodeValue;

	var cdiv = $c('d_cover');

	var imag = document.createElement('img');
	imag.id = "d_cover_img";
	imag.src = imgroot + '/' + album.getElementsByTagName('coverimgsm')[0].childNodes[0].nodeValue;
	imag.style.display = 'block'; // need for IE6 hack

	if (cdiv.childNodes.length > 0) cdiv.replaceChild(imag, cdiv.childNodes[0]);
	else cdiv.appendChild(imag);

	imag = document.createElement('img');
	imag.id = "d_disc_img";
	imag.src = imgroot + '/' + album.getElementsByTagName('discimgsm')[0].childNodes[0].nodeValue;
	imag.setAttribute('class', 'hack-png');
	imag.style.width = '0px'; //IE6hack, see later...
	imag.style.height = '0px';
	imag.style.display = 'block'; // need for IE6 hack

	addEvent(cdiv, 'mouseover', function() { this.childNodes[1].style.display = 'block';this.childNodes[0].style.display = 'none'; });
	addEvent(cdiv, 'mouseout', function() { this.childNodes[0].style.display = 'block';this.childNodes[1].style.display = 'none'; });

	// note: > 1 and [1] on this one
	if (cdiv.childNodes.length > 1) cdiv.replaceChild(imag, cdiv.childNodes[1]);
	else cdiv.appendChild(imag);

	applyTrackXML(album);
	applyAudioSetsXML(album);
	refreshPrefDiv();

	} catch (e) {
		alert('Sorry, had an error. Please report it to the web admin: ' + e.name + ' ' + e.message);
		return false;
	}

	return(true);
}

function applyTrackXML(album)
{
	var tracks = album.getElementsByTagName('tracks')[0];

	var tbl = document.createElement('table');
	tbl.setAttribute('id', 'd_track_tbl');

	var tbd = document.createElement('tbody');
	tbl.appendChild(tbd);

	tbldiv = $c('d_tracklist_content');

	if (tbldiv.childNodes.length > 0) tbldiv.replaceChild(tbl, tbldiv.childNodes[0]);
	else tbldiv.appendChild(tbl);

	var curtrack;
	var tr;
	var td;
	var spn;
	var tracknum = 0;
	var curname;
	var curdescr;
	var imag;

	d_track_names = new Array();
	d_track_descr = new Array();
	
	for (var i=0; i < tracks.childNodes.length; i++)
	{
		if (tracks.childNodes[i].nodeType != 1) continue;

		tracknum++;
		tr = document.createElement('tr');

		// hidden, for IE6 to be able to pull number for function
		td = document.createElement('td');
		td.innerHTML = tracknum;
//		td.setAttribute('class', 'd_track_tracknum');
// this does work if needed; others didn't. But test!
		td.style.display = 'none';
		
		tr.appendChild(td);

		td = document.createElement('td');
		addEvent(td, 'click', function() { downloadTrack(this.parentNode.childNodes[0].childNodes[0].nodeValue) });
//		addEvent(td, 'mouseover', function() { this.childNodes[0].src = 'images/dlicon-act.jpg'});
//		addEvent(td, 'mouseout', function() { this.childNodes[0].src = 'images/dlicon.jpg'});
		addEvent(td, 'mouseover', function() { this.childNodes[1].style.display = 'block';this.childNodes[0].style.display = 'none'; });
		addEvent(td, 'mouseout', function() { this.childNodes[0].style.display = 'block'; this.childNodes[1].style.display = 'none'; });

/*
		imag = document.createElement('img');
		imag.src = 'images/dlicon.jpg';
		td.appendChild(imag);
		tr.appendChild(td);
*/
		imag = document.createElement('img');
		imag.src = 'images/dlicon.jpg';
		imag.style.display = 'block';
//		imag.setAttribute('class', 'hack-png');
		td.appendChild(imag);

		imag = document.createElement('img');
		imag.src = 'images/dlicon-act.jpg';
		imag.style.display = 'none';
//		imag.setAttribute('class', 'hack-png');
		// for IE6IconFix, so the image will show up:
//		imag.style.width = '0px';
//		imag.style.height = '0px';
		td.appendChild(imag);
		tr.appendChild(td);

/*
		td.setAttribute('class', 'd_track_playcol');
		if (isIE6ish()) addEvent(td, 'click', function() { playDTrack(this.parentNode.childNodes[0].childNodes[0].nodeValue) });
		else td.setAttribute('onclick', 'playDTrack(' + tracknum + ')');
*/

		td = document.createElement('td');
		addEvent(td, 'click', function() { playDTrack(this.parentNode.childNodes[0].childNodes[0].nodeValue) });
		addEvent(td, 'mouseover', function() { this.childNodes[1].style.display = 'block';this.childNodes[0].style.display = 'none'; });
		addEvent(td, 'mouseout', function() { this.childNodes[0].style.display = 'block';this.childNodes[1].style.display = 'none'; });
		td.setAttribute('class', 'IE6IconFix');

// this works, but yuck:
//		 	td.innerHTML = '<a href="javascript:downloadTrack(\'' + tracknum + '\');">DL</a>';
// this didnt work:
//addEvent(td, 'click', eval('function() { alert(\'' + tracknum + '\');}'));
		imag = document.createElement('img');
		imag.src = 'images/playicon.png';
		imag.style.display = 'block'; // need for IE6 hack
		imag.setAttribute('class', 'hack-png');
		td.appendChild(imag);

		imag = document.createElement('img');
		imag.src = 'images/playicon-act.png';
		imag.style.display = 'block'; // need for IE6 hack
		imag.setAttribute('class', 'hack-png');
		// for IE6IconFix, so the image will show up:
		imag.style.width = '0px';
		imag.style.height = '0px';

		td.appendChild(imag);
		
		tr.appendChild(td);

		td = document.createElement('td');
		curtrack = tracks.childNodes[i];
		curname = curtrack.getElementsByTagName('name')[0].childNodes[0].nodeValue;

		// do this before last node for descr array
		curdescr = curtrack.getElementsByTagName('description');

		// get bigs safely (ff bug)
		if (curdescr.length > 0 && curdescr[0].childNodes.length > 0) d_track_descr.push(safeNodeRetrieve(curdescr[0].childNodes));
		else d_track_descr.push(null);

		spn = document.createElement('span');
		spn.innerHTML = curname;

		if (d_track_descr[tracknum-1])
		{
			addEvent(spn, 'click', function() { toggleTrackDescr(this.parentNode.parentNode.childNodes[0].childNodes[0].nodeValue) });
			addEvent(spn, 'mouseover', function() { this.style.color='#9999ff'; });
			addEvent(spn, 'mouseout', function() { this.style.color='#000066' ; });
		}

		td.appendChild(spn);
		td.setAttribute('class', 'd_track_namecol');
		tr.appendChild(td);

		tbd.appendChild(tr);

		d_track_names.push(curname);
	}	

	spn.style.fontWeight = 'bold';

	$c('d_tracklist_wrap').style.display = "block";

	IE6IconFix();
}

// before trackXML
function applyAudioSetsXML(album)
{
	var audiosets = album.getElementsByTagName('audiosets')[0];

	var set_index;
	var atype;
	var apath;
	var adlpath;
//	var discurl;
	var curset;
	var atracks;

	d_track_audio_hrefs = new Array();
	d_track_audio_dlhrefs = new Array();
	d_d_location = new Array();

	for (var i=0; i<audiosets.childNodes.length; i++)
	{
		if (audiosets.childNodes[i].nodeType != 1) continue;

		curset = audiosets.childNodes[i];

		atype = curset.getElementsByTagName('audiotype')[0].childNodes[0].nodeValue +
				(curset.getElementsByTagName('quality')[0].childNodes.length > 0 ?
					curset.getElementsByTagName('quality')[0].childNodes[0].nodeValue : '');

		switch(atype)
		{
			case 'mp3lo': set_index = 0; break;
			case 'mp3hi': set_index = 1; break;
			case 'cd': set_index = 2; break;
			default: set_index = 0; break;
		}

		d_track_audio_hrefs[set_index] = new Array();
		d_track_audio_dlhrefs[set_index] = new Array();
		d_d_location[set_index] = curset.getElementsByTagName('location')[0].childNodes[0].nodeValue;

		apath = curset.getElementsByTagName('audiopath')[0].childNodes[0].nodeValue;
		adlpath = curset.getElementsByTagName('dlaudiopath')[0].childNodes[0].nodeValue;

//		if (curset.getElementsByTagName('disc')[0].childNodes.length > 0)
//			discurl = apath + curset.getElementsByTagName('disc')[0].childNodes[0].nodeValue;

		atracks = curset.getElementsByTagName('tracks')[0];

		for (var j=0; j<atracks.childNodes.length; j++)
		{
			if (atracks.childNodes[j].nodeType != 1) continue;

			d_track_audio_hrefs[set_index].push(apath + atracks.childNodes[j].childNodes[0].nodeValue);
			d_track_audio_dlhrefs[set_index].push(adlpath + atracks.childNodes[j].childNodes[0].nodeValue);
		}

//		if (discurl) d_track_audio_dlhrefs[set_index].push(discurl);
	}
}

// called on init of body
function IE6IconFix()
{
	var tds = $a('IE6IconFix');

	for (var i=0; i<tds.length; i++)
	{
		ph.hackExtension({scope: tds[i]});
		tds[i].childNodes[1].style.display = 'none';
		tds[i].childNodes[1].style.width='';
		tds[i].childNodes[1].style.height='';
	}

	// for some reason, can't get d_cover if class is set... messes up $a and nothing returned..
	tds = $c('d_cover');
	ph.hackExtension({scope: tds});
	tds.childNodes[1].style.display = 'none';
	tds.childNodes[1].style.width='';
	tds.childNodes[1].style.height='';
}

function downloadTrack(tracknum)
{
//alert('downloading ' + d_track_audio_dlhrefs[cur_dl_sel][tracknum-1]);
	if (d_d_location[cur_dl_sel] == "external") window.open(d_track_audio_dlhrefs[cur_dl_sel][tracknum-1]);
	else downloadFile(d_track_audio_dlhrefs[cur_dl_sel][tracknum-1]);
}

var cur_aply_state;

function playDTrack(tracknum)
{
	if (!aud_initialized) return;

	using_plist = false;
	var disc_plist = false;

	//toggles, useful in case click player then second click to icon
	if (curtrack == tracknum) { audioplayer.sendEvent('PLAY'); curtrack = null; }
	else
	{
		curtrack = tracknum;

		var aref;

		if (cur_dl_sel == 2) aref = d_track_audio_hrefs[1][tracknum-1];
		else aref = d_track_audio_hrefs[cur_dl_sel][tracknum-1];

		if (aref.match('\.zip$', 'i'))
		{
			aref = aref.match('(.*)\.zip$', 'i')[1] + '.xml';
			disc_plist = true;
		}

		if (disc_plist)
		{
			audioplayer.sendEvent('ITEM', 0);
			audioplayer.sendEvent('LOAD', aref);
//			cur_aply_state = null;
//			sendDelayedPlay(audioplayer);
		}
		else
		{
			audioplayer.sendEvent('ITEM', 0);
			audioplayer.sendEvent('LOAD', {type:'sound',file:aref});
//			audioplayer.sendEvent('PLAY', true);
		}

		refreshAudioPlayerText(d_track_names[tracknum-1], d_disc_name);
	}
}

function sendDelayedPlay(aply)
{
	// put test here instead of audStateChange because each failed play triggers a quick play/idle pair
	// must play for 500ms consec before autostart relaxes; hopefully that's enough time for player to send "idle"
	// on the failed attempts
	if (cur_aply_state == 'BUFFERING' || cur_aply_state == 'PLAYING') return;

	aply.sendEvent('PLAY', true);
	setTimeout(function () { sendDelayedPlay(aply); }, 500);
}

function audStateChange(obj)
{
	cur_aply_state = obj.newstate;
}

// see hack
//var first_aud_load = true;
function audPlaylistEvent(obj)
{
	//	if (first_aud_load) { first_aud_load = false; return; }
	// hack: player doesn't always send initial PLAYLIST, others have no title or other names
	if (new RegExp('^Samples').test(audioplayer.getPlaylist()[0].title)) return;

	$c('disco_status_line').innerHTML = 'Playing...';
//	$('disco_status_line').appear({duration: 0.75});
	$('disco_status_line').style.display = 'block';
	setTimeout(function() { $('disco_status_line').fade({duration: 0.5}); }, 2000);

	audioplayer.sendEvent('PLAY', true);
}

function albumError(str)
{
	$c('disco_status_line').innerHTML = "<B>" + str + "</B>";
	$('disco_status_line').appear({duration: 0.75});
}

var track_descr_vis = false;
var cur_track_descr;

function toggleTrackDescr(tracknum)
{
	if (tracknum == cur_track_descr && track_descr_vis) hideTrackDescr();
	else
	{
		if (!d_track_descr[tracknum-1]) return;

		$c('d_track_descr').innerHTML = d_track_descr[tracknum-1];
		$('d_track_descr_wrap').appear({duration: 0.4});
		track_descr_vis = true;
		cur_track_descr = tracknum;
	}
}

function hideTrackDescr()
{
	$('d_track_descr_wrap').fade({duration: 0.3});
	track_descr_vis = false;
}

var pol_vis = false;

function togglePolicies()
{
	if (pol_vis) $('d_policies_wrap').fade({duration: 0.3});
	else $('d_policies_wrap').appear({duration: 0.3});

	pol_vis = !pol_vis;
}

// ##email signup
// ##mailing list

function selUncheck(check_els, div_els)
{
	for (var i=0; i<check_els.length; i++)
	{
		check_els[i].checked = false;
	}

	for (i=0; i<div_els.length; i++)
	{
		div_els[i].style.display="none";
	}
}

function unselDisplay(div_els)
{
	for (var i=0; i<div_els.length; i++)
	{
		div_els[i].style.display="block";
	}
}

function handleCheckClick(cbnum, classbase)
{
	if ($c('cb' + cbnum).checked)
	{
		if (cbnum == '2') $c('cb2_span').style.display='inline';

		selUncheck(getElementsByClassName('c_' + classbase), getElementsByClassName('cd_' + classbase));
	}
	else
	{
		if (cbnum == '2') $c('cb2_span').style.display='none';

		unselDisplay(getElementsByClassName('cd_' + classbase));
	}
}

// ##lyrics

function loadLyric(songname)
{
	loadXML('includes/lyrics/' + songname + '.html', $c('lyrics_copy'), $c('lyrics_copy'), "<i>Hang on, fetching the lyrics...</i>", "Sorry, had trouble fetching the lyrics.", lyricStateChange);
}

function lyricStateChange()
{
	if (xmlhttp.readyState==4) // 4 = "loaded"
  	{
  		if (xmlhttp.status==200)
    	{
			$c('lyrics_copy').innerHTML = xmlhttp.responseText;
		}
  		else
    	{
    		$c('lyrics_copy').innerHTML = "<b>Sorry, had problem loading the lyrics. Problem retrieving XML data: " +
									xmlhttp.statusText + "</b>";
    	}
  	}
}

var cur_songchoose_div;

function switchAlbumLyr(new_album, alb_pname)
{
	if (cur_songchoose_div) $c(cur_songchoose_div).style.display='none';
	$c(new_album).style.display='block';
	$c('achoice').innerHTML = alb_pname;
	cur_songchoose_div=new_album;
}

// ##shows

// this called from main switcher
function justShowedShows()
{
	// will refresh any time the shows page is brought up
		loadXML('scripts/pages/upshows.php', $c('up_shows_copy'), $c('up_shows_copy'), "Hang on - fetching upcoming shows from server...", "Sorry, had trouble fetching the shows.", upShowStateChange);
	if (show_old_shows) loadXML('scripts/pages/oldshows.php', $c('old_shows_copy'), $c('old_shows_copy'), "Hang on - fetching past shows from server...", "Sorry, had trouble fetching the shows.", oldShowStateChange);
}

var show_old_shows = false;
var old_up_shows_height;
var old_up_shows_copy_height;

function showOldShows()
{
	if (!show_old_shows)
	{
		show_old_shows = true;
		$c('show_switch_copy').innerHTML="Hide Past Shows";
		old_up_shows_height = $c('up_shows').style.height;
		old_up_shows_copy_height = $c('up_shows_copy').style.height;
		$c('up_shows').style.height="175px";
		$c('up_shows_copy').style.height="151px";
		$c('old_shows').style.display="block";
		loadXML('scripts/pages/oldshows.php', $c('old_shows_copy'), $c('old_shows_copy'), "Hang on - fetching past shows from server...", "Sorry, had trouble fetching the shows.", oldShowStateChange);
	}
	else
	{
		show_old_shows = false;
		$c('show_switch_copy').innerHTML="Show Past Shows";
		$c('up_shows').style.height=old_up_shows_height;
		$c('up_shows_copy').style.height=old_up_shows_copy_height;
		$c('old_shows').style.display="none";
	}	
}

function upShowStateChange()
{
	if (xmlhttp.readyState==4) // 4 = "loaded"
  	{
  		if (xmlhttp.status==200)
    	{
			$c('up_shows_copy').innerHTML = xmlhttp.responseText;
		}
  		else
    	{
    		$c('up_shows_copy').innerHTML = "<b>Sorry, had problem loading the shows. Problem retrieving XML data: " +
									xmlhttp.statusText + "</b>";
    	}
  	}
}

function oldShowStateChange()
{
	if (xmlhttp.readyState==4) // 4 = "loaded"
  	{
  		if (xmlhttp.status==200)
    	{
			$c('old_shows_copy').innerHTML = xmlhttp.responseText;
		}
  		else
    	{
    		$c('old_shows_copy').innerHTML = "<b>Sorry, had problem loading the shows. Problem retrieving XML data: " +
									xmlhttp.statusText + "</b>";
    	}
  	}
}
//v2:cookie for autoplay, specific album sel on p=, lyrics conflated into disco, contact and mailinglist ajax result screens; jwplayer skin; email list automailing
