/**
 * @author david.owens
 */

var enhancements = function(){
	
	// Helper functions -------------------------
	
	var ie = window.ActiveXObject;
	var ie6 = window.ActiveXObject && !window.XMLHttpRequest;
	
	function hasClass(el, cl) {
		var arrcl = el.className.split(' ');
		var i;
		for (i=0;i < arrcl.length;i++) {
			if (arrcl[i]===cl) {return true;}
		}
		return false;
	}
	
	function addClass(el, cl) {
		if (!hasClass(el, cl)) {
			el.className = el.className + ' ' + cl;
		}
	}
	
	function removeClass(el, cl) {
		var arrcl, i;
		arrcl = el.className.split(' ');
		for (i=0;i < arrcl.length;i++) {
			if (arrcl[i]===cl) { arrcl.splice(i,1); }
		}
		el.className = arrcl.join(' ');
	}
	
	function getElementsByClassName(oElm, strTagName, strClassName){
		var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
		var arrReturnElements = [];
		strClassName = strClassName.replace(/\-/g, "\\-");
		var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
		var oElement;
		for (var i = 0; i < arrElements.length; i++) {
			oElement = arrElements[i];
			if (oRegExp.test(oElement.className)){
				arrReturnElements.push(oElement);
			}
		}
		return arrReturnElements;
	}
	
	function createCookie(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	}

	
	function readCookie(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	}

	
	function eraseCookie(name) {
		createCookie(name,"",-1);
	}

	// Hide and show browse by role -------------------------

	var browseByRole = function() {
		if(!getElementsByClassName(document,"ul","role-navigation")[0]) {
			return;
		}
		var toggleState = "closed";
		var roleNav = getElementsByClassName(document,"ul","role-navigation")[0];
		var roleNavHeader = getElementsByClassName(document,"h2","role-navigation-header")[0];
		
		function setUpRoleLink() {
			var linkContent = roleNavHeader.innerHTML;
			linkContent = '<a href="#">' + linkContent + '<span> - show roles</span></a>';
			roleNavHeader.innerHTML = linkContent;
		}
		
		function toggleRoleNavigation() {

			var helperText = roleNavHeader.getElementsByTagName("span")[0];

			if(toggleState == "closed") {
				removeClass(roleNavHeader,"role-nav-closed");
				addClass(roleNavHeader,"role-nav-open");
				
				removeClass(roleNav,"role-nav-closed");
				addClass(roleNav,"role-nav-open");
				
				helperText.innerHTML =  " - hide roles";
				
				roleNav.tabIndex = "-1" ;
				roleNav.focus();
				
				toggleState = "open";
			} else {
				removeClass(roleNavHeader,"role-nav-open");
				addClass(roleNavHeader,"role-nav-closed");
				
				helperText.innerHTML =  " - show roles";
				
				removeClass(roleNav,"role-nav-open");
				addClass(roleNav,"role-nav-closed");
				
				toggleState = "closed";
			}
			return false;
		}
		
		setUpRoleLink();
		roleNavHeader.onclick = toggleRoleNavigation;
		addClass(roleNav,"role-nav-closed");
		addClass(roleNavHeader,"role-nav-closed");	
	};


	// HIde and show ministers responsibilities -------------

	var ministersResponsibilities = function() {
		if (!getElementsByClassName(document, "div", "ministers")[0]) {
			return;
		}
		
		function toggleResponsibilities(el,toggleState){
			return function(){
				var togglelink = el.getElementsByTagName("h3")[0];
				var responsibilityList = el.getElementsByTagName("ul")[0];
				if (toggleState == "closed") {

					removeClass(togglelink, "resposiblities-closed");
					addClass(togglelink, "resposiblities-open");
					
					removeClass(responsibilityList, "resposiblities-closed");
					addClass(responsibilityList, "resposiblities-open");
					
					responsibilityList.getElementsByTagName("li")[0].tabIndex = "-1";
					responsibilityList.getElementsByTagName("li")[0].focus();	
					
					togglelink.firstChild.innerHTML = 'Hide areas of responsibility';
										
					toggleState = "open";			

				}
				else {
					
					removeClass(togglelink, "resposiblities-open");
					addClass(togglelink, "resposiblities-closed");
					
					removeClass(responsibilityList, "resposiblities-open");
					addClass(responsibilityList, "resposiblities-closed");
					
					togglelink.firstChild.innerHTML = 'View areas of responsibility';
					
					toggleState = "closed";

				}
				return false;
			};
		}
		
		function setUpResposibilityLinks() {
			var ministersBlock = getElementsByClassName(document,"div","ministers")[0];
			var ministers = getElementsByClassName(ministersBlock,"div","vcard");
			for (var i = 0; i < ministers.length; i++) {
				var el = ministers[i];
				var toggleState = "closed";
				if(el.getElementsByTagName("h3")[0]) {
					var toggleHeader = el.getElementsByTagName("h3")[0];
					var responsibilityList = el.getElementsByTagName("ul")[0];
					
					toggleHeader.innerHTML = '<a href="#">View areas of responsibility</a>';
					addClass(toggleHeader, "resposiblities-closed");
					addClass(responsibilityList, "resposiblities-closed");
					toggleHeader.firstChild.onclick = toggleResponsibilities(el,toggleState);
				}
			}
		}
		
		setUpResposibilityLinks();	
		
	};
	
	// Text resizer widget ---------------------------------
	
	var textResizer = function() {
		
		var storedTextSize = readCookie("textsize");
		if (storedTextSize) {
			document.getElementsByTagName("body")[0].style.fontSize = storedTextSize;
		}
		else {
			document.getElementsByTagName("body")[0].style.fontSize = "62.5%";
		}
		
		function increaseFontSize() {
			var fontSize = document.getElementsByTagName("body")[0].style.fontSize;
			var newFontSize = ((parseFloat(fontSize) * 10) + 50) / 10;
			var newFontSizeString = newFontSize + "%";
			document.getElementsByTagName("body")[0].style.fontSize = newFontSizeString;
			createCookie("textsize",newFontSizeString,7);
			return false;
		}
		
		function decreaseFontSize() {
			var fontSize = document.getElementsByTagName("body")[0].style.fontSize;
			var newFontSize = ((parseFloat(fontSize) * 10) - 50) / 10;
			var newFontSizeString = newFontSize + "%";
			document.getElementsByTagName("body")[0].style.fontSize = newFontSizeString;
			createCookie("textsize",newFontSizeString,7);
			return false;
		}
		
		function resetFontSize() {
			document.getElementsByTagName("body")[0].style.fontSize = "62.5%";
			eraseCookie("textsize");
			return false;
		}
		
		var textResizer = document.createElement("li");
		addClass(textResizer, "text-resizer");
		
		var textResizerHTML = "";
		textResizerHTML += '<p>Text size:</p>';
		textResizerHTML += '<ul>';
		textResizerHTML += '<li><a href="#" id="decrease-text"><abbr title="Smaller text">A-</abbr></a></li>';
		textResizerHTML += '<li><a href="#" id="reset-text"><abbr title="Reset text">A</abbr></a></li>';
		textResizerHTML += '<li><a href="#" id="increase-text"><abbr title="Larger text">A+</abbr></a></li>';
		textResizerHTML += '</ul>';
		
		textResizer.innerHTML = textResizerHTML;
		var accessibilityList = getElementsByClassName(document,"ul","accessibility")[0];
		accessibilityList.appendChild(textResizer);
		
		var increaseTextLink = document.getElementById("increase-text");
		increaseTextLink.onclick = increaseFontSize;
		
		var decreaseTextLink = document.getElementById("decrease-text");
		decreaseTextLink.onclick = decreaseFontSize;
		
		var resetTextLink = document.getElementById("reset-text");
		resetTextLink.onclick = resetFontSize;
		
		
	};

	// Split AZ Contact us Lists in three ------------------

	var splitAzContactList = function() {
		if(!getElementsByClassName(document,"ul","contact-a-z")) {
			return;
		}
		function listSplitter() {
			var letterLists = getElementsByClassName(document,"ul","multi-col");
			for (var i = 0; i < letterLists.length; i++) {
				var list = letterLists[i];
				var j,
					k,
					listLength,
					newList,
					l = 0,
					itemsPerColumn = 1,
					extraItems = 0,
					colCount = 3;
					
				var listItems = list.getElementsByTagName("li");
				
				if (listItems.length >= colCount) {
					itemsPerColumn = Math.floor(listItems.length / colCount);
					extraItems = listItems.length % colCount;
				} else {
					colCount = listItems.length;
				}
				
				for (j = 0; j < colCount; j++) {
					
					var listClass = list.className;
					
					newList = document.createElement("ul");
					addClass(newList, listClass);
					
					listLength = itemsPerColumn;
					if (j === 0) {
						addClass(newList,"first-child");
					}
					if (extraItems > 0) {
						listLength++;
						extraItems--;
					}
		
					for(k = 0; k < listLength; k++) {
						
						newList.appendChild(listItems[l]);

					}
					
					list.parentNode.appendChild(newList);
				}
				var listWrapper = list.parentNode;
				listWrapper.removeChild(list);
				
			}			
		}
				
		function matchHeights() {
			var letters = getElementsByClassName(document,"li","az-letter");
			for (var i = 0; i < letters.length; i++) {
				var letter = letters[i];
				var colHeight = 0;
				var cols = letter.getElementsByTagName("ul");
				for (var j = 0; j < cols.length; j++) {
					if (colHeight < cols[j].clientHeight) {
						colHeight = cols[j].clientHeight;
					}
				}
				for (j = 0; j < cols.length; j++) {
					cols[j].style.height = colHeight + "px";
				}
			}
		}
		
		listSplitter();
		matchHeights();
		
	};
	
	// Set up Press Offices map -----------------------------
	
	addPressOfficesFunctions = function() {
		
		var initialRegion = "scotland"
		
		var mainContent = getElementsByClassName(document,"div","content-main")[0];
		var pressOffices = getElementsByClassName(mainContent,"div","press-office");
		for (var i = 0; i < pressOffices.length; i++) {
			
			var regionHeader = pressOffices[i].getElementsByTagName("h2")[0];
			var regionLinkText = regionHeader.innerHTML;
			if (ie) {
				regionHeader.innerHTML = '<a href="#' + [i] + '" tabindex="-1">' + regionLinkText + '</a>';
			} else {
				regionHeader.innerHTML = '<a href="#' + [i] + '"><span>tab: </span>' + regionLinkText + '</a>';
			}

			addClass(pressOffices[i],"press-office-hidden");

			var flashmovie = document.getElementById("press-offices-flash");
			
			var regionLink = regionHeader.getElementsByTagName("a")[0];
			regionLink.onfocus = function(){
				
				var mainContent = getElementsByClassName(document,"div","content-main")[0];
				var hiddenOffices = getElementsByClassName(mainContent,"div","press-office");
				for (var j = 0; j < hiddenOffices.length; j++) {
					removeClass(hiddenOffices[j], "press-office-visible");
					addClass(hiddenOffices[j], "press-office-hidden");
				}
				
				removeClass(this.parentNode.parentNode,"press-office-hidden");
				addClass(this.parentNode.parentNode,"press-office-visible");
				
				var newRegion = this.parentNode.parentNode.getAttribute("id");
				flashmovie.goToRegion(newRegion);
			};
		}
		var firstLink = document.getElementById(initialRegion).getElementsByTagName("a")[0];
		firstLink.focus();
		self.focus();
	};	
	
	
	// Call call functions ----------------------------------
	
	browseByRole();
	ministersResponsibilities();
	textResizer();
	splitAzContactList();
	
}();

function addPressOfficesFunctions() {
	enhancements.addPressOfficesFunctions();
}

function displayRegion(region) {
	var newRegionLink = document.getElementById(region).getElementsByTagName("h2")[0].getElementsByTagName("a")[0];
	newRegionLink.focus();
}

/*<!-- Script to check if can display embedded YouTube videos and display alternate image if not -->
var image = new Image();
image.src = "http://youtube.com/favicon.ico";
image.id = "youtube";
image.name="youtube";
if (image.complete == true) {
    // The user can access youtube
	document.write("<style type=\"text\/css\"> .altimg{display:none;} <\/style>");
} else {
    // The user can't access youtube
	document.write("<style type=\"text\/css\"> .youtubevid{display:none;} <\/style>");
	document.write("<style type=\"text/css\"> .altimg{display:inline;} <\/style>");
	
}*/

<!-- Script to check if can display embedded YouTube videos and display alternate image if not -->
var image = new Image();
image.src = "http://www.youtube.com/favicon.ico";

if (image.complete == true) {
    // The user can access youtube
	document.write("<style type=\"text\/css\"> .altimg{display:none;} <\/style>");
} else {
    // The user can't access youtube
	document.write("<style type=\"text\/css\"> .youtubevid{display:none;} <\/style>");
	document.write("<style type=\"text\/css\"> .altimg{display:inline;} <\/style>");
}



/* --------------------- Show hide code for faq's etc ----------------------- */
// Config options.
var showJustOne = true; // Should more than one section be shown at a time.
var showAllText = "show all answers on this page";
var hideAllText = "Hide all answers on this page";

var showhideMainContainerId = "showhides";	// ID of main container that contains all other showhides	
var showhideClassName = "showhide";			// Class for blocks that have show/hide/switch elements in them.
var showhideallClassName = "showhideall";	// Class for block to replace with show/hide all link.
var switchClassName = "switch";				// Class for element to replace with show/hide link.
var showClassName = "show";					// Class for block to show, but can change to hide.
var hideClassName = "hide";					// Class for block to hide, but can change to show.
var jScriptSuffix = "js";					// Suffix to add when JavaScript is working.
var htmlShowHideBlockTag = "div";				// Html tag type that holds all showhide blocks

var showHideBlocks;	// holds references to all things to hide and show.
var showHideAllLink;	// holds reference to showhideall link

// Should be called on page load to do setup stuff.
function showhideSetup()
{
	// Add show all message
	showHideAllLink = document.getElementById(showhideallClassName);
	if(showHideAllLink != null)
	{
		showHideAllLink.innerHTML = '<strong>Please select a question </strong>or <a href="javascript:showAll()">' + showAllText + '</a>';
	}

	// Find all showhide blocks
	var blockArea = document.getElementById(showhideMainContainerId);
	var blocks = blockArea.getElementsByTagName(htmlShowHideBlockTag);
	
	// Change class name for main container 
	//blockArea.className = showhideMainContainerId + jScriptSuffix;
	
	// Add links and collect all show/hide blocks in showHideBlocks array
	showHideBlocks = new Array();
	var showhideIndex = 0; // Index in showHideBlocks Array.
	for(var i=0; i<blocks.length; i++)
	{
		if(blocks[i].className==showhideClassName)
		{
			// Loop through block's children
			for(var j=0; j<blocks[i].childNodes.length; j++)
			{
				// Find switch class element
				if(blocks[i].childNodes[j].className==switchClassName)
				{
					blocks[i].childNodes[j].innerHTML = '<a href="javascript:showHide(' + showhideIndex + ')">' + blocks[i].childNodes[j].innerHTML + '</a>';
				}
				// Find first show/hide classed element
				else if(blocks[i].childNodes[j].className==showClassName  || blocks[i].childNodes[j].className==hideClassName)
				{
					// Add them to showhideblocks array
					showHideBlocks.push(blocks[i].childNodes[j]);
					//break;
				}
			}
			showhideIndex++;
		}
		
	}//alert("show hide divs: " +  showhideIndex);

}

// Flip hide/show of passed html element
function showHide(theId)
{
	if(!showHideBlocks[theId]){/*alert('bad');*/}
	else if(showHideBlocks[theId].className == hideClassName)
	{
		if(showJustOne)
		{
			changeAll(hideClassName);
			showItAndParents(showHideBlocks[theId]);
		}
		else
		{
			showHideBlocks[theId].className = showClassName;
		}
	}
	else
	{
		showHideBlocks[theId].className = hideClassName;
	}
}

// Recurse through parent nodes and show all elements.
function showItAndParents(theElement)
{
	if(theElement.className==hideClassName)theElement.className = showClassName;
	if(theElement.parentNode != null)
	{
		showItAndParents(theElement.parentNode);
	}
}

// Change class of all blocks in showHideBlocks
function changeAll(cName)
{
	for(var i=0; i<showHideBlocks.length; i++)
	{
		showHideBlocks[i].className=cName;
	}
}

// Show all blocks and change link to 'hide all'
function showAll()
{
	if(showHideAllLink != null)
	{
		showHideAllLink.innerHTML = '<a href="javascript:hideAll()">' + hideAllText + '</a>';
	}
	changeAll(showClassName);
}

// Hide all blocks and change link to 'show all'
function hideAll()
{
	if(showHideAllLink != null)
	{
		showHideAllLink.innerHTML = '<strong>Please select a question </strong>or <a href="javascript:showAll()">' + showAllText + '</a>';
	}
	changeAll(hideClassName);
}

// Adds a css style to the styles sheet
// From http://yuiblog.com/blog/2007/06/07/style/
function addCss(cssCode)
{
	var styleElement = document.createElement("style");
	styleElement.type = "text/css";
	if (styleElement.styleSheet)
	{
		styleElement.styleSheet.cssText = cssCode;
	}
	else
	{
		styleElement.appendChild(document.createTextNode(cssCode));
	}
	document.getElementsByTagName("head")[0].appendChild(styleElement);
}
/*------------------------------------------------------------------------------*/
