/******************************************************************************
 *
 * Copyright (c) Enigma Interactive 2005
 * 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: 	presentation.js
 * Description:	Javascript functions to handle the presentation aspects of the play site
 * 				Roles include: resizing divs on page resize, maintaining onLoad functionality.
 *
 *
 * History
 * ver	date		who			comment
 * ----------------------------------------------------------------------------
 * 1 	20-Jan-2005	Andy Lewis	Created
 *****************************************************************************/

var gResizeElements = new Array();	// Array of elements that will resize with the window
var gLoadFunctions = new Array();  // Array of functions to be called on window loading.
var gResizeIds = new Array();
var gResizeBoundries = new Array();
var gScrollNames = new Array();
var gScrollValues = new Array();
var gScrollAnchors = new Array();
var gScrollOffsets = new Array();
var gClickHandlers = new Array();
var gClickLabels = new Array();
var gPageInfo = new Array();
var gDoneResizeOnload = false;
var gSafari = false;
var gIEMac = false;
var gUniqueId = 1;
var gOldColor = '000';
var flashComm;

if (navigator.userAgent && (navigator.userAgent.indexOf("Safari") >= 0))
	gSafari = true;

if (navigator.userAgent && (navigator.userAgent.indexOf("MSIE") >= 0) && (navigator.userAgent.indexOf("Mac") >= 0))
	gIEMac = true;


// Add a div for auto resizing. It only affects the height.
// boundryId is the id for the div providing the 'bottom boundry'.
function addResizeDiv(id, boundryId)

{
	var theDiv = xGetElementById(id);
	var boundryDiv = xGetElementById(boundryId);
	
	if (theDiv == null)
		return;
	
	theDiv.boundryDiv = boundryDiv;
	gResizeElements[gResizeElements.length] = theDiv;
}

function clearSiteStructure()

{
	
	if (typeof(closeDialogs) == "function") {
		closeDialogs();
	}


	xInnerHtml('main_content', '');
	xInnerHtml('body_main', '');
	xInnerHtml('project_bar', '');
	xHide('wait_promo');
}

function addResize(id, boundryId)

{
	gResizeIds[gResizeIds.length] = id;
	gResizeBoundries[gResizeBoundries.length] = boundryId;
	
	if (!gDoneResizeOnload) {
		addOnloadFunction(winInitResize);
		addOnloadFunction(winResizeDivs);
		gDoneResizeOnload = true;
	}
}

// Add a function to the onLoad list. This means you don't have to worry about overriding existing onLoads.
function addOnloadFunction(func)

{
	gLoadFunctions[gLoadFunctions.length] = func;
}

function addClickHandler(label, func)

{
	gClickHandlers[gClickHandlers.length] = func;
	gClickLabels[gClickLabels.length] = label;
}

function winClick(evt)

{
	var e = new xEvent(evt);
	var index = 0;
	
	for (index = 0; index < gClickLabels.length; index++) {
		if (e.target.id.indexOf(gClickLabels[index]) != -1) {
			gClickHandlers[index](e);
		}
	}
}

xAddEventListener(document, 'click', winClick, false);

function doPers(e)

{
	var id = e.target.getAttribute('id');
	var expr = new RegExp('([a-z]+)_([0-9]+)');
	var test = expr.exec(id);
	
	if (!test)
		return;
	
	if (pageInfo('guest')) {
		showNotAvailable(3);
		return;
	}
	
	var type = e.target.getAttribute('type');
	if(!type)
		type = 'note';
	
	switch (test[1]) {
		case 'cd' : 
			scd(test[2], 0, pageInfo('categoryId'), type);
			break;
		case 't' :
			std(test[2], 0, type);
			break;
		case 'r' :
			srd(test[2], 0, type);
			break;
		case 'p' :
			spd(test[2], 0, type);
			break;
	}
}

function getFlashComm() {
	flashComm = (navigator.appName.indexOf("Microsoft") != -1) ? window.mp3player : window.document.mp3player;
}

function doAudition(trackId, trackFile, trackDetail)

{
	var id = trackId;
	var expr = new RegExp('aud_([0-9]+)');
	var test = expr.exec(id);
	var index = 0;
	var oldImage = null;
	var newImage = null;
	
	if (!test)
		return;
	
	var newId = test[1];
	
	document.multi_form.action = '/logic/audition_track.cfm';
	document.multi_form.elements[0].name = 'trackId';
	document.multi_form.elements[0].value = test[1];
	document.multi_form.submit();
	doTrackHilite(newId);
	
	if(flashComm)
		flashComm.playThisTrack(trackFile,trackDetail);
	else
		document.location.href = 'http://'+trackFile+'.mp3';
	
}

function doTrackHilite(id)

{
	var previousId = 0;
	var newImage = null;
	var oldImage = null;
	var testColor = '';
	var oldTitle = null;
	
	if (!xDef(id))
		id = pageInfo('lastAuditioned');
	else
		previousId = pageInfo('lastAuditioned', id);

	for (index = 1; index <= gUniqueId; index++) {
		newImage = xGetElementById("aud_" + id + '_' + index);
		if (previousId && (previousId != id)) 
			oldImage = xGetElementById("aud_" + previousId + '_' + index);
		
		if (oldImage) {
			oldImage.src = oldImage.src.replace("_hi_1", "_off");
			oldImage.src = oldImage.src.replace("_hi_0", "_off");
			xColor('ttt_' + previousId + '_' + index, gOldColor);
		}
		if (newImage) {
			newImage.src = newImage.src.replace("_off", "_hi_0");
			newImage.src = newImage.src.replace("_on", "_hi_0");
			oldTitle = xGetElementById('ttt_' + id + '_' + index);
			if (oldTitle) {
				tstColor = xGetComputedStyle(oldTitle, 'color');
				if (testColor != '#BD0311')
					gOldColor = testColor;
			}
			xColor('ttt_' + id + '_' + index, '#BD0311');
		}
	}
}

function doDownload(e)

{
	var id = e.target.getAttribute('id');
	var expr = new RegExp('tdl_([0-9]+)');
	var test = expr.exec(id);
	var guest = pageInfo('guest');
	var languageId = pageInfo('languageId');
	
	if (!test)
		return;

	if (guest)
		showNotAvailable(4);
	else
		document.location.href = '/pages/download/copyright.cfm?trackId=' + test[1];
}

function doViewCD(e)

{
	var id = e.target.getAttribute('id');
	var expr = new RegExp('vcd_([0-9]+)');
	var test = expr.exec(id);
	var categoryId = pageInfo('categoryId');
	
	if (!test)
		return;

	if (categoryId)
		vcd(test[1], categoryId);
	else
		vcd(test[1]);
}

addClickHandler('_nv_', doPers);
addClickHandler('_kv_', doPers);
addClickHandler('_pi_', doPers);
//addClickHandler('aud_', doAudition);

addOnloadFunction(doTrackHilite);
addOnloadFunction(getFlashComm);
addClickHandler('tdl_', doDownload);
addClickHandler('vcd_', doViewCD);


// The master onLoad function.
function winOnLoad()

{
	var index = 0;

	for (index = 0; index < gLoadFunctions.length; index++) {
		gLoadFunctions[index]();
	}
	
	// Do we have dialogs to worry about?
	// If so, make sure they get priority
	window.onunload = clearSiteStructure;
	if (typeof(closeDialogs) == "function") {
		window.onfocus = showDialogs;
		window.onmousedown = showDialogs;
	}
}

// Set up the event handler for window resizing.
function winInitResize()

{
	var index = 0;
	
	xAddEventListener(window, 'resize', winResizeDivs, false);
	
	for (index = 0; index < gResizeIds.length; index++) {
		addResizeDiv(gResizeIds[index], gResizeBoundries[index])
	}	
}

// Trigger the resizing. We do the 'setTimeout' method, as ie Mac will call this event 
// *before* moving the boundry Divs. Which is bad[TM]
function winResizeDivs()

{
	//ie Mac 5.2 workaround
	setTimeout('winResizeDivsSelf();', 5);
}

// Actually do the resizing work. Some functions get all the fun.
function winResizeDivsSelf()

{
	var index = 0;
	
	
	/* if (gResizeElements.length > 0) {
		xHeight('body_main_holder', xClientHeight());
		//xMoveTo('project_bar', 0, xClientHeight() - xHeight('project_bar'));
	} */

	for (index = 0; index < gResizeElements.length; index++) {
		theDiv = gResizeElements[index];
		boundry = theDiv.boundryDiv;
		height = xPageY(boundry) - xPageY(theDiv);
		
		xHeight(theDiv, height);
	}
}


function waitGo(url)

{
	window.location.href = url;
	setTimeout('wait();', 10);
}


function wait()

{
	var reference = xGetElementById(gSearchDiv);
	var panel = xGetElementById('wait_promo');
	var blanket = xGetElementById('please_wait_blanket');
	var promoImage = xGetElementById('wait_promo_img');
	var refW = xWidth(reference);
	var refX = xPageX(reference);
	var refY = xPageY(reference);
	var panelW = xWidth(panel);
	var x = ((refW / 2) - (panelW / 2)) + refX;
	var y = 100 + refY;
	
	xMoveTo(panel, x, y);
	xMoveTo(blanket, 0, 0);
	xWidth(blanket, xClientWidth());
	xHeight(blanket, xClientHeight());
	
	xInnerHtml(reference, '&nbsp;');
	
	xShow(blanket);
	xShow(panel);
	
	// Next one is to overcome a typical IE 'feature'
	setTimeout("document.images['wait_promo'].src = '" + document.images['wait_promo'].src + "'", 100);
	
	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);
			
	return true;
}


function generalParam(name, value)

{
	var params = document.general_form.general_params.value;
	
	if (params != '')
		params = params + '&';
	
	params = params + name + '=' + value;
	
	document.general_form.general_params.value = params;
}


function scrollPosition(name)

{
	var params = document.general_form.scroll_positions.value;
	var pos = xScrollTop(name);
	
	if (params != '')
		params = params + '&';
	
	params = params + name + '=' + pos;
	
	document.general_form.scroll_positions.value = params;
}


function scrollAnchor(name, anchorId)

{
	var params = document.general_form.scroll_positions.value;

	if (params != '')
		params = params + '&';
	
	params = params + name + '=' + anchorId;
	
	document.general_form.scroll_positions.value = params;
}


function goLib(libraryId, categoryId)

{
	if (typeof(categoryId) != 'undefined') {
		generalParam('categoryId', categoryId);
	}
	
	generalParam('libraryId', libraryId);
	scrollPosition('left_content');
	
	wait();
	document.general_form.submit();
}


function goCat(categoryId, allTracks)

{
	if (xDef(allTracks))
		generalParam('allTracks', 1);
	
	generalParam('categoryId', categoryId);
	scrollPosition('left_content');
	
	wait();
	document.general_form.submit();
}

function hideResults(p_divId) {
	xHide(p_divId);
	//xDisplay(p_divId, 'none');
}

function allTracks(categoryId)

{
	goCat(categoryId, 1);
}

function goK(keywordId)

{
	generalParam('k', keywordId);
	scrollPosition('left_content');
	
	wait();
	document.general_form.submit();
}

function delProjectItem(itemId, projectId)

{
	generalParam('del', itemId);
	generalParam('item', projectId);
	scrollPosition('content_panel');
	
	wait();
	document.general_form.submit();
}

function setProj(projId)

{
	generalParam('setproj', projId);
	scrollPosition('content_panel');
	
	wait();
	document.general_form.submit();
}

function setReport(reportId)

{
	generalParam('setReport', reportId);
	scrollPosition('content_panel');
	
	wait();
	document.general_form.submit();
}

function addScrollPosition(name, value)

{
	gScrollNames[gScrollNames.length ] = name;
	gScrollValues[gScrollValues.length ] = value;
	gScrollAnchors[gScrollAnchors.length ] = '';
	gScrollOffsets[gScrollOffsets.length ] = 0;
}


function addScrollAnchor(name, value, offset)

{
	if (!xDef(offset))
		offset = 0;
	gScrollNames[gScrollNames.length ] = name;
	gScrollValues[gScrollValues.length ] = 0;
	gScrollAnchors[gScrollAnchors.length ] = value;
	gScrollOffsets[gScrollOffsets.length ] = offset;
}


function restoreScrollPositions()

{
	setTimeout("restoreScrollPositions1();", 100);
}


function restoreScrollPositions1()

{
	var index = 0;
	var div = null;
	
	for (index = 0; index < gScrollNames.length; index++) {
		div = xGetElementById(gScrollNames[index]);
		
		if (div) {
			if (gScrollValues[index]) {
				div.scrollTop = gScrollValues[index];
			} else {
				div.scrollTop = (xPageY(gScrollAnchors[index]) - (xPageY(div) + gScrollOffsets[index])) - 5;
			}
		}
	}
}

function scrollToPosition(panelId, position)

{
	var div = xGetElementById(panelId);

	if (div) {
		div.scrollTop = position;
	}
}

function scrollToId(panelId, anchorId, useOffset)

{
	var div = xGetElementById(panelId);
	var target = xGetElementById(anchorId);
	var top =  xPageY(anchorId) - xPageY(panelId);
	
	if (typeof(useOffset) == 'undefined')
		useOffset = false;
		
	//if (useOffset)
		//top =  xOffsetTop(anchorId);
	
	if (div) {
		div.scrollTop = top;
	}
}

var gSubOffset = 0;
var gSearchOffset = 0;
var gLastSearchText = '';
var gExpression = null;
var gLastAnchor = null;

function setSearchButton(which)

{
	var button = xGetElementById('searchButton');
	
	if (!xDef(button))
		return;
		
	switch (which) {
		case 0	:	button.src = button.src.replace('findnext_', 'find_');
					break;
		case 1	:	button.src = button.src.replace('find_', 'findnext_');
					break;
	}
}

function flashSearchText(state)

{
	if (state) {
		xBackground('searchText', '#900');
		setTimeout('flashSearchText(false);', 200);
	} else {
		xBackground('searchText', '#fff');
	}
}


function searchAnchors(containerId, searchText, searchType, useOffset)

{
	var container = xGetElementById(containerId);
	var anchorArray = xGetElementsByTagName('a', container);
	var index = 0;
	var item = 0;
	var sIndex = 0;
	var found = false;
	
	if (typeof(useOffset) == 'undefined')
		useOffset = false;
		
	if (typeof(searchType) == 'undefined')
		searchType = 'normal';
		
	if (searchType != 'normal')
		setSearchButton(0);

	searchText = searchText.toUpperCase();
	
	if (searchText == '') {
		flashSearchText(true);
		return;
	}
	
	if (gLastSearchText != searchText)
		gSearchOffset = 0;
	
	gLastSearchText = searchText;
	
	for (index = 0; index < anchorArray.length; index++) {
		if (searchType != 'starts')
			item = index + gSearchOffset;
		else
			item = index;
			
		if (item >= anchorArray.length)
			item -= anchorArray.length;

		str = xInnerHtml(anchorArray[item]).toUpperCase();

		sIndex = str.indexOf(searchText);

		if (((sIndex >= 0) && (searchType == 'normal')) || 
			((sIndex == 0) && (searchType == 'starts'))) {
			
			found = true;
			if (searchType == 'normal')
				setSearchButton(1);

			scrollToId(containerId, anchorArray[item], useOffset);
			if (searchType != 'starts') {
				gSearchOffset = item + 1;
				xBackground(gLastAnchor, '#B9D5E3');
				xBackground(anchorArray[item], '#EDF4F8');
				
				gLastAnchor = anchorArray[item];
			}
			break;
		}
	}
	if (!found)
		flashSearchText(true);
}


function searchKeywordAnchors(containerId, searchText)

{
	var container = xGetElementById(containerId);
	var subArray = new Array();
	var result = '';
	var test = null;
	var continuing = true;
	var found = false;
	
	if (true) {
		searchAnchors(containerId, searchText, 'normal');
		return;
	}
	str = xInnerHtml(container);
	alert(str);
		
	searchText = searchText.replace(/[^A-Z0-9]/g, '');
	
	if (searchText == '') {
		flashSearchText(true);
		return;
	}
			
	if (gLastSearchText != searchText) {
		gExpression = new RegExp('<a[^>]+?id="?([^" ]+)[^>]+?>[^<]*?(' + searchText + ')[^<]*?<', 'ig');
		gLastSearchText = searchText;
		continuing = false;
	}

	test = gExpression.exec(str);
	if (!test) {
		gLastSearchText = '';
		xBackground(gLastAnchor, '#B9D5E3');
		gLastAnchor = null;
		if (continuing)
			searchKeywordAnchors(containerId, searchText);
		return;
	}
	
	xBackground(gLastAnchor, '#B9D5E3');
	gLastAnchor = xGetElementById(test[1]);
	xBackground(gLastAnchor, '#EDF4F8');
	
	scrollToId(containerId, gLastAnchor, true);
}

function dtl(p_itemId, trackIds, displayType, categoryId, dbSearch, pageMediaId, type)

{
	var listId = ((type == 1) || (type == 9)) ? 'track_list_' : 'alt_list_';
	var oTrackList = xGetElementById(listId + p_itemId);

	if (oTrackList.loadedTrackList == 1) {
		switch (type) {
			case 1	:
			case 9	:
				displayTrackList('track_list_' + p_itemId, 'track_ctrl_' + p_itemId);
				break;
			default	:
				displayAlternate('alt_list_' + p_itemId, 'mmbT' + p_itemId, 'track_' + p_itemId);
		}
		
		return;
	}
	oTrackList.loadedTrackList = 1;

	document.fLoadTrack.cdId.value = p_itemId;
	document.fLoadTrack.categoryId.value = categoryId;
	document.fLoadTrack.database_search.value = dbSearch;
	document.fLoadTrack.displayType.value = displayType;
	document.fLoadTrack.trackIds.value = trackIds;
	document.fLoadTrack.pageMediaId.value = pageMediaId;
	document.fLoadTrack.type.value = type;
	document.fLoadTrack.uniqueId.value = ++gUniqueId;
	document.fLoadTrack.submit();
}

function load_tracks(p_itemId, type, node)

{
	var listId = (type == 1) ? 'track_list_' : 'alt_list_';
	var oTrackList = xGetElementById(listId + p_itemId);
	var html = xInnerHtml(oTrackList) + xInnerHtml(node);

	if (gSafari)
		html = html.replace(/\n/g, '');
		
	xInnerHtml(oTrackList, html);
	
	xGetElementsByClassName('r_o', oTrackList, 'img', addRollover);
	doTrackHilite();
	
	if (type == 1)
		displayTrackList(listId + p_itemId, 'track_ctrl_' + p_itemId);
	else
		displayAlternate(listId + p_itemId, 'mmbT' + p_itemId, 'track_' + p_itemId);
}


function iRollOver(evt)

{
	var target;
	var e = evt || window.event;
	
	if (e.target) target = e.target;
  		else if(e.srcElement) target = e.srcElement;	
	
	rollOver(target);
}

function iRollOut(evt)

{
	var target;
	var e = evt || window.event;
	
	if(e.target) target = e.target;
  		else if(e.srcElement) target = e.srcElement;	

	rollOut(target);
}

var gImCount = 0;

function addRollover(image)

{
	image.onmouseover = iRollOver;
	image.onmouseout = iRollOut;
	
	image.title = image.alt;
}

function vcd(cdId, trackId) 

{
	var url = '/pages/viewcd/viewcd.cfm?cdnum=' + cdId;
	
	if (xDef(trackId))
		url = url + '&trackId=' + trackId;
		
	waitGo(url);
}

function createRollovers()

{
	if (!gIEMac)
		xGetElementsByClassName('r_o', document, 'img', addRollover);
}

function pageInfo(key, value)

{
	var infoDiv = xGetElementById('main_pageinfo_div');
	var result = 0;
	var intResult = 0;
	
	if (infoDiv) {
		result = infoDiv.getAttribute(key);
		
		if (typeof(result) == 'string') {
			if (result.indexOf('array:') == 0) {
				result = result.replace('array:', '');
				result = eval('[' + result + ']');
						
			} else if (result.indexOf(',') == -1) {
				intResult = parseInt(result);
				
				if (!isNaN(intResult))
					result = intResult;
			}
		}
		if (xDef(value))
			infoDiv.setAttribute(key, value);

	}
	
	return result;
}

// Finally, set up our onLoad stuff. 
window.onload = winOnLoad;
addOnloadFunction(restoreScrollPositions);
addOnloadFunction(createRollovers);

function updateIcons(trackIds, cdIds, status)

{
	var index = 0;
	
	for (index = 0; index < trackIds.length; index++) {
		updateTrackProjectIcon(trackIds[index], status);
	}

	for (index = 0; index < cdIds.length; index++) {
		updateCDProjectIcon(cdIds[index], status);
	}
}

function updateTrackProjectIcon(trackId, status)

{
	var index = 1;
	var prefix = 'ati_' + trackId + '_';
	
	if (!xDef(status))
		status = true;
	
	while (index <= gUniqueId) {
		objIcon = xGetElementById(prefix + index);
		index++;
		
		if (objIcon) {
			strImageSrc = objIcon.src;
			
			if (status) {
				strImageSrc = strImageSrc.replace(/at_(0|1|on|on)/, 'at_in_$1');
			} else {
				strImageSrc = strImageSrc.replace(/at_in_(0|1|on|on)/, 'at_$1');
			}
			objIcon.src = strImageSrc;
		}
	}
}

function updateCDProjectIcon(trackId, status)

{
	var index = 1;
	var prefix = 'aci_' + trackId + '_';
	if (!xDef(status))
		status = true;
		
	while (objIcon = xGetElementById(prefix + index)) {
		index++;
		strImageSrc = objIcon.src;

		if (status) {
			strImageSrc = strImageSrc.replace("acd_off", "acd_hi_0");
			strImageSrc = strImageSrc.replace(/acd_[01]/, "acd_hi_0");
		} else {
			strImageSrc = strImageSrc.replace(/acd_hi_[01]/, "acd_off");
		}

		objIcon.src = strImageSrc;
	}
}