var browserIsIE = navigator.appName == "Microsoft Internet Explorer" && getInternetExplorerVersion() < 8.0;
var domClassName = browserIsIE ? "className" : "class"; // problems with IE

function setStyle(item, styleText)
{
	if (browserIsIE) {
		item.style.cssText = styleText;
	}
	item.setAttribute("style", styleText);
}



// Setup list update
var luBase = [], luIds = [], luActive = [], luSeconds = [], luTimeout = [];
function luStart(luIndex)
{
    luClear(luIndex);
	luTimeout[luIndex] = setTimeout("luProcess(" + luIndex + ")", luSeconds[luIndex] * 1000);
}
function luStop(luIndex)
{
	luClear(luIndex);
}

function luProcess(luIndex)
{
	luActive[luIndex] = luIds[luIndex].length > 0 ?
	 ((luActive[luIndex] + 1) % luIds[luIndex].length) : 0;
	luFocusSingly(luIndex, luIds[luIndex][luActive[luIndex]]);
	luStart(luIndex);
}

function luFocusSingly(luBaseId, elementId)
{
	var luIndex;
	for (luIndex = 0; luIndex < luIds[luBaseId].length; ++luIndex) {
		var luElem = document.getElementById(luIds[luBaseId][luIndex]);
		if (luElem.getAttribute(domClassName) &&
			 luElem.getAttribute(domClassName) == "luDisplay") {
			luBlur(luIds[luBaseId][luIndex]);
		}
	}
	luFocus(elementId);
}
function luFocus(elementId)
{
	focusElem = document.getElementById(elementId);
	if (!focusElem) {
		return false;
	}

	focusElem.setAttribute(domClassName, "luDisplay");

	var focusLabel = document.getElementById(elementId + "Label");
	if (focusLabel) {
		focusLabel.setAttribute(domClassName, "current");
	}
}
function luBlur(elementId)
{
	blurElem = document.getElementById(elementId);
	if (!blurElem) {
		return false;
	}

	blurElem.removeAttribute(domClassName);

	var blurLabel = document.getElementById(elementId + "Label");
	if (blurLabel) {
		blurLabel.removeAttribute(domClassName);
	}
}

// Clear any timeout
function luClear(luIndex)
{
	if (luTimeout[luIndex] != -1) {
		clearTimeout(luTimeout[luIndex]);
		luTimeout[luIndex] = -1;
	}
}

// Setup all the moving boxes
function luSetup()
{
	// Contained in div class="luContainer"
	var divs = document.getElementsByTagName("div"), childIndex, childElem;

	for (childIndex = 0; childIndex < divs.length; ++childIndex) {
		if (divs[childIndex]) {
			var divClass = divs[childIndex].getAttribute(domClassName);
			if (divClass && divClass.match(/(?: |^)luContainer(?: |$)/) != null) {
				luBase[luBase.length] = divs[childIndex].attributes["id"].nodeValue;
			}
		}
	}

	// Parse through found elements
	for (childIndex = 0; childIndex < luBase.length; ++childIndex) {
		luIds[childIndex] = [];
		luActive[childIndex] = 0;
		luSeconds[childIndex] = 10;
		luTimeout[childIndex] = -1;

		// Make sure it contains a list of content
		var luCurrent = document.getElementById(luBase[childIndex]);
		var dList = luCurrent.getElementsByTagName("dl");
		if (!dList[0]) {
			return;
		}

		// Setup content with defaults
		var dlChild, dlChildElem;
		for (dlChild = 0; dlChild < dList.length; ++dlChild) {
			dlChildElem = dList[dlChild];
			if (dlChildElem && dlChildElem.nodeType == 1 &&
				 dlChildElem.getAttribute("id")) {
				var luId = dlChildElem.getAttribute("id");

				luIds[childIndex][luIds[childIndex].length] = luId;

				var labelElem = document.getElementById(luId + "Label");
				if (labelElem) {
					var labelA = labelElem.getElementsByTagName("a");
					if (labelA[0]) {
						eval("labelA[0].onmouseover = function(){ luFocusSingly(" +
						 childIndex + ", \"" + luId + "\"); luActive[" +
						 childIndex + "] = " + dlChild + "; return false; }");
					}
				}
			}
		}
		if (luIds[childIndex].length > 0) {
			luFocusSingly(childIndex, luIds[childIndex][0]);
		}

		// Add functionality
		eval("luCurrent.onmouseover = function(){ luStop(" +
		 childIndex + "); }");
		eval("luCurrent.onmouseout = function(){ luStart(" +
		 childIndex + "); }");
		luCurrent.onmouseout();
	}
}







// Convert news headlines into a news ticker
var newsHeadlines = [], newsLinks = [], newsRun = true, newsPosition = 0,
 newsTimeout = -1, newsCurrent = 0, newsDelayStart = 1500, newsDelayLetter = 50,
 newsDelayNext = 3000, newsSource = "news-headline", newsOutput = "news-headline-box",
 newsElemAdd = "p", newsDivId = "newsTicker";

// Clear any timeout
function newsClear()
{
	if (newsTimeout != -1) {
		clearTimeout(newsTimeout);
		newsTimeout = -1;
	}
}

// Displays newsPosition characters of headline with index newsCurrent
function newsProcess()
{
	if ((!newsRun) || newsHeadlines.length < 1) {
		return false;
	}
	newsClear();

	// Saving CPU but not rewriting a, title every time
	var writeFunc = newsPosition == 0 ? newsWrite : newsUpdate;
	writeFunc(newsHeadlines[newsCurrent].substr(0, newsPosition + 1),
	 newsLinks[newsCurrent]);

	var curHead = newsHeadlines[newsCurrent];
	if (newsPosition >= (newsHeadlines[newsCurrent].length - 1)) {
		newsTimeout = setTimeout(newsNext, newsDelayNext);
	} else {
 		++newsPosition;
		newsTimeout = setTimeout(newsProcess, newsDelayLetter);
	}
}

// Progress to the next headline
function newsNext()
{
	newsPosition = 0;
	newsCurrent = (newsCurrent + 1) % newsHeadlines.length;
	newsProcess();
}

// Write the link, title structure
function newsWrite(wText, wLink)
{
	newsElem = document.getElementById(newsDivId);
	if (newsElem.firstChild) {
		newsElem.removeChild(newsElem.firstChild);
	}

	var newsContent = document.createTextNode(wText);
	if (wLink) {
		var newsLink = document.createElement("a");
		newsLink.setAttribute("href", wLink);
		newsLink.appendChild(newsContent);
		newsElem.appendChild(newsLink);
	} else {
		newsElem.appendChild(newsContent);
	}
}

// Faster way to update title, save CPU
function newsUpdate(wText, wLink)
{
	newsElem = document.getElementById(newsDivId);
	var newsA = newsElem.getElementsByTagName("a"), newsTitle;
	newsTitle = newsA[0] ? newsA[0] : newsElem;

	var currLength = newsTitle.firstChild.nodeValue.length
	newsTitle.firstChild.nodeValue +=
	 wText.substr(currLength, wText.length - currLength);
}

// Starts the process function
function newsStart()
{
	newsClear();
	newsRun = true;
	newsTimeout = setTimeout(newsNext, newsDelayNext);
}
// Stops the process function
function newsStop()
{
	newsClear();
	newsRun = false;
	// stops multiple refresh, length+1 to show if only 1 char missing
	if (newsPosition < newsHeadlines[newsCurrent].length) {
		newsPosition = newsHeadlines[newsCurrent].length;
		newsWrite(newsHeadlines[newsCurrent].substr(0, newsPosition),
		 newsLinks[newsCurrent]);
	}
}

// Setup news from element with id latestHeadlines
function newsSetup()
{
	var newsDiv = document.getElementById(newsSource);
	var newsBox = document.getElementById(newsOutput);

	if (!(newsDiv && newsBox)) {
		return false;
	}

	// Hide news headline box; show news headline ticker
	setStyle(newsDiv, "display: none;");
	setStyle(newsBox, "display: block;");

	// Parse for title and base link
	var tickTitle = "News headlines", tickLink = "";
	var titleElem = newsDiv.getElementsByTagName("h2");
	if (titleElem[0]) {
		var titleA = titleElem[0].getElementsByTagName("a");
		if (titleA[0]) {
			tickLink = titleA[0].getAttribute("href");
			tickTitle = titleA[0].firstChild.nodeValue;
		} else {
			tickTitle = titleElem[0].firstChild.nodeValue;
		}
	}

	// Parse for headlines and links
	var newsTags = newsDiv.getElementsByTagName("li");
	for (var liIndex = 0; liIndex < newsTags.length; ++liIndex) {
		var newsA = newsTags[liIndex].getElementsByTagName("a");
		var newsNewLink = newsA[0] ? newsA[0].getAttribute("href") : "";
		var newsNewTitle = (newsA[0] && newsA[0].firstChild) ?
		 newsA[0].firstChild.nodeValue : newsTags[liIndex].firstChild.nodeValue;

		if (newsNewTitle != null && newsNewTitle != "") {
			newsLinks[newsLinks.length] = newsNewLink;
			newsHeadlines[newsHeadlines.length] = newsNewTitle;
		}
	}

	newsDiv.parentNode.removeChild(newsDiv);

	// Exit if there are no headlines
	if (newsHeadlines < 1) {
		return;
	}

	// Set up ticker p
	var newsTicker = document.createElement(newsElemAdd);
	newsTicker.setAttribute("id", "newsTicker");
	newsTicker.onmouseover = newsStop;
	newsTicker.onmouseout = newsStart;
	newsBox.appendChild(newsTicker);
	newsWrite(tickTitle, tickLink);

	newsTimeout = setTimeout(newsProcess, newsDelayStart);
}




// Font size switcher
var fontSizes = [0.69, 0.93, 1.25];
var fontSizeNow = 0;

function fontSizeGet()
{
	var cookieMatch = document.cookie.match(/fontsize=(\d)/i);
	return cookieMatch == null ? fontSizeNow : parseInt(cookieMatch[1]);
}

function fontSizeChange(increment)
{
	newSize = fontSizeNow + increment;
	newSize = newSize >= fontSizes.length ? (fontSizes.length - 1) :
	 (newSize < 0 ? 0 : newSize);
	fontSizeSet(newSize);
}

function fontSizeSet(newSize)
{
	var bodyElements = document.getElementsByTagName("html");
	if (!bodyElements[0]) {
		return false;
	}

	fontSizeNow = newSize;
	bodyElements[0].style.fontSize = fontSizes[fontSizeNow] + "em";
	document.cookie = "fontsize=" + fontSizeNow + "; path=/";
	return true;
}

function fontSizeLoad()
{
	var savedSize = fontSizeGet();
	if (savedSize < fontSizes.length && savedSize >= 0 &&
	     savedSize != fontSizeNow) {
		if (!fontSizeSet(savedSize)) {
			setTimeout(fontSizeLoad, 10); // set ASAP
		}
	}
}




// Simple definition list information switcher - show or hides the description
var itemDtIndex = 0;
function itemSwitch(titleElem)
{
	var processElem = titleElem;
	while ((processElem = processElem.nextSibling) != null) {
	    if (processElem.nodeType == 1 && processElem.nodeName == "DD") {
	        processElem.style.display = processElem.style.display == "block" ?
			 "none" : "block";
	        break;
	    }
	}
}

function itemSetup()
{
	var elemList = document.getElementsByTagName("dl");
	for (var elemIndex = 0; elemIndex < elemList.length; ++elemIndex) {
		if (!(elemList[elemIndex] && elemList[elemIndex].nodeType == 1)) {
		    continue;
		}

		var classStr = String(elemList[elemIndex].getAttribute(domClassName));
		if (classStr.match(/(?: |^)list-itemdetail-dynamic(?: |$)/) == null ||
		     classStr.match(/(?: |^)list-itemdetail-dynamic-done(?: |$)/) != null) {
			continue;
		}

		elemList[elemIndex].setAttribute(domClassName, classStr + " list-itemdetail-dynamic-done");

	    var currentElem = elemList[elemIndex].firstChild;
	    do {
			if (currentElem.nodeType != 1) {
				continue;
			}
			switch (currentElem.nodeName) {
				case "DD":
					currentElem.style.display = "none";
					break;
				case "DT":
					itemSetupDt(currentElem, "itemDescNo" + ++itemDtIndex);
			}
	    } while ((currentElem = currentElem.nextSibling) != null);
	}
}

function itemSetupDt(currentElem, newId)
{
	currentElem.setAttribute("id", newId);
	var aElem = currentElem.getElementsByTagName("a"), aFinal;

	if (aElem[0]) {
		aFinal = aElem[0];
	} else {
		aFinal = document.createElement("a");
		aFinal.innerHTML = currentElem.innerHTML;
		aFinal.setAttribute("href", "#requiresjavascript");

		currentElem.innerHTML = "";
		currentElem.appendChild(aFinal);
	}

	eval("aFinal.onmouseover = function(){var itemDescTmp = document.getElementById(\"" +
	 newId + "\"); if(itemDescTmp) itemSwitch(itemDescTmp); return false;}");
}




// Open URLs in new windows
function onDemand(playerLocation)
{
	window.open(playerLocation, 'ondemand', 'width=530, height=580, scrollbars=1');
	return false;
}

function livePlayer()
{
	window.open('/listen/live', 'liveplayer', 'width=530, height=580, scrollbars=1');
	return false;
}

function thawteSecure()
{
	window.open('https://www.thawte.com/core/process?process=public-site-seal-cert-details&public-site-seal-cert-details.referer=' + window.location.href,
	 'thawtesecure', 'width=500, height=516, scrollbars=1, status=1');
	return false;
}



// Search the Bible functionality - todo catch Enter
function bibleSearch(passageText, searchText)
{
	window.open("http://www.biblegateway.com/cgi-bin/bible?passage=" + passageText + "&search=" + searchText,
	 "searchthebible", "toolbar=0,location =0,directories=0,status=0,scrollbars=1,resizable=1,copyhistory=0,width=700,height=500");
}

function bibleKeyDown(eventHandler)
{
/*alert(eventHandler.keyCode);
	if (!eventHandler) {
		if (window.event.keyCode == 13) {
			psgButton.onclick();
			return;
		}
	}
	eventHandler.keyCode == 13*/
}

function biblePassage(psgButton, psgText)
{
	bibleSearch(psgText.value, '');
}

function bibleKeyword(psgButton, psgText)
{
	bibleSearch('', psgText.value);
}




// Designed to load javascript features fast, before the adverts
var pageLoaded = false;
var quickLoaderTimeout = setTimeout(quickLoader, 100);
var itemSetupInterval = setInterval(itemSetup, 100);
var newsSetupInterval = setInterval(newsSetup, 100);

function quickLoader()
{
	if (quickLoaderTimeout != null) {
		clearTimeout(quickLoaderTimeout);
		quickLoaderTimeout = null;
	}

	// nav-page loads immediately after the content
	if (!(document.getElementById('nav-page') || pageLoaded)) {
		quickLoaderTimeout = setTimeout(quickLoader, 100);
		return;
	}
	
	fontSizeLoad();
	luSetup();

	newsSetup();
	clearInterval(newsSetupInterval);

	itemSetup();
	clearInterval(itemSetupInterval);
}

function getInternetExplorerVersion()
{
  var rv = -1; // Return value assumes failure.
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}

window.onload = function()
{
	pageLoaded = true;
	quickLoader();
};
