/**
 * @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();
}