/******************************************************************************
 *
 * Copyright (c) Enigma Interactive 2003
 * 7-15 pink lane / newcastle / ne1 5dw / england
 * t: +44 (0)191 261 2991 www.enigma-interactive.co.uk f: +44 (0)191 261 2378
 *
 * Filename: 	utility.js
 * Description:	A set of utility javascript functions
 *
 *
 * History
 * ver	date		who					comment
 * ----------------------------------------------------------------------------
 *		15-Feb-2005 Andy Lewis			Modified displayPopup()
 *
 *		23-Nov-2004 Chris Gair			Added function javaMessage
 *
 * 3	27-Jan-2005 Andy Lewis			Modified guestMp3 - for some reason delimiting quotes wasn't reliable
 										in IE, so changed tack to use singles inside doubles.
 * 2	29-Oct-2003 Graeme Wilkinson	Added funrction setFormAction and
 										setFormField 
 * 1 	19-Dec-2002	Graeme Wilkinson	Created
 *****************************************************************************/

var miniWin;
var g_bolImageOn = false;

/*******************************************************************************
 * Description:	Displays the rollover image. The image must have two images
 *				called <image>_0.gif and <image>_1.gif
 * Parameters:	p_objObject	- the image html element that is being "rolled over"
 *
 * History
 * ver	date		who					comment
 *------------------------------------------------------------------------------
 * 2	14-Dec-2004	Graeme Wilkinson	Now also handles image that use _0 and _1
 *										notation
 * 1	19-Dec-2002	Graeme Wilkinson	Created
 ******************************************************************************/
function rollOver(p_objObject) {

	var strImageSrcOn = p_objObject.src;
	
	if( strImageSrcOn.search("_on") != -1 || strImageSrcOn.search("_1") != -1) {
		g_bolImageOn = true;
	}
	else {
		strImageSrcOn = strImageSrcOn.replace("_off", "_on");
		strImageSrcOn = strImageSrcOn.replace("_0", "_1");
		p_objObject.src = strImageSrcOn;
		g_bolImageOn = false;
	}
	
} // end of function rollOver

/*******************************************************************************
 * Description:	Displays the none rollover image. The image must have two images
 *				called <image>_0.gif and <image>_1.gif
 * Parameters:	p_objObject	- the image html element that is being "rolled over"
 *
 * History
 * ver	date		who					comment
 *------------------------------------------------------------------------------
 * 2	14-Dec-2004	Graeme Wilkinson	Now also handles image that use _0 and _1
 *										notation
 * 1	19-Dec-2002	Graeme Wilkinson	Created
 ******************************************************************************/
function rollOut(p_objObject) {

	var strImageSrcOn = p_objObject.src;
	
	if( !g_bolImageOn ) {
		strImageSrcOn = strImageSrcOn.replace("_on", "_off");
		strImageSrcOn = strImageSrcOn.replace("_1", "_0");
		p_objObject.src = strImageSrcOn;
	}

} // end of function rollOut


function xRollOver(p_id)

{
	var item = xGetElementById(p_id)
	
	if (item)
		rollOver(item);
}


function xRollOut(p_id)

{
	var item = xGetElementById(p_id)
	
	if (item)
		rollOut(item);
}

/*******************************************************************************
 * Description: Sets the form action
 * Parameters:	p_strForm	- the form to set
 *				p_strAction	- the action for the form
 * Returns:		None
 *
 * History
 * ver	date		who					comment
 * -----------------------------------------------------------------------------
 * 2	28-Oct-2003	Graeme Wilkinson	Created
 ******************************************************************************/
function setFormAction(p_strForm, p_strAction) {

	objForm = eval("document." + p_strForm); 
	objForm.action = p_strAction;
	
} // end of function setFormAction

/*******************************************************************************
 * Description: Sets a for variable
 * Parameters:	p_strAction	- the action for the form
 * Returns:		None
 *
 * History
 * ver	date		who					comment
 * -----------------------------------------------------------------------------
 * 2	28-Oct-2003	Graeme Wilkinson	Created
 ******************************************************************************/
function setFormField(p_strForm, p_strName, p_strValue) {
	
	objFormField = eval("document." + p_strForm + "." + p_strName); 
	objFormField.value = p_strValue;
	
} // end of function setFormField

 /*******************************************************************************
 * Description:	Sets and object class to a stylesheet class
 * Parameters:	p_strObjectId	- the id of the object to set the stylesheet class
 *								of
 *				p_strClass		- the sytlesheet class to set 
 *									
 *
 * History
 * ver	date		who					comment
 *------------------------------------------------------------------------------
 * 1.0	07-Apr-2004	Graeme Wilkinson	Created
 ******************************************************************************/
 function setClass(p_strObjectId, p_strHiddenClass) {
 
 	objElement = document.getElementById(p_strObjectId);
	objElement.className = p_strHiddenClass;
 
 } // end of function setClass
 
 /*******************************************************************************
 * Description:	Opens a popup window with the given parameters
 * Parameters:	p_strURL - the URL to open
 *				p_strWindowName	- the name of the window
 *				p_strOptions	- the window options
 *									
 *
 * History
 * ver	date		who					comment
 *------------------------------------------------------------------------------
 * 1.2	15-Feb-2005	Andy				Focus() to always bring resulting window to front.
 * 1.1	29-Nov-2004	Sam Jenkins			Parent page was displaying error. Removed
 *										'return' from the second line of the function.
 * 1.0	05-May-2004	Graeme Wilkinson	Created
 ******************************************************************************/ 
function displayPopup(p_strURL, p_strWindowName, p_strOptions) {
	var win = window.open(p_strURL, p_strWindowName, p_strOptions);
	if (win)
		win.focus();
} // end of function diaplayPopup

 /*******************************************************************************
 * Description:	swaps an objects state
 * Parameters:	p_objectId - the id of the object to swap
 *
 * History
 * ver	date			who					comment
 *------------------------------------------------------------------------------
 * 1.0	17-June-2004	Chris Gair			Created
 ******************************************************************************/ 
function changeDisplay(p_objectId) {
	var objElement;
	
	objElement = document.getElementById(p_objectId);

	strCurrentClass = objElement.className;
	
	if (strCurrentClass.indexOf("hidden") != -1 ) 
	{
		strCurrentClass = strCurrentClass.replace("hidden", "visible");
	}
	else if ( strCurrentClass.indexOf("visible") != -1 ) 
	{
		strCurrentClass = strCurrentClass.replace("visible", "hidden");
	}

	setClass( p_objectId, strCurrentClass );
	
} // end of function changeDisplay

 /*******************************************************************************
 * Description:	changes the class of the track when alternate versions are open
 * Parameters:	p_objectId - the id of the object to change
 *
 * History
 * ver	date			who					comment
 *------------------------------------------------------------------------------
 * 1.0	19-Aug-2004		Chris Gair			Created
 ******************************************************************************/ 
function displayAlternate(p_objectId, p_objImage,p_objectIdB) {
	var objElement;
	var objMainTrack;
	var strMainClass = '';
	
	objAltTrackElement = document.getElementById(p_objectId);
	strCurrentClass = objAltTrackElement.className;
	
	objTrackElement = document.getElementById(p_objectIdB);
	if (objTrackElement)
		strMainClass = objTrackElement.className;
	
	temp = document.getElementById(p_objImage);
	strCurrentImage = temp.src;	
	
	if (strCurrentClass.indexOf("_0") != -1 ) 
	{
		strCurrentClass = strCurrentClass.replace("_0", "_1");
		strMainClass = strMainClass + "_oa";
		strCurrentImage = strCurrentImage.replace("_e", "_c");
	}
	else if ( strCurrentClass.indexOf("_1") != -1 ) 
	{
		strCurrentClass = strCurrentClass.replace("_1", "_0");
		strMainClass = strMainClass.replace("_oa", "");
		strCurrentImage = strCurrentImage.replace("_c", "_e");
	}

	setClass( p_objectId, strCurrentClass );
	if (objTrackElement)
		setClass( p_objectIdB, strMainClass );
	temp.src = strCurrentImage;
	
} // end of function displayAlternate

 /*******************************************************************************
 * Description:	shows/hides the track listing.
 * Parameters:	p_objectId - the id of the object to change
 *
 * History
 * ver	date			who					comment
 *------------------------------------------------------------------------------
 * 1.0	09/02/2005		Andy Lewis			Created
 ******************************************************************************/ 
function displayTrackList(p_trackListId, p_objImage) {
	var oTrackList = xGetElementById(p_trackListId);
	var oImage = xGetElementById(p_objImage);
	var display = xDisplay(oTrackList);
	
	var imageSrc = oImage.src;
	
	if (display != 'block') {
		xDisplay(oTrackList, 'block');
		oImage.src = imageSrc.replace("_e", "_c");
	} else {
		xDisplay(oTrackList, 'none');
		oImage.src = imageSrc.replace("_c", "_e");
	}
} // end of function displayTrackList

 /*******************************************************************************
 * Description:	changes the class of the track when alternate versions are open
 * Parameters:	p_objectId - the id of the object to change
 *
 * History
 * ver	date			who					comment
 *------------------------------------------------------------------------------
 * 1.0	19-Aug-2004		Chris Gair			Created
 ******************************************************************************/ 
function displayRecAlternate(p_objectId, p_objImage,p_objectIdB) {
	var objElement;
	var objMainTrack;
	
	objElement = document.getElementById(p_objectId);
	strCurrentClass = objElement.className;
	
	temp = document.getElementById(p_objImage);
	strCurrentImage = temp.src;	
	
	if (strCurrentClass.indexOf("hidden") != -1 ) 
	{
		strCurrentClass = strCurrentClass.replace("hidden", "visible");
		strMainClass = "altRecTrackDetailsPanel";
		strCurrentImage = strCurrentImage.replace("_e", "_c");
	}
	else if ( strCurrentClass.indexOf("visible") != -1 ) 
	{
		strCurrentClass = strCurrentClass.replace("visible", "hidden");
		strMainClass = "recTrackDetailsPanel";
		strCurrentImage = strCurrentImage.replace("_c", "_e");
	}

	setClass( p_objectId, strCurrentClass );
	setClass( p_objectIdB, strMainClass );
	temp.src = strCurrentImage;
	
} // end of function displayAlternate

 /*******************************************************************************
 * Description:	we need to know which class is being used for the track
 * Parameters:	p_objectId - the id of the object to change
 *
 * History
 * ver	date			who					comment
 *------------------------------------------------------------------------------
 * 1.0	19-Aug-2004		Chris Gair			Created
 ******************************************************************************/ 
function altMouseOver(p_objectId) {
	var objElement;
	var objMainTrack;
	
	objElement = document.getElementById(p_objectId);

	if (objElement.className == "altOtherTrackDetailsPanel"){
		setClass(p_objectId,'altOtherTrackDetailsPanel_over');
	}
	else{
		setClass(p_objectId,'otherTrackDetailsPanel_over');
	}
	
	
} // end of function displayAlternate

 /*******************************************************************************
 * Description:	we need to know which class is being used for the track
 * Parameters:	p_objectId - the id of the object to change
 *
 * History
 * ver	date			who					comment
 *------------------------------------------------------------------------------
 * 1.0	19-Aug-2004		Chris Gair			Created
 ******************************************************************************/ 
function altMouseOut(p_objectId) {
	var objElement;
	var objMainTrack;
	
	objElement = document.getElementById(p_objectId);

	if ((objElement.className == "altOtherTrackDetailsPanel") || (objElement.className == "altOtherTrackDetailsPanel_over")){
		setClass(p_objectId,'altOtherTrackDetailsPanel');
	}
	else{
		setClass(p_objectId,'otherTrackDetailsPanel');
	}
	
	
} // end of function displayAlternate

/*******************************************************************************
 * Description:	we need to know which class is being used for the track
 * Parameters:	p_objectId - the id of the object to change
 *
 * History
 * ver	date			who					comment
 *------------------------------------------------------------------------------
 * 1.0	19-Aug-2004		Chris Gair			Created
 ******************************************************************************/ 
function altRecMouseOver(p_objectId) {
	var objElement;
	var objMainTrack;
	
	objElement = document.getElementById(p_objectId);

	if (objElement.className == "altRecTrackDetailsPanel"){
		setClass(p_objectId,'altRecTrackDetailsPanel_over');
	}
	else{
		setClass(p_objectId,'recTrackDetailsPanel_over');
	}
	
	
} // end of function displayAlternate

 /*******************************************************************************
 * Description:	we need to know which class is being used for the track
 * Parameters:	p_objectId - the id of the object to change
 *
 * History
 * ver	date			who					comment
 *------------------------------------------------------------------------------
 * 1.0	19-Aug-2004		Chris Gair			Created
 ******************************************************************************/ 
function altRecMouseOut(p_objectId) {
	var objElement;
	var objMainTrack;
	
	objElement = document.getElementById(p_objectId);

	if ((objElement.className == "altRecTrackDetailsPanel") || (objElement.className == "altRecTrackDetailsPanel_over")){
		setClass(p_objectId,'altRecTrackDetailsPanel');
	}
	else{
		setClass(p_objectId,'recTrackDetailsPanel');
	}
	
	
} // end of function displayAlternate
/*******************************************************************************
* Description:	set of functions included for compatibility with old look
* Parameters:	
*
* History
* ver	date			who					comment
*------------------------------------------------------------------------------
* 		23-June-2004	Chris Gair			Created
******************************************************************************/ 
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v3.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

//end of compatability functions

function createRollOver(libId){
	var winl = (screen.width - 400) / 2;
	var wint = (screen.height - 150) / 2;
	
	winprops = 'height=150,width=400,top='+wint+',left='+winl+',resizeable=no,menubars=no,toolbars=no,scrollbars='+scroll+'';

	miniWin = displayPopup("showMiniProfile.cfm?libId="+libId, "", winprops);
}

function closeWindow(){
	if (miniWin != null){
		miniWin.close();
	}
}

function getCountryName(){
	var selectedvalue = document.forms[0].Country.selectedIndex;
	var countryselected = document.forms[0].Country[selectedvalue].value;
	
	document.forms[0].guestCountryId.value = countryselected;
	document.forms[0].submit();
}

function changeTerritory(){
	var selectedvalue = document.forms[0].Country.selectedIndex;
	var countryselected = document.forms[0].Country[selectedvalue].value;
	var action = document.forms[0].action;

	if (!countryselected == 0){
		action = action + "&CountryId="+countryselected;
		document.forms[0].action = action;
		document.forms[0].submit();
	}
}

/*******************************************************************************
* Description:	set of functions used to give javascript alert messages
* Parameters:	
*
* History
* ver	date			who					comment
*------------------------------------------------------------------------------
* 		12-Nov-2004	Chris Gair			Created
******************************************************************************/
function guestMP3(langId){
	if (langId == 44){
	     szError="Sorry, the broadcast quality tracks are only available to registered users.\r\n";
        szError+="To become a registered user simply select the register with site option on the toolbar.\r\n";
        szError+="If you are already a registered user, please select the registered users login option ";
        szError+="and enter your username and password";
	}
	else if (langId == 33){
	 	szError="Désolé, les titres de qualité diffusée ne peuvent être utilisés que par les utilisateurs déjà inscrits.\r\n";
        szError+="Pour devenir membre, sélectionnez l'option d'inscription sur le site située sur la barre d'outils.\r\n";
        szError+="Si vous êtes déjà membre, sélectionnez l'option de connexion des utilisateurs déjà inscrits, ";
        szError+="puis entrez votre nom d'utilisateur et votre mot de passe";
	}
	else if (langId == 34){
	 	szError="Lo sentimos, las pistas de calidad de reproducción sólo están disponibles para usuarios suscritos.\r\n";
        szError+="Para suscribirse como usuario, seleccione la opción 'Suscribirse en la página web' en la barra de herramientas.\r\n";
        szError+="Si ya está suscrito como usuario, seleccione la opción de conexión de";
        szError+="usuarios suscritos e introduzca su nombre de usuario y contraseña   ";
	}
	else if (langId == 39){
	  	szError="Siamo spiacenti. I brani in qualità da trasmissione sono a disposizione esclusivamente degli utenti registrati.\r\n";
        szError+="Per diventare un utente registrato, seleziona nel sito l'opzione registrazione sulla barra strumenti.\r\n";
        szError+="Se sei già un utente registrato, seleziona l'opzione di collegamento per ";
        szError+="utenti registrati e quindi digita il nome utente e la password";
	}
	else if (langId == 49){
		szError="Wir bitten um Entschuldigung, die Musikstücke in Broadcast-Qualität sind nur registrierten Nutzern zugänglich.\r\n";
        szError+="Wenn Sie sich registrieren lassen möchten, wählen Sie einfach die Option Registrieren aus der Symbolleiste aus.\r\n";
        szError+="Wenn Sie bereits als Nutzer registriert sind, wählen Sie die Option Login für registrierte ";
        szError+="Nutzer aus und geben Sie Ihren Nutzernamen und Ihr Passwort ein";
	}
	else{
	    szError="Sorry, the broadcast quality tracks are only available to registered users.\r\n";
        szError+="To become a registered user simply select the register with site option on the toolbar.\r\n";
        szError+="If you are already a registered user, please select the registered users login option ";
        szError+="and enter your username and password";
	}
	alert(szError);
} 

/******************************************************************************
 *	Description:	Alerts the user that they need to have java installed
 *	Parameters:		p_intLanguageId - the id of the language to alert the user in
 *	Returns:		none
 *	
 *	History
 *	ver		date		who				comment
 *	---------------------------------------------------------------------------
 *	1.0	24-Nov-2004		Chris Gair		Created
 ******************************************************************************/
function javaMessage(p_intLanguageId) {
		
		switch (p_intLanguageId){
			case 44:
				alert('In order to use personalisation you need the correct version of java installed');
				break;
			case 33:
				break;
			case 34:
				break;
			case 39:
				break;
			case 49:
				break;
			default:
				alert('In order to use personalisation you need the correct version of java installed');
				break;
		}
		
}
// end of alert messages.

/******************************************************************************
 *	Description:	Makes a new option element for list
 *	Parameters:		p_strValue - the value of the option element
 *					p_strText	- the test to display in the list
 *	Returns:		Option DOM element
 *	
 *	History
 *	ver		date		who					comment
 *	---------------------------------------------------------------------------
 *	1		14-Dec-2004	Graeme Wilkinson	Created
 ******************************************************************************/
function makeOptionElement(p_strValue, p_strText) {
	
	retval = new Option(p_strText, p_strValue, false, false);
	return retval;
}

/******************************************************************************
 *	Description:	Adds a option element to a list
 *	Parameters:		p_objList - The list to add the option element to
 *					p_objOption	- the option to add
 *					p_bolSelect - if true the newly added option will be
 *								selected
 *	Returns:		None
 *	
 *	History
 *	ver		date		who					comment
 *	---------------------------------------------------------------------------
 *	1		14-Dec-2004	Graeme Wilkinson	Created
 ******************************************************************************/
function addToList(p_objList, p_objOption, p_bolSelect, p_bolSort) {

	objOptions = p_objList.options;
	bolAdd = true;
	
	// check the option is not already added
	for( i=0; i<objOptions.length ; i++) {
		if( objOptions[i].value == p_objOption.value ) {
			bolAdd = false;
		}
	}

	if( bolAdd ) {
		
		objOptions[objOptions.length] = p_objOption;
		p_objList.selectedIndex = objOptions.length - 1;
		
		// now sort the list if neccessary
		/*if( p_bolSort ) {
			newListOptions = new Array( objOptions.length );
			for( i=0 ; i<newListOptions.length ; i++ ) {
				newListOptions[i] = makeOptionElement(objOptions[i].value, objOptions[i].text);
			}
			
			newListOptions.sort( compareOptionText );
			for( i=0 ; i<newListOptions.length ; i++ ) {
				p_objList.options[i] = newListOptions[i];
				
				if( p_objList.options[i].value == p_objOption.value && p_bolSelect ) {
					p_objList.options[i].selected = true;
				}
			}
		}*/

	}
}

function removeFromList(p_objList, p_intIndex) {
	p_objList.remove( p_intIndex );
}

function selectInListWithValue(p_objList, p_intValue) {
	
	bolFound = false;
	
	for( i=0 ; i<p_objList.options.length ; i++) {
		if( p_objList.options[i].value == p_intValue ) {
			p_objList.selectedIndex = i;
			bolFound = true;
			break;
		}
	}
	
	return bolFound;
}

function compareOptionText(a, b) { 

  // Radix 10: for numeric values

  // Radix 36: for alphanumeric values

  var sA = parseInt( a.text.toLowerCase(), 36 );  

  var sB = parseInt( b.text.toLowerCase(), 36 );  

  return sA - sB;

}

var gSearchDiv = 'search_results';

function setSearchDiv(inName)

{
	gSearchDiv = inName;
}

function displayWaitPanel()

{
	var panel = xGetElementById('please_wait');
	var blanket = xGetElementById('please_wait_blanket');
	var winW = xClientWidth();
	var winH = xClientHeight();
	var panelW = xWidth(panel);
	var panelH = xHeight(panel);
	
	var x = (winW / 2) - (panelW / 2);
	var y = (winH / 2) - (panelH / 2);
	
	
	xMoveTo(panel, x, y, 500);
	xMoveTo(blanket, 0, 0, 500);
	xWidth(blanket, xClientWidth());
	xHeight(blanket, xClientHeight());
	xShow(blanket);
	xShow(panel);
	xAddEventListener(blanket, 'mousemove', disableWindow, true);
	xAddEventListener(blanket, 'click', disableWindow, true);
	xAddEventListener(blanket, 'mousedown', disableWindow, true);
	xAddEventListener(blanket, 'mouseup', disableWindow, true);
	xAddEventListener(blanket, 'keypress', disableWindow, true);
}

function hideWaitPanel()

{
	var panel = xGetElementById('please_wait');
	var blanket = xGetElementById('please_wait_blanket');
	
	xHide(panel);
	xHide(blanket);

	xRemoveEventListener(blanket, 'mousemove', disableWindow, true);
	xRemoveEventListener(blanket, 'click', disableWindow, true);
	xRemoveEventListener(blanket, 'mousedown', disableWindow, true);
	xRemoveEventListener(blanket, 'mouseup', disableWindow, true);
	xRemoveEventListener(blanket, 'keypress', disableWindow, true);
}

function disableWindow()

{

	return true;
}