/*
 ***************************************************************
 * Start config code
 ***************************************************************
 */

/*
 * Load any missing libraries which functions in this script depend on
 */
function ftnCaBAdminLoadJs(){
	// Register dependencies here
	//var wib = wob.non;
	if(typeof(Epoch) == 'undefined') ftnCaBAdminAddJs('/javascript/epoch/epoch_classes.js');
	if(typeof(ftnGetObjectPosition) == 'undefined') ftnCaBAdminAddJs('/javascript/cab-common-functions.js');
	if(typeof(Prototype) == 'undefined') ftnCaBAdminAddJs('/javascript/scriptaculous/lib/prototype.js');
	if(typeof(Effect) == 'undefined') ftnCaBAdminAddJs('/javascript/scriptaculous/src/effects.js');
}

/*
 * Register code to call onload
 */
function ftnCaBAdminLoadEvents(){
	ftnAddLoadEvent(ftnInitialisePrimaryMenus);
	ftnAddLoadEvent(ftnInitialiseSiteSelector);
	ftnAddLoadEvent(ftnInitialiseSidePanels);
	ftnAddLoadEvent(ftnInitialiseMediaBlockSlideShow);
	ftnAddLoadEvent(ftnSetExternalLinks);
	ftnAddLoadEvent(ftnSetMaxLength);
	ftnAddLoadEvent(ftnInitialiseDatePickers);
}


/*
 ***************************************************************
 * End config code
 ***************************************************************
 */
 
/*
 * Load registered javascript library dependencies
 */
function ftnCaBAdminAddJs(source){
	var head = document.getElementsByTagName('head').item(0);
	var script = document.createElement('script');
	script.setAttribute('type','text/javascript');
	script.setAttribute('src',source);
	head.appendChild(script);
}
ftnCaBAdminLoadJs();

/*
 * Creates a character counter below form fields and registers ftnCheckMaxLength() to 
 * update this whenever the content changes.
 *
 * Note that this currently only handles text areas.
 *
 * Note that if you use this you _must_ use the custom DTD (/dtd/xhtml1-custom.dtd) else 
 * your xhtml will not validate (the custom DTD contains some extended attributes).
 */
function ftnSetMaxLength() {
	var x = document.getElementsByTagName('textarea');
	var counter = document.createElement('div');
	counter.className = 'counter';
	for (var i=0;i<x.length;i++) {
		if (x[i].getAttribute('maxlength')) {
			var counterClone = counter.cloneNode(true);
			counterClone.relatedElement = x[i];
			counterClone.innerHTML = '<span>0</span>/'+x[i].getAttribute('maxlength');
			x[i].parentNode.insertBefore(counterClone,x[i].nextSibling);
			x[i].relatedElement = counterClone.getElementsByTagName('span')[0];

			x[i].onkeyup = x[i].onchange = ftnCheckMaxLength;
			x[i].onkeyup();
		}
	}
}

/*
 * Updates the character counters below form fields created by ftnSetMaxLength()
 * whenever the content of the field changes. Don't use this directly - see
 * ftnSetMaxLength()
 *
 * Note that this currently only handles text areas.
 *
 * Note that if you use this you _must_ use the custom DTD (/dtd/xhtml1-custom.dtd) else 
 * your xhtml will not validate (the custom DTD contains some extended attributes).
 */
function ftnCheckMaxLength() {
	var maxLength = this.getAttribute('maxlength');
	if (this.value.length > maxLength) this.value = this.value.substring(0,maxLength);
	
	var currentLength = this.value.length;
	this.relatedElement.firstChild.nodeValue = currentLength;
	if (currentLength >= maxLength) {
		this.relatedElement.className = 'max-reached';
	} else {
		this.relatedElement.className = '';
	}
}

/*
 * Basic form validation - checks that all inputs with an attribute of 
 * 'required' contain a value.
 *
 * Note that if you use this you _must_ use the custom DTD (/dtd/xhtml1-custom.dtd) else 
 * your xhtml will not validate (the custom DTD contains some extended attributes).
 */
function ftnValidateForm() {
	var x = document.forms[0].elements;
	var blnValid = true;
	
	for (var i=0;i<x.length;i++) {
		if (x[i].getAttribute('required')) {
			if (x[i].type == 'checkbox' && !x[i].checked){
				x[i].parentNode.style.backgroundColor = '#E4E417';
				blnValid = false;
			} else if (!x[i].value) {
				x[i].style.backgroundColor = '#E4E417';
				blnValid = false;
			} else {
				if (x[i].type == 'checkbox')
					x[i].parentNode.style.backgroundColor = '';
				else
					x[i].style.backgroundColor = '';
			}
		}
	}
	return blnValid;
}

function ftnNewsArticleWebsiteLinkSelect(linkCheck){
	if(!linkCheck.checked)
		document.getElementById('hdl' + linkCheck.id.substr(4,(linkCheck.id.length - 4))).checked = false;
}

function ftnNewsArticleWebsiteHeadlineSelect(headCheck){
	if(headCheck.checked)
		document.getElementById('nawl' + headCheck.id.substr(3,(headCheck.id.length - 3))).checked = true;
}

/*
 * Turn all form text fields with a class of 'date' into Epoch datepickers
 */
function ftnInitialiseDatePickers(){
	var arrInputs = document.getElementsByTagName('input');
	for (var i=0; i<arrInputs.length; i++){
		if(arrInputs[i].type == 'text' && arrInputs[i].className.indexOf('date') > -1){
			new Epoch('epochCal'+i,'popup',arrInputs[i],false,'Y-m-d');
		}
	}
}

function ftnSetExternalLinks() {
	if (!document.getElementsByTagName) return;
	var anchors = document.getElementsByTagName("a");
	for (var i=0; i<anchors.length; i++) {
		var anchor = anchors[i];
		if (anchor.getAttribute("href") && anchor.getAttribute("rel") == "external")
			anchor.target = "_blank";
	}
}

/*
 * Load registered onload event handlers
 */
function ftnAddLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
}

/*
 * Menu functions
 */
function ftnInitialisePrimaryMenus(){
	// Set event handlers on menu list items
	var pNav = document.getElementById('primary-nav');
	for (var i=0; i<pNav.childNodes.length; i++){
		var lItem = pNav.childNodes[i];
		if(lItem.tagName == 'LI'){
			lItem.onmouseover = ftnTogglePrimaryMenuOn;
			lItem.onmouseout = ftnTogglePrimaryMenuOff;
		}
	}
	
	// Set event handlers on dropdowns
	var arrDrops = document.getElementsByTagName('div');
	for (var i=0; i<arrDrops.length; i++){
		var objDrop = arrDrops[i];
		if(objDrop.id.length > 12 && objDrop.id.substr(0,12) == 'nav-primary-'){
			objDrop.style.display = 'none';
			objDrop.style.position = 'absolute';
			objDrop.onmouseout = ftnTogglePrimaryMenuOff;
		}
	}
}

function ftnTogglePrimaryMenuOn(evnt){
	ftnTogglePrimaryMenu(evnt, true);
}

function ftnTogglePrimaryMenuOff(evnt){
	if (!evnt) var evnt = window.event;
	var targ = ftnCaBGetTargetFromEvent(evnt);
	
	while(targ.id.substr(0,12) != 'nav-primary-' && targ.id.substr(0,5) != 'pnav-' && targ.nodeName != 'BODY'){
		targ = targ.parentNode;
	}
	
	// We don't want to deselect the menu item if we've just moved over the dropdown
	// As the mouse always has to cross the actual drop div to reach anything inside it, we shouldn't
	// need to walk up the DOM tree looking for the drop, but due to IE's utterly useless event 
	// handling it often doesn't report the mouseout until the pointer is over one of the inner elements
	var entered = (evnt.relatedTarget) ? evnt.relatedTarget : evnt.toElement;
	if (entered != null){
		while(entered.id.substr(0,12) != 'nav-primary-' && entered.id.substr(0,5) != 'pnav-' && entered.nodeName != 'BODY')
			entered = entered.parentNode;
		if(entered.id.length > 12 && entered.id.substr(0,12) == 'nav-primary-') return;
	}
	
	// IE doesn't reliably report the element we've entered - we have to assume it's the drop and leave the
	// menu open if leaving the menu list item or the menus will be intermittently unusable...
	if (entered == null && targ.id.substr(0,5) == 'pnav-') return;
	
	if (ftnMouseOut(targ, evnt)) ftnTogglePrimaryMenu(evnt, false);
}

function ftnTogglePrimaryMenu(evnt, blnShow){
	if (!evnt) var evnt = window.event;
	var targ = ftnCaBGetTargetFromEvent(evnt);
	
	while(targ.id.substr(0,12) != 'nav-primary-' && targ.id.substr(0,5) != 'pnav-' && targ.nodeName != 'BODY'){
		targ = targ.parentNode;
	}
	
	if(targ.id.substr(0,12) == 'nav-primary-'){
		// Event was fired from the dropdown
		var objDrop = targ;
		var objLink = document.getElementById('pnav-' + targ.id.substr(12,targ.id.length-12));
	}else{
		// Event was fired from the menu list item
		var objLink = targ;
		var objDrop = document.getElementById('nav-primary-' + targ.id.substr(5,targ.id.length-5));
	}
	
	// If no specific state requested, toggle state
	if (blnShow != true && blnShow != false){
		blnShow = objLink.className.indexOf('active') > -1 ? false : true;
	}
	
	if (blnShow) {
		if(objDrop != null){
			// Display dropdown
			objDrop.style.display = 'block';
			var arrLinkLoc = ftnGetObjectPosition(objLink);
			var x = arrLinkLoc[0];
			var y = arrLinkLoc[1] + ftnGetObjectHeight(objLink);
			ftnMoveObject(objDrop, x, y);

			// Place an iFrame under the menu to make it overlay windowed controls
			ftnCaBPlaceAboveWindowed(objDrop, 'site_list_iframe',9);
		}
		
		// Highlight menu list item
		if (objLink.className.indexOf(' active') == -1)
			objLink.className = objLink.className + ' active';
	} else {
		if(objDrop != null){
			// Hide dropdown
			// IE is really ropy at effects, so don't try them
				objDrop.style.display = 'none';
			
			// Remove iFrame
			var iFrame = document.getElementById('site_list_iframe');
			if(iFrame != null) iFrame.parentNode.removeChild(iFrame);
		}
		
		// Remove highlight from menu list item
		if (objLink.className.indexOf(' active') > -1)
			objLink.className = objLink.className.substr(0,objLink.className.length - 7);
	}
	return false;
}

function ftnInitialiseSiteSelector(){
	var objLink = document.getElementById('site-selector-link');
	var objDrop = document.getElementById('site-selector-drop');
	objDrop.style.display = 'none';
	objDrop.style.position = 'absolute';
	
	objDrop.onmouseout = ftnToggleSiteSelectorOff;
	objLink.onmouseover = ftnToggleSiteSelectorOn;
	objLink.onclick = ftnToggleSiteSelector;
}

function ftnToggleSiteSelectorOn(){
	ftnToggleSiteSelector(true);
}
function ftnToggleSiteSelectorOff(evnt){
	// Check this hasn't been fired by an onmouseout into the contents of the dropdown div
	if (!evnt) var evnt = window.event;
	var targ = ftnCaBGetTargetFromEvent(evnt);
	while(targ.nodeName != 'DIV' && targ.nodeName != 'BODY'){
		targ = targ.parentNode;
	}
	if (ftnMouseOut(targ, evnt)) {ftnToggleSiteSelector(false);}
}
function ftnToggleSiteSelector(blnShow){
	var objLink = document.getElementById('site-selector');
	var objDrop = document.getElementById('site-selector-drop');
	
	// If no specific state requested, toggle state
	if (blnShow != true && blnShow != false){
		blnShow = objDrop.style.display == 'block' ? false : true;
	}
	
	if (blnShow) {
		// Display dropdown
		objDrop.style.display = 'block';
		var arrLinkLoc = ftnGetObjectPosition(objLink);
		var x = (arrLinkLoc[0] + ftnGetObjectWidth(objLink) - 13) - ftnGetObjectWidth(objDrop);
		var y = arrLinkLoc[1] + ftnGetObjectHeight(objLink) + 3;
		ftnMoveObject(objDrop, x, y);
		
		// Place an iFrame under the menu to make it overlay windowed controls
		ftnCaBPlaceAboveWindowed(objDrop, 'site_list_iframe',9);
	} else {
		// Hide dropdown
		objDrop.style.display = 'none';
		
		// Remove iFrame
		var iFrame = document.getElementById('site_list_iframe');
		if(iFrame != null) iFrame.parentNode.removeChild(iFrame);
	}
	return false;
}

/*
 * Side panel functions
 */
function ftnInitialiseSidePanels(){
	// Set event handlers on toggle buttons
	var arrToggles = document.getElementById('news-bar-inner').getElementsByTagName('img');
	var blnFirst = true;
	for (var i=0; i<arrToggles.length; i++){
		var objToggle = arrToggles[i];
		if(objToggle.id.length > 15 && objToggle.id.substr(0,15) == 'sidebar-toggle-'){
			objToggle.onclick = ftnSidePanelsSelect;
			// Hide sidebar unless this is the first one
			if(!blnFirst && objToggle.id.indexOf('-arrow-') == -1){
				document.getElementById('sidebar-panel-' + objToggle.id.substr(15)).style.display = 'none';
				var arrow = document.getElementById('sidebar-toggle-arrow-' + objToggle.id.substr(15));
				arrow.src = '/images/backgrounds/sidebar-closed.gif';
				arrow.alt = 'Sidebar closed';
			}
			blnFirst = false;
		}
	}
}

function ftnSidePanelsSelect(evnt){
	if (!evnt) var evnt = window.event;
	var targ = ftnCaBGetTargetFromEvent(evnt);
	var panelId;
	if (targ.id.indexOf('-arrow-') > -1)
		panelId = 'sidebar-panel-' + targ.id.substr(21);
	else
		panelId = 'sidebar-panel-' + targ.id.substr(15);
	var arrPanels = document.getElementById('news-bar-inner').getElementsByTagName('div');
	for (var i=0; i<arrPanels.length; i++){
		var objPanel = arrPanels[i];
		if (objPanel.id.substr(0,14) == 'sidebar-panel-'){
			var arrow = document.getElementById('sidebar-toggle-arrow-' + objPanel.id.substr(14));
			if(objPanel.id == panelId && objPanel.style.display == 'none'){
				// IE is really ropy at effects, so don't try them
				if(BrowserDetect.browser == 'Explorer')
					objPanel.style.display = '';
				else
					Effect.BlindDown(objPanel, {duration: 0.3});
				arrow.src = '/images/backgrounds/sidebar-open.gif';
				arrow.alt = 'Sidebar open';
			} else if(objPanel.id != panelId && objPanel.style.display != 'none'){
				// IE is really ropy at effects, so don't try them
				if(BrowserDetect.browser == 'Explorer')
					objPanel.style.display = 'none';
				else
					Effect.BlindUp(objPanel, {duration: 0.3});
				arrow.src = '/images/backgrounds/sidebar-closed.gif';
				arrow.alt = 'Sidebar closed';
			}
		}
	}
}

var mediaBlockSlides = new Array();
var mediaBlockCurrentSlide = 0;
var mediaBlockIntervalId;

function ftnInitialiseMediaBlockSlideShow(){
	var mediaBlockSlideshow = document.getElementById('media-block-slideshow');
	if(mediaBlockSlideshow != null){
		var arrSlides = mediaBlockSlideshow.getElementsByTagName('div');
		for(var i=0; i<arrSlides.length; i++){
			mediaBlockSlides.push(arrSlides[i].id);
			if (i>0) arrSlides[i].style.display = 'none';
			arrSlides[i].className = '';
		}
		mediaBlockCurrentSlide = 0;
		mediaBlockIntervalId = setInterval('ftnMediaBlockSlideShow()',mediaBlockDelay);
		
		document.getElementById('media-block-slideshow-pause').onclick = ftnMediaBlockSlideShowPause;
		document.getElementById('media-block-slideshow-reset').onclick = ftnMediaBlockSlideShowReset;
		var reduceBut = document.getElementById('media-block-slideshow-reduce');
		if (reduceBut != null) reduceBut.onclick = ftnMediaBlockSlideShowReduce;
		document.getElementById('media-block-slideshow-controls').className = 'overlay';
	}
}

function ftnMediaBlockSlideShow() {
	Effect.Fade(mediaBlockSlides[mediaBlockCurrentSlide], { duration:1, from:1.0, to:0.0 }); 
	mediaBlockCurrentSlide++;
	if (mediaBlockCurrentSlide == mediaBlockSlides.length) mediaBlockCurrentSlide = 0;
	Effect.Appear(mediaBlockSlides[mediaBlockCurrentSlide], { duration:1, from:0.0, to:1.0 });
}
 
function ftnMediaBlockSlideShowPause(){
	clearInterval(mediaBlockIntervalId);
	var pauseBut = document.getElementById('media-block-slideshow-pause');
	pauseBut.onclick = ftnMediaBlockSlideShowPlay;
	if(pauseBut.src.indexOf('wide') > -1)
		pauseBut.src = '/images/buttons/mb-wide-play.png';
	else
		pauseBut.src = '/images/buttons/mb-play.png';
	pauseBut.alt = 'Play';
}

function ftnMediaBlockSlideShowPlay(){
	ftnMediaBlockSlideShow();
	mediaBlockIntervalId = setInterval('ftnMediaBlockSlideShow()',mediaBlockDelay);
	var pauseBut = document.getElementById('media-block-slideshow-pause');
	pauseBut.onclick = ftnMediaBlockSlideShowPause;
	if(pauseBut.src.indexOf('wide') > -1)
		pauseBut.src = '/images/buttons/mb-wide-pause.png';
	else
		pauseBut.src = '/images/buttons/mb-pause.png';
	pauseBut.alt = 'Pause';
}

function ftnMediaBlockSlideShowReset(){
	clearInterval(mediaBlockIntervalId);
	Effect.Fade(mediaBlockSlides[mediaBlockCurrentSlide], { duration:1, from:1.0, to:0.0 }); 
	mediaBlockCurrentSlide = 0;
	Effect.Appear(mediaBlockSlides[mediaBlockCurrentSlide], { duration:1, from:0.0, to:1.0 });
	mediaBlockIntervalId = setInterval('ftnMediaBlockSlideShow()',mediaBlockDelay);
}

function ftnMediaBlockSlideShowReduce(){
	ftnMediaBlockSlideShowPause();
	var controls = document.getElementById('media-block-slideshow-controls');
	controls.className = 'bar';
	if(BrowserDetect.browser == 'Explorer')
		document.getElementById('media-block-slideshow').style.display = 'none';
	else
		Effect.BlindUp(document.getElementById('media-block-slideshow'), {duration: 0.3});
	var reduceBut = document.getElementById('media-block-slideshow-reduce');
	reduceBut.onclick = ftnMediaBlockSlideShowExpand;
	reduceBut.src = '/images/buttons/mb-expand.png';
	reduceBut.alt = 'Expand';
}

function ftnMediaBlockSlideShowExpand(){
	ftnMediaBlockSlideShowPlay();
	var controls = document.getElementById('media-block-slideshow-controls');
	controls.className = 'overlay';
	if(BrowserDetect.browser == 'Explorer')
		document.getElementById('media-block-slideshow').style.display = '';
	else
		Effect.BlindDown(document.getElementById('media-block-slideshow'), {duration: 0.3});
	var reduceBut = document.getElementById('media-block-slideshow-reduce');
	reduceBut.onclick = ftnMediaBlockSlideShowReduce;
	reduceBut.src = '/images/buttons/mb-reduce.png';
	reduceBut.alt = 'Reduce';
}

// This function call should always be at the bottom of the script - it
// needs to run after all functions have been defined
ftnCaBAdminLoadEvents();
