﻿// Initialise JavaScript namespaces.

	Website = {};
	Website.Base = {};
	Website.QueryString = {};
	Website.MainMenu = {}
	Website.TabList = {};
	Website.LinkList = {};
	Website.PageTabs = {};
	Website.TabListHorizontal = {};
	Website.Tooltip = {};
	Website.Maps = {};

	// ## Base - START

	Website.Base.SelectRegion = function(select) {
		var selectedRegion = select.options[select.selectedIndex].value;
		var href = "/home.aspx";

		if (href.contains("region=")) {
			//href = location.pathname + "?" + Website.QueryString.RemoveKey(location, "region");
			href = "?" + Website.QueryString.RemoveKey(location, "region");
		}

		href = href.trim();

		if (!href.contains("?")) {
			href += "?"
		} else if (href.charAt(href.length - 1) != "&" && href.charAt(href.length - 1) != "?") {
			href += "&";
		}

		if (!href.contains("region=")) {
			href += "region=" + selectedRegion;
		}

		window.location = href;
	}

	// ## Base - END
	
	
	
	// ## QueryString - START

	Website.QueryString.RemoveKey = function(loc, key) {
		var queryString = loc.search.replace("?", "").split("&");
		var newQueryString = "";

		for (var i = 0; i < queryString.length; i++) {
			var keyValuePair = queryString[i].split("=");

			if (keyValuePair[0] != key) {
				if (keyValuePair[0].trim().length > 0) {
					if (newQueryString.length > 0) {
						newQueryString += "&";
					}
				
					newQueryString += keyValuePair[0] + "=";

					if (keyValuePair.length == 2) {
						newQueryString += keyValuePair[1];
					}
				}
			}
		}

		return newQueryString;
	}

	// ## QueryString - END



	// ## MainMenu - START

	Website.MainMenu.List = null;

	Website.MainMenu.Init = function(menuName) {
		Website.MainMenu.List = new Array();

		var list = $(menuName).getElements(".menuItem");
		var highlightFound = false;

		for (var i = 0; i < list.length; i++) {
			var menu = {};

			menu.Menu = list[i];
			menu.Button = menu.Menu.getElement(".menuButton");
			menu.DropDown = menu.Menu.getElement(".mainMenuChild");

			var text = menu.Button.innerHTML.toLowerCase().replace(" ", "-");
			var url = location.href;

			if (url.indexOf("/" + text) > -1) {
				menu.Button.addClass("highlightButton");
				highlightFound = true;
			}

			menu.Menu.MainMenuIndex = i;
			menu.Button.MainMenuIndex = i;

			menu.Button.addEvent("mouseover", Website.MainMenu.ButtonMouseOver);
			menu.Button.addEvent("mouseout", Website.MainMenu.ButtonMouseOut);

			if (menu.DropDown != null) {
				menu.DropDown.MainMenuIndex = i;

				menu.DropDown.addEvent("mouseover", Website.MainMenu.DropDownMouseOver);
				menu.DropDown.addEvent("mouseout", Website.MainMenu.DropDownMouseOut);

				menu.DropDown.RequiresCentralLayout = Website.MainMenu.RequiresCentralLayout(menu);
				var columns = menu.DropDown.getElements(".innerMenuChild .firstColumn, .innerMenuChild .secondColumn, .innerMenuChild .thirdColumn");

				// If this is a multiple column menu, adjust height of colour blocks.
				if (columns.length > 0) {
					menu.DropDown.setStyle("display", "block");
					var height = columns[0].getHeight();
					menu.DropDown.setStyle("display", "none");

					for (var c = 0; c < columns.length; c++) {
						var inner = columns[c].getElement(".columnInner");
						var padding = inner.getStyle("padding-top").toInt() + inner.getStyle("padding-bottom").toInt();

						inner.setStyle("height", height - padding);
					}
				}
			}

			Website.MainMenu.List[i] = menu;
		}

		if (!highlightFound && Website.MainMenu.List.length > 0) {
			Website.MainMenu.List[0].Button.addClass("highlightButton");
		}
	}

	Website.MainMenu.ButtonMouseOver = function() {
		var button = this;
		var menu = Website.MainMenu.List[button.MainMenuIndex];

		menu.Button.addClass("mouseOver");

		if (menu.DropDown != null) {
			Website.MainMenu.ShowMenu(menu);
		}

		menu.Button.Active = true;
	}

	Website.MainMenu.ButtonMouseOut = function() {
		var button = this;
		var menu = Website.MainMenu.List[button.MainMenuIndex];

		this.Active = false;

		if (menu.DropDown != null) {
			Website.MainMenu.DelayHideMenu(menu);
		} else {
			menu.Button.removeClass("mouseOver");
		}
	}

	Website.MainMenu.DropDownMouseOver = function() {
		var dropDown = this;
		var menu = Website.MainMenu.List[dropDown.MainMenuIndex];
		
		menu.Button.Active = true;
	}

	Website.MainMenu.DropDownMouseOut = function() {
		var dropDown = this;
		var menu = Website.MainMenu.List[dropDown.MainMenuIndex];

		menu.Button.Active = false;
		Website.MainMenu.DelayHideMenu(menu);
	}

	Website.MainMenu.ShowMenu = function(menu) {
		if (menu.DropDown.RequiresCentralLayout) {
			Website.MainMenu.CentreDropDown(menu);
		}

		menu.DropDown.setStyle("display", "block");
	}

	Website.MainMenu.DelayHideMenu = function(menu) {
		var hideFunction = function() {
			if (!menu.Button.Active) {
				Website.MainMenu.HideMenu(menu);
				menu.Button.removeClass("mouseOver");
			}
		}

		setTimeout(hideFunction, 50);
	}

	Website.MainMenu.HideMenu = function(menu) {
		menu.DropDown.setStyle("display", "none");
    }

	Website.MainMenu.RequiresCentralLayout = function(menu) {
	if (menu.DropDown.getParent().getElement(".threeColumnDropDown") != null) {
			return true;
		} else {
			return false;
		}
	}

	// Centre a drop down relative to the main menu container if required.
	Website.MainMenu.CentreDropDown = function(menu) {
		if (menu.DropDown.Position == null) {
			var mainMenuContainerWidth = $("mainMenuContainer").getWidth();
			var buttonHeight = menu.Button.getHeight();

			menu.DropDown.setStyle("display", "block");
			var dropDownWidth = menu.DropDown.getWidth();
			menu.DropDown.inject($("mainMenuContainer"), "bottom");

			menu.DropDown.Position = (mainMenuContainerWidth - dropDownWidth) / 2;

			menu.DropDown.setStyle("display", "none");
			menu.DropDown.setStyle("top", buttonHeight);
			menu.DropDown.setStyle("left", menu.DropDown.Position);
		}
	}
	
	// ## MainMenu - END



	// ## TabList - START
	
	Website.TabList.PanelDefault = null;
	Website.TabList.SelectedTab = null;

	Website.TabList.Init = function(listName) {
		var list = $(listName).getElement(".list");
		var listChildren = list.getElements("A");

		if (listChildren.length > 0) {

			// Get the detail panel items.
			var panel = $(listName).getElement(".detailsPanel");
			var panelChildren = null;

			if (panel != null) {
				panelChildren = panel.getElements(".panelDetail");
				Website.TabList.PanelDefault = panel.getElements(".defaultPanelDetails");
			}

			// Loop through the list and create events.
			// Associate a detail panel with each tab.
			for (var i = 0; i < listChildren.length; i++) {
				var tab = listChildren[i];

				tab.addEvent("mouseover", function() { Website.TabList.OnMouseOver(this); });
				//tab.addEvent("mouseout", function() { Website.TabList.OnMouseOut(this); });
				//tab.addEvent("click", function() { Website.TabList.Click(this); });

				if (panelChildren != null && panelChildren.length > i) {
					tab.Panel = panelChildren[i];
				}
			}

			// Select the first tab as the default to show.
			Website.TabList.OnMouseOver(listChildren[0]);
		}
	}

	// Select the current tab as the active one.
	Website.TabList.Click = function(tab) {

		// If this is the selected tab, remove the selected.
		if (Website.TabList.SelectedTab == tab) {
			tab.removeClass("tabListItemSelected");
			Website.TabList.SelectedTab = null;

		} else {

			// Show the panel relevant to this tab.
			Website.TabList.ShowPanel(tab.Panel);

			// If a tab is already selected, hide it.
			if (Website.TabList.SelectedTab != null) {
				Website.TabList.Click(Website.TabList.SelectedTab);
			}

			tab.addClass("tabListItemSelected");
			Website.TabList.SelectedTab = tab;
		}
	}

	// Show the panel, hiding any shown panels.
	Website.TabList.ShowPanel = function(panel) {
		if (Website.TabList.SelectedTab != null) {
			Website.TabList.SelectedTab.Panel.setStyle("display", "none");
		}

		panel.setStyle("display", "block");
	}

	Website.TabList.OnMouseOver = function(tab) {

		// If there is a tab selected, hide it.
		if (Website.TabList.SelectedTab != null && tab != Website.TabList.SelectedTab) {
			//Website.TabList.SelectedTab.Panel.setStyle("display", "none");
			Website.TabList.OnMouseOut(Website.TabList.SelectedTab);
		}

		Website.TabList.SelectedTab = tab;

		// If there is a default panel, hide it.
		if (Website.TabList.PanelDefault != null) {
			Website.TabList.PanelDefault.setStyle("display", "none");
		}

		tab.addClass("tabListItemMouseOver");

		if (tab.Panel) {
			tab.Panel.setStyle("display", "block");
		}
	}

	Website.TabList.OnMouseOut = function(tab) {
		tab.removeClass("tabListItemMouseOver");

		if (tab.Panel) {
			tab.Panel.setStyle("display", "none");
		}

		// If there is a tab selected, show it.
		//if (Website.TabList.SelectedTab != null) {
		//	Website.TabList.SelectedTab.Panel.setStyle("display", "block");

			// If there is a default panel, hide it.
		//} else if (Website.TabList.PanelDefault != null) {
		//	Website.TabList.PanelDefault.setStyle("display", "block");
		//}
	}

	// ## TabList - END

	// ## LinkList - START

	Website.LinkList.List = null;

	Website.LinkList.Init = function(parentID) {
		Website.LinkList.List = new Array();

		var lists = $(parentID).getElements(".linkList");

		for (var listID = 0; listID < lists.length; listID++) {
			var items = lists[listID].getElements(".linkListItem");

			for (var itemID = 0; itemID < items.length; itemID++) {
				var button = items[itemID].getElement("A");
				var tooltip = items[itemID].getElement(".linkListTooltip");

				var list = {};
				var id = listID + "-" + itemID;

				list.List = lists[listID];
				list.Button = button;
				list.Tooltip = tooltip;

				list.Button.Active = false;
				list.Button.LinkListIndex = id;

				list.Button.addEvent("mouseover", Website.LinkList.ButtonMouseOver);
				list.Button.addEvent("mouseout", Website.LinkList.ButtonMouseOut);

				if (list.Tooltip != null) {
					list.Tooltip.LinkListIndex = id;

					list.Tooltip.addClass(list.List.getProperty("class"));
					list.Tooltip.removeClass("linkList");

					Website.Tooltip.Init(list.Button, list.Tooltip);
				}

				Website.LinkList.List[id] = list;
			}
		}
	}

	Website.LinkList.ButtonMouseOver = function() {
		var button = this;
		var list = Website.LinkList.List[button.LinkListIndex];

		list.Button.Active = true;

		list.Button.addClass("linkListMouseOver");
		Website.Tooltip.Show(list.Button, list.Tooltip);
	}

	Website.LinkList.ButtonMouseOut = function() {
		var button = this;
		var list = Website.LinkList.List[button.LinkListIndex];

		list.Button.Active = false;
		list.Button.removeClass("linkListMouseOver");
	}

	// ## LinkList - END



	// ## PageTabs - START

	Website.PageTabs.Active = null;

	// Page tabs start within the panels, so that if a search engine indexes the page, 
	// you can still tell what tab belongs to which panel.
	Website.PageTabs.Init = function() {
		var panels = $("mainContentContainer").getElements(".panel");
		var tabs = new Array();

		var tabContainer = $("pageTabs");

		for (var panelID = 0; panelID < panels.length; panelID++) {
			var headers = panels[panelID].getElements("H2");

			// If this panel has headers, use the first one as the tab.
			if (headers.length > 0) {
				var tab = headers[0];

				tab.TabID = panelID;
				tab.id = "pageTab-" + panelID;

				tab.addEvent("click", Website.PageTabs.Click);

				tab.addEvent("mouseover", Website.PageTabs.TabMouseOver);
				tab.addEvent("mouseout", Website.PageTabs.TabMouseOut);

				tab.inject(tabContainer, "bottom");
				tabs.push(tab);
			}

			panels[panelID].id = "pageTabPanel-" + panelID;
			panels[panelID].setStyle("display", "none");
		}

		if (tabs.length > 0) {
			Website.PageTabs.Click(tabs[0]);
			tabContainer.setStyle("display", "block");
		}
    }

    Website.PageTabs.InitStatic = function() {
        var tabs = $("pageTabs").getElements("div");

        for (var i = 0; i < tabs.length; i++) {
            tabs[i].addEvent("mouseover", Website.PageTabs.TabMouseOver);
            tabs[i].addEvent("mouseout", Website.PageTabs.TabMouseOut);
        }
    }

	Website.PageTabs.Click = function(tab) {
		if (tab.TabID == null) { var tab = this; }
		var panel = $("pageTabPanel-" + tab.TabID);

		if (Website.PageTabs.Active != null) {
			$("pageTabPanel-" + Website.PageTabs.Active).setStyle("display", "none");
			$("pageTab-" + Website.PageTabs.Active).removeClass("activeTab");
		}

		if (panel != null) {
			panel.setStyle("display", "block");
			tab.addClass("activeTab");
		}

		Website.PageTabs.Active = tab.TabID;
	}

	Website.PageTabs.TabMouseOver = function() {
		this.addClass("hoverTab");
	}

	Website.PageTabs.TabMouseOut = function() {
		this.removeClass("hoverTab");
	}

	// ## PageTabs - END



	// ## Tooltip - START

	Website.Tooltip.Init = function(link, tooltip) {
		tooltip = $(tooltip);
		link = $(link);

		link.Tooltip = tooltip;
		tooltip.TooltipArrow = tooltip.getElement(".tooltipArrow");

		link.addEvent("mouseout", Website.Tooltip.DelayHide);
		tooltip.inject($("mainContentContainer"), "bottom");

		tooltip.setStyle("display", "block");
		
		tooltip.TooltipSize = tooltip.getSize();
		tooltip.TooltipArrowSize = { x: 0, y: 0 };
		
		tooltip.ContainerSize = $("mainContentContainer").getSize();
		tooltip.Positions = Website.Tooltip.GetPositions(link, tooltip);

		if (tooltip.TooltipArrow != null) {
			tooltip.TooltipArrowSize = tooltip.TooltipArrow.getSize();
		}

		tooltip.setStyle("display", "none");
		tooltip.Init = true;
	}
	
	// Calculates the appropriate positions of the tooltip, depending on the side of the link they are going to be displayed.
	Website.Tooltip.GetPositions = function(link, tooltip) {
		var positions = {
			top: { x: 0, y: 0 },
			bottom: { x: 0, y: 0 },
			left: { x: 0, y: 0 },
			right: { x: 0, y: 0 }
		};
		
		var linkPosition = link.getPosition($("mainContentContainer"));
		var linkSize = link.getSize();
		
		var offset = 12;
		
		positions.left.y = linkPosition.y - ((tooltip.TooltipSize.y - linkSize.y) / 2);
		positions.left.x = linkPosition.x - tooltip.TooltipSize.x - tooltip.TooltipArrowSize.x - offset;
		
		positions.right.y = linkPosition.y - ((tooltip.TooltipSize.y - linkSize.y) / 2);
		positions.right.x = linkPosition.x + linkSize.x + tooltip.TooltipArrowSize.x + offset;
		
		positions.top.y = linkPosition.y - tooltip.TooltipSize.y - tooltip.TooltipArrowSize.x - offset;
		positions.top.x = linkPosition.x - ((tooltip.TooltipSize.x - linkSize.x) / 2);
		
		positions.bottom.y = linkPosition.y + linkSize.y + tooltip.TooltipArrowSize.x + offset;
		positions.bottom.x = linkPosition.x - ((tooltip.TooltipSize.x - linkSize.x) / 2);

		return positions;
	}

	Website.Tooltip.Show = function(link, tooltip) {
		tooltip = $(tooltip);

		if (tooltip != null) {
			if (tooltip.Init != true) {
				Website.Tooltip.Init(link, tooltip);
			}

			Website.Tooltip.Position(tooltip);
			tooltip.setStyle("display", "block");

			tooltip.Active = true;
		}
	}

	// A delay is required as some buttons will flicker the tooltip on mouseover in IE.
	Website.Tooltip.DelayHide = function() {
		var tooltip = this.Tooltip;

		if (tooltip != null) {
			tooltip.Active = false;
			
			var hideFunction = function() {
				if (tooltip.Active != true) {
					Website.Tooltip.Hide(tooltip);
				}
			}

			setTimeout(hideFunction, 50);
		}
	}

	Website.Tooltip.Hide = function(tooltip) {
		if (tooltip != null) {
			tooltip.setStyle("display", "none");
		}
	}

	Website.Tooltip.Position = function(tooltip) {
		tooltip = $(tooltip);
		var position = Website.Tooltip.DetermineAppropriatePosition(tooltip);
	
		if (tooltip.TooltipArrow != null) {
			tooltip.TooltipArrow.removeClass("tooltipArrow-top");
			tooltip.TooltipArrow.removeClass("tooltipArrow-bottom");
			tooltip.TooltipArrow.removeClass("tooltipArrow-left");
			tooltip.TooltipArrow.removeClass("tooltipArrow-right");
			
			tooltip.TooltipArrow.addClass("tooltipArrow-" + position);

			// Adjust position of tooltip arrow, based on position.
			if (position == "left" || position == "right") {
				tooltip.TooltipArrow.setStyle("top", (tooltip.TooltipSize.y - tooltip.TooltipArrowSize.y) / 2);
			} else if (position == "top" || position == "bottom") {
				tooltip.TooltipArrow.setStyle("left", (tooltip.TooltipSize.x - tooltip.TooltipArrowSize.x) / 2);
			}
		}
		
		tooltip.setStyle("top", tooltip.Positions[position].y);
		tooltip.setStyle("left", tooltip.Positions[position].x);
	}

	Website.Tooltip.DetermineAppropriatePosition = function(tooltip) {
		
		// If displaying the tooltip on the right means going over the edge of the container, then display it on the left.
		if (tooltip.Positions["right"].x + tooltip.TooltipSize.x > tooltip.ContainerSize.x) {
			return "left";
		} else {
			return "right";
		}
	}
	
	// ## Tooltip - END


	// ## Tabs Horizontal - START

	Website.TabListHorizontal.PanelDefault = null;
	Website.TabListHorizontal.SelectedTab = null;
	Website.TabListHorizontal.TabDefault = null;

	Website.TabListHorizontal.Init = function(listName) {

	    var list = $(listName).getElement(".tabHeaderList");
	    var listChildren = list.getElements(".mapTab");
	    Website.TabListHorizontal.TabDefault = listChildren[0];

	    if (listChildren.length > 0) {

	        // Get the detail panel items.
	        var panel = $(listName).getElement(".mapLayoutPanels");
	        var panelChildren = null;

	        if (panel != null) {
	            panelChildren = panel.getElements(".firstColumn");
	            Website.TabListHorizontal.PanelDefault = panelChildren[0];
	        }

	        listChildren[0].addClass("tabListItemSelected");
	        Website.TabListHorizontal.SelectedTab = listChildren[0].Panel;

	        // Loop through the list and create events.
	        // Associate a detail panel with each tab.
	        for (var i = 0; i < listChildren.length; i++) {
	            listChildren[i].addEvent("click", function() { Website.TabListHorizontal.Click(this); });

	            if (panelChildren != null && panelChildren.length > i) {
	                listChildren[i].Panel = panelChildren[i];
	                if (listChildren[i].Panel != Website.TabListHorizontal.SelectedTab) {
	                    listChildren[i].Panel.setStyle("display", "none");
	                }
	            }
	        }
	        if (listChildren != null && listChildren.length == 1) {
	            listChildren[0].setStyle("display", "none");
	        }
	        
	        // Select the first tab as the default to show.
	        Website.Maps.Init();
	        Website.TabListHorizontal.Click(Website.TabListHorizontal.TabDefault);
	    }
	}

	// Select the current tab as the active one.
	Website.TabListHorizontal.Click = function(tab) {

	    // If this is the selected tab, remove the selected.
	    if (Website.TabListHorizontal.SelectedTab == tab) {
	        tab.removeClass("tabListItemSelected");
	        Website.TabListHorizontal.SelectedTab = null;
	    } else {

	        // Show the panel relevant to this tab.
	        Website.TabListHorizontal.ShowPanel(tab.Panel);

	        // If a tab is already selected, hide it.
	        if (Website.TabListHorizontal.SelectedTab != null) {
	            Website.TabListHorizontal.Click(Website.TabListHorizontal.SelectedTab);
	        }

	        tab.addClass("tabListItemSelected");
	        Website.TabListHorizontal.SelectedTab = tab;
	    }
	}

	// Show the panel, hiding any shown panels.
	Website.TabListHorizontal.ShowPanel = function(panel) {
	    if (Website.TabListHorizontal.SelectedTab != null) {
	        Website.TabListHorizontal.SelectedTab.Panel.setStyle("display", "none");
	    }
	    panel.setStyle("display", "block");

	    var gbstAddress = (panel.getElement(".searchaddress").innerText || panel.getElement(".searchaddress").textContent || '');
	    
	    // add address location data to map
	    geocoder.getLocations(gbstAddress, Website.Maps.addToMap);
	}

	// ## Tabs Horizontal - END

	// ## Maps start
	
	var geocoder;
	var map;

	// On page load, call this function
    Website.Maps.Init = function() {
	    // Create new map object
        map = new GMap2(document.getElementById("gbstLocMap"));

	    // Create new geocoding object
	    geocoder = new GClientGeocoder();
	}

	// This function adds the point to the map
	Website.Maps.addToMap = function(response) {
		if (response && response.Placemark) {

			// Retrieve the object
			place = response.Placemark[0];

			// Retrieve the latitude and longitude
			point = new GLatLng(place.Point.coordinates[1],
							  place.Point.coordinates[0]);

			// Center the map on this point
			map.setCenter(point, 13);

			// Create a marker
			marker = new GMarker(point);

			// Add the marker to map
			map.addOverlay(marker);

			// Add address information to marker
			marker.openInfoWindowHtml(place.address);
		}
	}
	
	// ## Maps End

// IE6 background image flicker fix.
try { document.execCommand("BackgroundImageCache", false, true); } catch (err) { }