//	LBi.Custom v 1.0
//	Now working under mootools 1.11
//
if ( typeof LBi == 'undefined' ) { self.LBi = {}; }

String.prototype.trim = function () {
    return this.replace(/^\s*|\s*$/g,'');
}
Element.extend({
	getParents: function(selector){
		return $$(selector || '').filter(function(el){
			return (el.hasChild(this));}, this).reverse();
	}
});

// Write in the CSS file to control load flicker
document.write('<link href="/assets/style/has_js.css" media="screen" type="text/css" rel="stylesheet" />');


LBi.Custom = {

	identJS: function() {
		$E('body').addClass("hasJS");
	},
	sortNumeric: function(b,a) {
		return a < b ? -1 : (a > b) ? 1 : 0;
	},
	isUnsignedInteger: function (s) {
		return (s.toString().search(/^[0-9]+$/) == 0);
	},
	getStringQueries: function(theString) {
		// returns object of all queries within a string
		if(theString.indexOf('?')>-1) {
			theString = theString.split('?')[1];
		}
		var qs = theString, qsKey, qsValue, stringElements = {};
		qs = qs.split("&");
		for (var i = qs.length-1; i>=0; i--) {
			qsKey = qs[i].split("=")[0];
			qsValue = qs[i].split("=")[1];
			stringElements[qsKey] = qsValue;
		}
		return stringElements;
	},
	urlGetAnchor: function(anchor) {
		// strip out and return local page anchor from url
		if ( anchor.href.indexOf("#") >= 0 ) { //Check for anchorness
			anchor.destination = anchor.href.substring(anchor.href.indexOf("#")+1);
			return anchor.destination;
		} else {
			return false;
		}
	},
	urlAjaxify: function(url) {
		// Pass through to a better place
		return LBi.Custom.ajax.tagUrl(url);
	},
	dynamicInputText: function() {
		// Show/Hide of default value for inputs with class .dynaText
		var inputs = $$("input.dynaText");
		for(var i=0; i<inputs.length; i++){
			var target=inputs[i];
			target.savedText = target.value; // keep track of the original input value
			target.onfocus=function(){
				this.value = this.value.trim()
				if (this.value == this.savedText) {
					this.value = "";
				}
			}
			target.onblur=function(){
				this.value = this.value.trim()
				if (this.value == "") {
					this.value = this.savedText;
				}
			}
		}
	},

	/* New window/popup functions
	---------------------------------------*/
	openInNewWindow: function(e) {
	/* Create the new window */
		var event;
		if (!e) event = window.event;
		else event = e;
		// Abort if a modifier key is pressed
		if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) {
			return true;
		}
		else {
			// Change "_blank" to something like "newWindow" to load all links in the same new window
	    	var newWindow = window.open(this.getAttribute('href'), '_blank');
			if (newWindow) {
				if (newWindow.focus) {
					newWindow.focus();
				}
				return false;
			}
			return true;
		}
	},
	getNewWindowLinks: function() {
	/* Add the openInNewWindow function to the onclick event of links with a specified class name */
		// Check that the browser is DOM compliant
		if (document.getElementById && document.createElement && document.appendChild) {
			// Change this to the text you want to use to alert the user that a new window will be opened
			var strNewWindowAlert = " (opens in a new window)";
			// Find all links
			var links = document.getElementsByTagName('a');
			var objWarningText;
			var link;
			for (var i = 0; i < links.length; i++) {
				link = links[i];
				// Find all links with a class name of "newwin"
				if (/\bnewwin\b/.test(link.className)) {
					// Create an em element containing the new window warning text and insert it after the link text
					//objWarningText = document.createElement("em");
					//objWarningText.appendChild(document.createTextNode(strNewWindowAlert));
					//link.appendChild(objWarningText);
					link.title = "This link will open a new window";
					link.onclick = LBi.Custom.openInNewWindow;
				}
			}
			objWarningText = null;
		}
	},
	sortNumeric: function(f,s) {
		return s-f;
	},
	
	ajax: {
		
		bufferFieldID	: 'ajaxVirtualBufferUpdate',
		
		prepareBuffer: function() {
			// Insert form field for 
			var objHidden = document.createElement('input');
			
			objHidden.setAttribute('type', 'hidden');
			objHidden.setAttribute('value', '1');
			objHidden.setAttribute('id', LBi.Custom.ajax.bufferFieldID);
			objHidden.setAttribute('name', LBi.Custom.ajax.bufferFieldID);

			document.body.appendChild(objHidden);
		},
		updateBuffer: function() {
			// Updates value of hidden form field to nuge screen readers into recognising page state change
			var objHidden = document.getElementById(LBi.Custom.ajax.bufferFieldID);			
			if (objHidden) {
				if (objHidden.getAttribute('value') == '1') {
					objHidden.setAttribute('value', '0');
				} else {
					objHidden.setAttribute('value', '1');
				}
			} else {
				LBi.Custom.ajax.prepareBuffer();
				LBi.Custom.ajax.updateBuffer();
			}		
		},
		tagUrl: function(url) {
			// takes a string (url expected) and appends parameter to identify as AJAX only content required
			// If '#' is present it moves it to the end of the string
			var ajaxURL;
			var identString = "rc=1";
			var prefix = (!url.contains('?')) ? "?" : "&" ;			
			if ( url.indexOf("#") >= 0 ) { //Check for anchorness
				urlParts = url.split('#');
				ajaxURL = urlParts[0] + prefix + identString + '#'+urlParts[1];				
			} else {
				ajaxURL = url + prefix + identString;
			}
			return ajaxURL;
		}
		
	}

}/* /LBi.Custom */

LBi.spinner = {

	imgPath			: '/assets/img/spinner.gif',
	spinnerClass	: 'spinner',
	spinnerAlt		: '',
	spinnerHeight	: '16',
	spinnerWidth	: '16',

	buildSpinner: function() {
		var spinner = new Element('img');
		spinner.src = LBi.spinner.imgPath;
		spinner.alt = LBi.spinner.spinnerAlt;
		spinner.width = LBi.spinner.spinnerWidth;
		spinner.height = LBi.spinner.spinnerHeight;
		spinner.addClass(LBi.spinner.spinnerClass);
		return spinner;
	},
	show: function(container,visible) {
		spinnerSelector = '.'+LBi.spinner.spinnerClass;
		var spinner = $E(spinnerSelector,container);
		if (visible) {
			spinner.setStyle('visibility','visible');
		} else {
			spinner.setStyle('visibility','hidden');
		}
	}

}/* /LBi.spinner */


LBi.navigation = {

	navID				: 'nav',
	navImgSelector		: 'img',
	navSubItemSelector	: 'ul',

	triggerSplitChar	: '_',
	triggerOverSuffix	: '_over.gif',
	triggerHiSuffix		: '_hi.gif',

	switchTrigger: function(trigger,toggleCheck) {
		var triggerImg = $E(LBi.navigation.navImgSelector,trigger);
		if (!trigger.origImg) {
			trigger.origImg = triggerImg.src;
		}
		if (toggleCheck) {
			var newPath = triggerImg.src.split(LBi.navigation.triggerSplitChar)[0]
			if($E(LBi.navigation.navSubItemSelector,trigger)) {
				newPath = newPath + LBi.navigation.triggerOverSuffix;
			} else {
				newPath = newPath + LBi.navigation.triggerHiSuffix;
			}
			triggerImg.src = newPath;
		} else {
			triggerImg.src = trigger.origImg;
		}
	},

	setupNav: function() {
		if(!$(LBi.navigation.navID)) return false;
		var nav = $(LBi.navigation.navID);
		var triggers = nav.getChildren();
		triggers.each(function(trigger,i){
			if($E(LBi.navigation.navSubItemSelector,trigger)) {
				var area = $E(LBi.navigation.navSubItemSelector,trigger);
				area.setStyle('visibility','hidden');
				area.setStyle('display','block');
				trigger.dropSlide = new Fx.Slide(area, {duration: 300});
				trigger.dropSlide.hide();
				area.setStyle('visibility','visible');
				trigger.dropSlide.addEvent('onComplete', function(){
					if ( area.getParent().getStyle('height') == "0px") {
						LBi.navigation.switchTrigger(trigger);
					} else {
						area.getParent().setStyle('height','auto');
					}
				});
				trigger.addEvent('mouseenter', function(e){
					e = new Event(e);
					this.toggleCheck = true;
				//console.log('over')
					clearTimeout(this.timeOut);
					LBi.navigation.switchTrigger(this,true);
					trigger.dropSlide.stop();
					trigger.dropSlide.slideIn();
					e.stop();
				});
				trigger.addEvent('mouseleave', function(e){
					e = new Event(e);
					trigger.toggleCheck = false;
					clearTimeout(this.timeOut);
					this.timeOut = window.setTimeout(function () {
						if(trigger.toggleCheck == false) {
							trigger.dropSlide.stop();
							trigger.dropSlide.slideOut();
						}
					},100);
					e.stop();
				});
			} else {
				trigger.addEvent('mouseenter', function(e){
					LBi.navigation.switchTrigger(trigger,true);
				});
				trigger.addEvent('mouseleave', function(e){
					LBi.navigation.switchTrigger(trigger);
				});
			}
		});
	}

}/* /LBi.navigation */

LBi.sideTabs = {

	tabsID				: 'sideTabs',
	tabSelector			: 'li a',
	tabRollClass		: 'hi',

	setupIE6Rollovers: function() {
		//if ( !window.ie6 || !$(LBi.sideTabs.tabsID) ) { return false; }
		var tabs = $ES(LBi.sideTabs.tabSelector,$(LBi.sideTabs.tabsID));
		tabs.each(function(tab){
			tab.addEvent('mouseover',function(e){
				tab.toggleClass(LBi.sideTabs.tabRollClass);
			});
			tab.addEvent('mouseout',function(e){
				tab.toggleClass(LBi.sideTabs.tabRollClass);
			});
		});
	},
	doSideTabs: function() {
		LBi.sideTabs.setupIE6Rollovers();
	}

}/* /LBi.sideTabs */

LBi.tabs = {

	tabsSelector		: '.tabs a',
	tabContSelector		: '.tabCont',	
	currentClass		: 'current',

	init: function() {
		LBi.tabs.async.init();		
	},
	switchTabs: function(tabSet,trigger) {
		//
		// Switch current class on tabs
		//
		
		var tabTriggers = $ES(LBi.tabs.tabsSelector,tabSet);
		tabTriggers.each(function(tabTrigger) {
			var tab = tabTrigger.getParents('li')[0];
			if (tabTrigger == trigger) {
				tab.addClass(LBi.tabs.currentClass);
			} else {
				tab.removeClass(LBi.tabs.currentClass);
			}			
		});
	},
	
	async : {
		//
		// Switch content of tabs asynchronolously
		//
		tabSetSelector		: '.asyncTabs',
		paginationSelector	: '.pagination a',
		
		init: function() {
						
			var tabSets = $$(LBi.tabs.async.tabSetSelector);
			tabSets.each(function(tabSet) {
				var tabTriggers = $ES(LBi.tabs.tabsSelector,tabSet);
				tabTriggers.each(function(tabTrigger) {
					tabTrigger.addEvent('click',function(e){
						var e=new Event(e).preventDefault();
						LBi.tabs.async.getRemote(this,tabSet,true);
					});					
				});
				LBi.tabs.async.setupPagination(tabSet);
			});			
		},
		getRemote: function(trigger,tabSet,updateTabs) {
			if(!tabset || !trigger) { return false }
			var remotePath = LBi.Custom.urlAjaxify(trigger.href);
			var contentArea = $E(LBi.tabs.tabContSelector,tabSet);
			if(contentArea && remotePath) {
				// Insert spinner
				if(!$E('.'+LBi.spinner.spinnerClass,contentArea)) {
					var spinner = LBi.spinner.buildSpinner();
					spinner.injectInside(contentArea);
				}
				// Get remote data
				var getTabContent = new Ajax(remotePath, {
					method: 'get',
					evalScripts: false,
					update: contentArea,
					onRequest: function(){
						LBi.spinner.show(contentArea,true);
					},
					onFailure: function(){
					},
					onComplete: function(response){
						if (updateTabs) {
							LBi.tabs.switchTabs(tabSet, trigger);
						}
						LBi.tabs.async.setupPagination(tabSet);
						// Behaviours we have to re-assign to new content
						LBi.smoothBox.redo(contentArea);
						LBi.forms.news.init();
					}
				}).request();
			}
		},
		setupPagination: function(tabSet) {
			if(!tabSet) return false;
			var paginationTriggers = $ES(LBi.tabs.async.paginationSelector, tabSet);
			paginationTriggers.each(function(paginationTrigger) {
				paginationTrigger.addEvent('click',function(e){
					var e=new Event(e).preventDefault();
					LBi.tabs.async.getRemote(this,tabSet,false);
				});
			});	
		}
		
	}/* /LBi.tabs.async */

}/* /LBi.tabs */

/* tab content 
 * Not currently used
 */
var tabset = new Class( {
	initialize: function(tabNavigation, tabGroup, selectedTab, tabClassSelector) {
		
		this.tabNavigation = tabNavigation;
		this.tabGroup = tabGroup;
		this.selectedTab = selectedTab;
		this.tabContainers = $$(tabClassSelector);

		(this.tabContainers).each(function(el, i) {
			if(el != selectedTab) {
				el.setStyle("display", "none");
			}
		});

		(this.tabNavigation).each(function(el, i) {
			if(el.hash == "#"+selectedTab.id) {
				el.addClass("current");
			}
			el.bindObj = this;
			el.onclick = this.selectTab;
		}, this);
	},
	selectTab: function () {
		this.bindObj.hideAllTabs();
		//var targetTabIDWithHash = $(this).getProperty("href");
		var targetTabIDWithHash = this.getAttribute("href",2);
		var targetTab = $E("div"+targetTabIDWithHash);

		$$(targetTabIDWithHash).setStyle("display", "block");
		this.addClass("current");
		return false;
	},
	hideAllTabs: function() {
		(this.tabContainers).each(function(el, i) {
			el.setStyle("display", "none");
		});

		(this.tabNavigation).each(function(el, i) {
			el.removeClass("current");
		});
	}
});
window.addEvent('domready', function(){
	//var myTabs = new tabset($$("div#tab ul li a"), "mygroup", $("tab1"), $$("div#tab div.tabCont"));
});
/* tab content ends */

LBi.pageExtracts = {

	extractSelector			: '.pageExtract',
	extractRollClass		: 'ovr',

	setupIE6Rollovers: function() {
		if ( !window.ie6 || !$$(LBi.pageExtracts.extractSelector) ) { return false; }
		var extracts = $$(LBi.pageExtracts.extractSelector);
		extracts.each(function(extract){
			extract.addEvent('mouseover',function(e){
				extract.toggleClass(LBi.pageExtracts.extractRollClass);
			});
			extract.addEvent('mouseout',function(e){
				extract.toggleClass(LBi.pageExtracts.extractRollClass);
			});
		});
	}

}/* /LBi.pageExtracts */

LBi.forms = {

	formFields			: [],
	hint				: '.hint',
	error				: '.error',

	ajaxButtonSelector	: 'input.async',
	ajaxWrapperSelector	: '.asyncWrap',

	init: function () {
		// Setup hints and errors
		formFields = $$('.form-field');
		formFields.each(function(field){
			if ($E('input', $(field))) {
				// add the onfocus event
				$E('input', $(field)).addEvent('focus', function() {
					$E('input', $(field)).addClass('focused')
					if($E(LBi.forms.hint, $(field))) {
						$E(LBi.forms.hint, $(field)).setStyle('display', 'block');
					}
					if($E(LBi.forms.error, $(field))){
						$E(LBi.forms.error, $(field)).setStyle('visibility', 'hidden');
					}
				});

				// add the onblur event
				$E('input', $(field)).addEvent('blur', function() {
					$E('input', $(field)).removeClass('focused')
					if($E(LBi.forms.hint, $(field))) {
						$E(LBi.forms.hint, $(field)).setStyle('display', 'none');
					}
					if($E(LBi.forms.error, $(field))) {
						$E(LBi.forms.error, $(field)).setStyle('visibility', 'visible');
					}
				});
			}
			else if ($E('textarea', $(field))) {
				// add the onfocus event
				$E('textarea', $(field)).addEvent('focus', function() {
					$E('textarea', $(field)).addClass('focused')
					if($E(LBi.forms.hint, $(field))) {
						$E(LBi.forms.hint, $(field)).setStyle('display', 'block');
					}
					if($E(LBi.forms.error, $(field))){
						$E(LBi.forms.error, $(field)).setStyle('visibility', 'hidden');
					}
				});

				// add the onblur event
				$E('textarea', $(field)).addEvent('blur', function() {
					$E('textarea', $(field)).removeClass('focused')
					if($E(LBi.forms.hint, $(field))) {
						$E(LBi.forms.hint, $(field)).setStyle('display', 'none');
					}
					if($E(LBi.forms.error, $(field))) {
						$E(LBi.forms.error, $(field)).setStyle('visibility', 'visible');
					}
				});
			}
			else if ($E('div.selectBoxWrapper', $(field))) {
				// add the onfocus event
				$E('div.selectBoxWrapper', $(field)).addEvent('focus', function() {
					$E('div.selectBoxWrapper', $(field)).addClass('focused')
					if($E(LBi.forms.hint, $(field))) {
						$E(LBi.forms.hint, $(field)).setStyle('display', 'block');
					}
					if($E(LBi.forms.error, $(field))){
						$E(LBi.forms.error, $(field)).setStyle('visibility', 'hidden');
					}
				});

				// add the onblur event
				$E('div.selectBoxWrapper', $(field)).addEvent('blur', function() {
					$E('div.selectBoxWrapper', $(field)).removeClass('focused')
					if($E(LBi.forms.hint, $(field))) {
						$E(LBi.forms.hint, $(field)).setStyle('display', 'none');
					}
					if($E(LBi.forms.error, $(field))) {
						$E(LBi.forms.error, $(field)).setStyle('visibility', 'visible');
					}
				});
			}
		});
		// Setup pre-requisites for AJAX submission
		LBi.forms.pageForm = $E('form',document);
		LBi.forms.pageForm.savedAction = LBi.forms.pageForm.action;
		// Setup display and AJAX behaviour
		LBi.forms.initBehaviours();
	},
	initBehaviours: function() {
		LBi.forms.news.init();
		LBi.forms.tasks.init();
		LBi.forms.submissions.init();
		LBi.forms.products.init();
	},
	getData: function(trigger) {
		// Build data form ajax submission
		if(!trigger) { return false }

		var inputs = document.getElementsBySelector('textarea, select, input[type!=image]');
		var tempQuery = '';
		inputs.each(function(input){
			tempQuery = tempQuery + encodeURIComponent(input.name) + '=' + encodeURIComponent(input.getValue()) + '&';
		});
		tempQuery = tempQuery + trigger.name + '.x=0&' + trigger.name + '.y=0';
		return tempQuery;
	},
	news : {

		newsListSelector		: '.newsList',
		newsListDeleteSelector	: 'a.newsDelete',
		certaintyConfirmText	: 'Are you sure?',

		init: function() {
			this.deletePostSetup();
		},
		deletePostSetup: function() {
			var newsLists = $$(LBi.forms.news.newsListSelector);
			newsLists.each(function(newsList){
				var deleteLinks = $ES(LBi.forms.news.newsListDeleteSelector,newsList)
				deleteLinks.each(function(deleteLink){
					deleteLink.addEvent('click',function(e){
						var e=new Event(e).preventDefault();

						if (deleteLink.certaintyCheck == true) {
							var aWrapper = deleteLink.getParents('li')[1];
							var remotePath = LBi.Custom.urlAjaxify(deleteLink.href);				
							var deletePost = new Ajax(remotePath, {
								method: 'get',
								evalScripts: false,
								onRequest: function(){
									aWrapper.setStyle('display','none');									
								},
								onFailure: function(){
									deleteLink.setHTML(deleteLink.savedText);
									aWrapper.setStyle('display','block');
								},
								onComplete: function(response){
									aWrapper.remove();
									LBi.Custom.ajax.updateBuffer();
								}
							}).request();
						} else {
							deleteLink.savedText = deleteLink.getText();
							deleteLink.setHTML(LBi.forms.news.certaintyConfirmText);
							deleteLink.certaintyCheck = true;
							LBi.Custom.ajax.updateBuffer();
						}

					});
				});
			});
		}
	},
	tasks : {

		taskGroupSelector		: '.tasks',
		taskListSelector		: '.todo li.action',
		taskActiveClass			: 'active',
		taskDoneClass			: 'done',
		descriptionSelector		: '.description',
		methodSelector			: '.method',
		earnSelector			: '.earn',
		detailSelector			: '.detail',
		taskCountSelector		: '.taskCount p',
		pupilCountSelector		: '.pupilCount',
		pupilInputSelector		: 'input.pupilCountInput',
		pupilErrorClass			: 'error',
		pupilErrorCopy			: 'Please enter a valid number.',
		submitSelector			: 'input.submit',

		triggerCompleteClass	: 'complete',
		triggerCompleteSrc		: '/images/buttons/mark_activity_complete.gif',
		triggerCompleteAlt		: 'Complete this task',

		confirmImgSuffix		: '_js',

		triggerCancelClass		: 'close',
		triggerCancelText		: 'Cancel &#187',

		init: function() {
			// Setup task behaviour
			var taskGroups = $$(this.taskGroupSelector);
			taskGroups.each(function(taskGroup){
				var tasks = $ES(LBi.forms.tasks.taskListSelector,taskGroup);
				tasks.each(function(task){

					// Setup task properties we'll need to use later
					task.desc = $E(LBi.forms.tasks.descriptionSelector,task);
					task.method = $E(LBi.forms.tasks.methodSelector,task);
					task.taskCount = $E(LBi.forms.tasks.taskCountSelector,task);
					task.earn = $E(LBi.forms.tasks.earnSelector,task);
					task.detail = $E(LBi.forms.tasks.detailSelector,task);
					task.pupilCount = $E(LBi.forms.tasks.pupilCountSelector,task);
					task.pupilCountInput = $E(LBi.forms.tasks.pupilInputSelector,task);
					task.submit = $E(LBi.forms.tasks.submitSelector,task);

					// Insert spinner for getRemote()
					var spinner = LBi.spinner.buildSpinner();
					spinner.injectInside(task);

					// Switch confirm button for version with background colour matching JS enabled version
					var currentSrc = task.submit.src.split('.gif');
					var newSrc = currentSrc[0] + LBi.forms.tasks.confirmImgSuffix + '.gif';
					task.submit.src = newSrc;

					// Insert 'complete this' trigger
					task.triggerComplete = new Element('p');
					task.triggerComplete.addClass(LBi.forms.tasks.triggerCompleteClass);
					var triggerCompleteLink = new Element('a');
					triggerCompleteLink.href = '#';
					triggerCompleteLink.addEvent('click',function(e){
						var e=new Event(e).preventDefault();
						LBi.forms.tasks.toggleView(task);
					});
					var triggerCompleteImg = new Element('img');
					triggerCompleteImg.src = LBi.forms.tasks.triggerCompleteSrc;
					triggerCompleteImg.alt = LBi.forms.tasks.triggerCompleteAlt;
					triggerCompleteImg.injectInside(triggerCompleteLink);
					triggerCompleteLink.injectInside(task.triggerComplete);
					task.triggerComplete.injectInside(task.desc);

					// Insert 'cancel' trigger
					task.triggerCancel = new Element('p');
					task.triggerCancel.addClass(LBi.forms.tasks.triggerCancelClass);
					var triggerCancelLink = new Element('a');
					triggerCancelLink.href = "#";
					triggerCancelLink.addEvent('click',function(e){
						var e=new Event(e).preventDefault();
						LBi.forms.tasks.toggleView(task);
					});
					triggerCancelLink.setHTML(LBi.forms.tasks.triggerCancelText);
					triggerCancelLink.injectInside(task.triggerCancel);
					task.triggerCancel.injectInside(task.method);

					// Prevent default submission on pupilCount input
					if(task.pupilCountInput) {
						task.pupilCountInput.addEvent('keydown',function(e){
							var e = new Event(e);
							if (e.key == 'enter'){
								e.preventDefault();
							}
						});
						task.pupilCountInput.addEvent('keyup',function(e){
							var e = new Event(e);
							if (e.key == 'enter'){
								e.preventDefault();
								LBi.forms.tasks.getRemote(task);
							}
						});
					}
					// Add submission event to confim button
					if(task.submit) {
						task.submit.addEvent('click',function(e){
							var e=new Event(e).preventDefault();
							LBi.forms.tasks.getRemote(task);
						});
					}

				});
			});
		
			// Setup suggest task show/hide
			LBi.forms.tasks.taskSuggest.init();
		},
		taskSuggest : {
			
			suggestID				: 'suggestTask',
			suggestIsOpenClass		: 'open',
			triggerPanelSelector	: '.triggerPanel',
			triggerContentPath		: '?suggestpreview=1',
			contentPanelSelector	: '.suggestTaskCont',
			switchClass				: 'switch',
			switchSelector			: '.switch a',
			actionsSelector			: '.actions',
			cancelText				: '&#171 Cancel',
			
			suggestTask				: null,
			triggerArea				: null,
			contentArea				: null,
			
			init: function() {
				if (!$(this.suggestID)) return false;
				// Set up re-usables
				this.suggestTask = $(this.suggestID);
				var isOpen = (this.suggestTask.hasClass(this.suggestIsOpenClass)) ? true : false ;	
				this.triggerArea = $E(this.triggerPanelSelector,this.suggestTask);
				this.contentArea = $E(this.contentPanelSelector,this.suggestTask);
				// Insert trigger content
				this.getRemote(isOpen);				
			},
			getRemote: function(isOpen) {
				var remotePath = LBi.Custom.urlAjaxify(this.triggerContentPath);				
				var triggerContent = new Ajax(remotePath, {
					method: 'get',
					evalScripts: false,
					update: this.triggerArea,
					onRequest: function(){
						if(isOpen) {
							LBi.forms.tasks.taskSuggest.contentArea.setStyle('display','block');
						}
					},
					onFailure: function(){
						LBi.forms.tasks.taskSuggest.contentArea.setStyle('display','block');
					},
					onComplete: function(response){
						if(isOpen) {
							LBi.forms.tasks.taskSuggest.triggerArea.setStyle('display','none');
						}
						LBi.forms.tasks.taskSuggest.handleResponse();
					}
				}).request();
			},
			handleResponse: function() {
				var listEl = new Element('div');
				var listA = new Element('a');
				listA.href = '#';
				listA.setHTML(LBi.forms.tasks.taskSuggest.cancelText);
				listEl.addClass(LBi.forms.tasks.taskSuggest.switchClass);
				listA.injectInside(listEl);
				listEl.injectTop($E(LBi.forms.tasks.taskSuggest.actionsSelector,LBi.forms.tasks.taskSuggest.suggestTask));
				// Assign toggle behaviour to links
				var switches = $ES(LBi.forms.tasks.taskSuggest.switchSelector,LBi.forms.tasks.taskSuggest.suggestTask);
				switches.each(function(aSwitch) {
					aSwitch.addEvent('click',function(e){
						var e=new Event(e).preventDefault();
						LBi.forms.tasks.taskSuggest.toggleView();
					});
				});
			},
			toggleView: function() {
				if (LBi.forms.tasks.taskSuggest.contentArea.getStyle('display') != 'block') {
					LBi.forms.tasks.taskSuggest.contentArea.setStyle('display','block');
					LBi.forms.tasks.taskSuggest.triggerArea.setStyle('display','none');
				} else {
					LBi.forms.tasks.taskSuggest.contentArea.setStyle('display','none');
					LBi.forms.tasks.taskSuggest.triggerArea.setStyle('display','block');
				}
			}
			
		},
		getRemote: function(task) {
			// Setup AJAX form submission
			if(!task) { return false }
			if(!this.validateTask(task)) { return false }

			//var aWrapper = this.getParents('li')[1];
			LBi.forms.pageForm.action = LBi.Custom.urlAjaxify(LBi.forms.pageForm.action);

			LBi.forms.pageForm.send({
				evalScripts: false,
				data: LBi.forms.getData(task.submit),
				onRequest: function(){
					LBi.forms.tasks.toggleTriggers(task);
					LBi.spinner.show(task,true);
				},
				onComplete: function(response) {
					LBi.forms.pageForm.action = LBi.forms.pageForm.savedAction;
					LBi.forms.tasks.toggleTriggers(task);
					LBi.spinner.show(task,false);
					LBi.forms.tasks.manageResponse(task,response);
				},
				onFailure: function() {
					LBi.forms.pageForm.action = LBi.forms.pageForm.savedAction;
					LBi.forms.tasks.toggleTriggers(task);
					LBi.spinner.show(task,false);
				}
			});

		},
		manageResponse: function(task,response) {
			// JSONify the response and decide what to do.
			if(!task || !response) { return false }

			var content = Json.evaluate(response);
			if(content.completed) {
				// Replace all content for completed task
				task.setHTML(content.completed);
				this.toggleView(task);
				task.addClass(this.taskDoneClass);
			} else if (content.replace) {
				// Replace content parts for 1 of X completions
				if(content.replace[0].earned && task.earn) {
					task.earn.setHTML(content.replace[0].earned);
				}
				if(content.replace[0].countMsg1 && task.taskCount) {
					task.taskCount.setHTML(content.replace[0].countMsg1);
				}
				if(content.replace[0].countMsg2 && task.detail) {
					task.detail.setHTML(content.replace[0].countMsg2);
				}
				this.toggleView(task);
			}
			LBi.Custom.ajax.updateBuffer();
		},
		validateTask: function(task) {
			// Check pupil count is integer > 0
			// Insert/ Remove error message
			if(task.pupilCountInput) {
				var pupils = LBi.Custom.isUnsignedInteger(task.pupilCountInput.value.trim());
				if(pupils){
					pupils = task.pupilCountInput.value.toInt();
				}
				var errorSelector = '.' + this.pupilErrorClass;
				if (!pupils || pupils<=0) {
					if(!$E(errorSelector,task.pupilCount)) {
						var errorMsg = new Element('p');
						errorMsg.addClass(this.pupilErrorClass);
						errorMsg.setHTML(this.pupilErrorCopy);
						errorMsg.injectInside(task.pupilCount);
					}
					return false;
				} else {
					if($E(errorSelector,task.pupilCount)) {
						$E(errorSelector,task.pupilCount).remove();
					}
				}
			}
			// Otherwise it's all fine
			return true;
		},
		toggleView: function(task) {
			task.toggleClass(this.taskActiveClass);
			if (task.hasClass(this.taskActiveClass) && task.pupilCountInput) {
				task.pupilCountInput.value = "";
				var errorSelector = '.' + this.pupilErrorClass;
				if($E(errorSelector,task.pupilCount)) {
					$E(errorSelector,task.pupilCount).remove();
				}
			}
		},
		toggleTriggers: function(task) {
			if (task.submit) {
				task.submit.toggleClass('postit');
			}
			if (task.triggerCancel) {
				task.triggerCancel.toggleClass('postit');
			}
		}

	},
	
	submissions : {

		deleteSubmissionConfirmText		: 'Are you sure you want to delete this report?',
		deleteLinkCopy					: 'Delete \u00bb',
		cancelDeleteLinkCopy			: 'Cancel Delete \u00bb',
		
		submitSelector					: 'input.submit',
		deleteSelector					: 'input.delete',

		controlsUL						: 'div.controls ul',
		seeFullReportCopy				: 'See Full Report \u00bb',
		hideFullReportCopy				: 'Hide Full Report \u00bb',

		init: function() {
			var allSubmissions = $$('div.submissions ul.submissionsList li.submission');
				allSubmissions.each(function(eachSubmission) {
					LBi.forms.submissions.viewFullReportToggling.setupToggleLinks(eachSubmission);
				});
			var allSubmissionsToDo = $$('div.submissions ul.todo li.submission');
			allSubmissionsToDo.each(function(submissionToDo) {
				LBi.forms.submissions.deleteSubmissionFunctionality.init(submissionToDo);
				LBi.forms.submissions.approveSubmissionFunctionality.init(submissionToDo);
			});
		},
		
		deleteSubmissionFunctionality: {
			init: function(submissionToDo) {
				//Get handles on parts of the DOM we need to reference
				submissionToDo.submit = $E(LBi.forms.submissions.submitSelector, submissionToDo);
				submissionToDo.deleteSubmissionButton = $E(LBi.forms.submissions.deleteSelector, submissionToDo);
				submissionToDo.controlsUL = $E(LBi.forms.submissions.controlsUL, submissionToDo);
				
				//Hide the delete button
				submissionToDo.deleteSubmissionButton.setStyle('display', 'none');
				
				//Add ajax functionality to delete button
				submissionToDo.deleteSubmissionButton.addEvent('click',function(e){
					var e=new Event(e).preventDefault();

					LBi.forms.pageForm.action = LBi.Custom.urlAjaxify(LBi.forms.pageForm.action);
					
					LBi.forms.pageForm.send({
						update: submissionToDo,
						evalScripts: false,
						data: LBi.forms.getData(this),
						onRequest: function(){
							submissionToDo.setStyle('display', 'none');
						},
						onComplete: function(){
							LBi.forms.pageForm.action = LBi.forms.pageForm.savedAction;
							LBi.Custom.ajax.updateBuffer();
						},
						onFailure: function(){
							LBi.forms.pageForm.action = LBi.forms.pageForm.savedAction;
							submissionToDo.setStyle('display', 'block');
						}
					});
				});
				
				//Create a delete submission link
				submissionToDo.deleteLink = new Element('a');
				//Set up certainty check
				submissionToDo.deleteLink.cancelDeleteCheck = false;
				submissionToDo.deleteLink.href = '#';
				submissionToDo.deleteLink.setText(LBi.forms.submissions.deleteLinkCopy);
				submissionToDo.deleteLink.injectAfter(submissionToDo.deleteSubmissionButton);
				//Add onclick event handler to delete submission link
				submissionToDo.deleteLink.addEvent('click',function(e){
					var e=new Event(e).preventDefault();
					
					if (submissionToDo.deleteLink.cancelDeleteCheck == true) {
						//Cancel Delete functionality
						confirmDeleteDIV = $E('div.confirmDelete', submissionToDo);
						confirmDeleteDIV.remove();
						submissionToDo.submit.setStyle('display', 'block');
						submissionToDo.deleteLink.setText(LBi.forms.submissions.deleteLinkCopy);
						submissionToDo.deleteLink.cancelDeleteCheck = false;
					}
					else {
						//Hide approve button
						submissionToDo.submit.setStyle('display', 'none');
						//Set cancel delete check to true
						submissionToDo.deleteLink.cancelDeleteCheck = true;
						//Change the Delete link to Cancel Delete Link
						submissionToDo.deleteLink.setText(LBi.forms.submissions.cancelDeleteLinkCopy);
						//Show the delete button and accompanying text
						//Create Confirm Deletion associated text 
						var deleteSubmissionConfirmText = new Element('p');
						deleteSubmissionConfirmText.setText(LBi.forms.submissions.deleteSubmissionConfirmText);
						//Crete div to hold text and button
						var confirmDeleteDIV = new Element('div');
						confirmDeleteDIV.addClass('confirmDelete');
						deleteSubmissionConfirmText.injectInside(confirmDeleteDIV);
						submissionToDo.deleteSubmissionButton.injectInside(confirmDeleteDIV);
						submissionToDo.deleteSubmissionButton.setStyle('display', 'block');
						confirmDeleteDIV.injectAfter(submissionToDo.submit);
					}
				});
			}
		},
		
		approveSubmissionFunctionality: {
			
			init: function(submissionToDo) {
				// Setup task properties we'll need to use later
				submissionToDo.submit = $E(LBi.forms.submissions.submitSelector, submissionToDo);
				submissionToDo.deleteSubmission = $E(LBi.forms.submissions.deleteSelector, submissionToDo);
				submissionToDo.deleteSubmissionButton = $E(LBi.forms.submissions.deleteSelector, submissionToDo);
	
				// Insert spinner for getRemote()
				var spinner = LBi.spinner.buildSpinner();
				spinner.injectInside(submissionToDo);
	
				// Add submission event to confim button
				if(submissionToDo.submit) {
					submissionToDo.submit.addEvent('click',function(e){
						var e=new Event(e).preventDefault();
						LBi.forms.submissions.approveSubmissionFunctionality.getRemote(submissionToDo);
					});
				}		
			},
			
			getRemote: function(submissionToDo) {
				// Setup AJAX form submission
				if(!submissionToDo) { 
					return false 
				}
				else {
					LBi.forms.pageForm.action = LBi.Custom.urlAjaxify(LBi.forms.pageForm.action);
		
					LBi.forms.pageForm.send({
						evalScripts: false,
						data: LBi.forms.getData(submissionToDo.submit),
						onRequest: function(){
							LBi.forms.submissions.approveSubmissionFunctionality.toggleTriggers(submissionToDo);
							LBi.spinner.show(submissionToDo, true);
						},
						onComplete: function() {
							LBi.forms.pageForm.action = LBi.forms.pageForm.savedAction;
							LBi.forms.submissions.approveSubmissionFunctionality.toggleTriggers(submissionToDo);
							LBi.spinner.show(submissionToDo, false);
							//Remove "Approve" submit trigger and put "Approved!"
							var approvedP = new Element('p');
							approvedP.addClass('approved');
							approvedP.setText('Approved!');
							submissionToDo.submit.replaceWith(approvedP);
							//Remove Delete link and delete button
							submissionToDo.deleteLink.remove();
							submissionToDo.deleteSubmissionButton.remove();
							LBi.Custom.ajax.updateBuffer();
						},
						onFailure: function() {
							LBi.forms.pageForm.action = LBi.forms.pageForm.savedAction;
							LBi.forms.submissions.approveSubmissionFunctionality.toggleTriggers(submissionToDo);
							LBi.spinner.show(submissionToDo, false);
						}
					});
				}
			},
			
			toggleTriggers: function(submissionToDo) {
				if (submissionToDo.submit) {
					submissionToDo.submit.toggleClass('postit');
				}
				if (submissionToDo.deleteSubmissionButton) {
					submissionToDo.deleteSubmissionButton.toggleClass('postit');
				}
			}
		},
		
		viewFullReportToggling: {
			//Iterate through each list item and inject "View full report" link and "Hide full report" link
			//Instantiate fx slide for each list item and hide additional info
			//Create on click behaviour for each view full report link				
			setupToggleLinks: function(eachSubmission) {
				
				if ($E('div.additionalContent', eachSubmission)) {
					//Setup slider
					var additionalContentElement = $E('div.additionalContent', eachSubmission);
					//A few tricks to stop the customary slide initiation flicker
					additionalContentElement.setStyle('visibility','hidden');
					additionalContentElement.setStyle('display','block');
					var additonalInfoSlide = new Fx.Slide(additionalContentElement, {duration: 300 });
					additonalInfoSlide.hide();
					additionalContentElement.setStyle('visibility','visible');
					
					//Create open link and inject it
					var openLI = new Element('li');
					openLI.addClass('clearfix');
					var openLink = new Element('a');
					openLink.href = '#';
					openLink.setText(LBi.forms.submissions.seeFullReportCopy);
					openLink.injectInside(openLI);
					var controlsUnorderedListElement = $E('div.controls ul', eachSubmission);
					openLI.injectTop(controlsUnorderedListElement);
					
					//Add onclick functionality
					openLink.addEvent('click', function(e){
						var e = new Event(e).preventDefault();
						//hide this link and show the other one
						openLI.setStyle('display', 'none');
						closeLI.setStyle('display', 'block');
						//open slider
						additonalInfoSlide.slideIn();
						additionalContentElement.getParent().setStyle('float','left');
						e.stop();
					});
					
					//Create close link
					var closeLI = new Element('li');
					closeLI.addClass('clearfix');
					closeLI.setStyle('display', 'none');
					var closeLink = new Element('a');
					closeLink.href = '#';
					closeLink.setText(LBi.forms.submissions.hideFullReportCopy);
					closeLink.injectInside(closeLI);
					closeLI.injectAfter(openLI);
					
					closeLink.addEvent('click', function(e){
						var e = new Event(e).preventDefault();
						//hide this link and show the other one
						closeLI.setStyle('display', 'none');
						openLI.setStyle('display', 'block');
						//close slider
						additonalInfoSlide.slideOut();
					});
					
					additonalInfoSlide.addEvent('onComplete', function(){
						LBi.forms.submissions.viewFullReportToggling.ie6Fix();
					});
				}
			},
			ie6Fix: function() {
				// Force a re-draw of the wrapper for ie6 rendering
				if(window.ie6) {
					$('wrapper').setStyle('height',0);
					$('wrapper').setStyle('height','100%');
				}
			}
		}
	},
	
	products: {
		
		productSelector			: '.products .product',
		quantitySelector		: '.quantity',
		quantityValSelector		: '.quantity strong',
		quantityValText			: 'Quantity ',
		unavailableText			: 'Unavailable',
		controlsSelector		: '.quantityControls',
		controlAddSelector		: '.add',
		controlRemoveSelector	: '.remove',
		triggerDisableClass		: 'disabled',
		
		productCardGroupSelector: '.productCard',
		removeLinkSelector		: '.removeProd a',
		
		orderedClass			: 'hasQuantity',
		unavailableClass		: 'unavailable',
		
		leafBankSelector		: '.leafBank .counter img',
		productCountSelector	: '.productCount .counter img',
		blankNumIdent			: 'blank',
		leavesUsedSelector		: '.rewardsInfoSuf span',
		tabSelector				: '.productListingTop .current em',
		
		inProgress				: false,
		
		init: function() {
			var products = $$(this.productSelector);
			products.each(function(product){
				// Setup quantity controls
				if ($E(LBi.forms.products.controlsSelector,product)) {
					// Add submission event to add button
					if($E(LBi.forms.products.controlAddSelector,product)) {
						var addButton = $E(LBi.forms.products.controlAddSelector,product);
						addButton.addEvent('click',function(e){
							var e=new Event(e).preventDefault();
							LBi.forms.products.getRemote(addButton);
						});
					}
					// Add submission event to remove button
					if($E(LBi.forms.products.controlRemoveSelector,product)) {
						var removeButton = $E(LBi.forms.products.controlRemoveSelector,product);
						removeButton.addEvent('click',function(e){
							var e=new Event(e).preventDefault();
							LBi.forms.products.getRemote(removeButton);
						});
					}
				}
				// Setup remove event
				if($E(LBi.forms.products.removeLinkSelector,product)) {
					var trigger = $E(LBi.forms.products.removeLinkSelector,product);
					trigger.addEvent('click',function(e){
						var e=new Event(e).preventDefault();
						LBi.forms.products.sendRemove(product,trigger);
					});
				}
			});
		},
		
		sendRemove: function(product,trigger) {
			if(!product || !trigger || product.triggerFlag) { return false }
			// Pick up search string
			var remotePath = LBi.Custom.urlAjaxify(trigger.href);
			// Get remote data
			var userRemove = new Ajax(remotePath, {
				method: 'get',
				evalScripts: false,
				onRequest: function(){
					// Set flag to prevent additional firing of event
					product.triggerFlag = true;
					trigger.setStyle('display','none');
				},
				onFailure: function(){
					product.triggerFlag = false;
					trigger.setStyle('display','block');
				},
				onComplete: function(response){
					LBi.forms.products.remove(product);
					LBi.forms.products.manageResponse(response);
				}
			}).request();
		},
		remove: function(product) {
			// Remove product from the checkout card
			var parent = product.getParent();			
			if (product && parent) {	
				// Setup fadeout
				product.fx = new Fx.Styles(product, {duration: 500, wait: false});
				product.fx.options.transition = Fx.Transitions.Sine.easeIn;
				product.fx.addEvent('onComplete', function(){	
					if (product.getStyle('opacity') == 0 ) {
						// get current product group
						var pWrapper = product.getParents('div')[1];
						// Remove this product
						parent.remove();
						// Check if there are any more products in grouping and remove if empty
						var siblings = $ES(LBi.forms.products.productSelector,pWrapper);
						if(siblings.length<1) {
							pWrapper.remove();
						}
						LBi.overlay.position();						
						LBi.Custom.ajax.updateBuffer();
					}
				});
				// Start
				product.fx.start({'opacity': 0});
			}
		},
		
		getRemote: function(trigger) {
			// Setup AJAX form submission
			if(
				!trigger 
				|| trigger.hasClass(LBi.forms.products.triggerDisableClass) 
				|| LBi.forms.products.inProgress==true  
			) { return false }

			LBi.forms.pageForm.action = LBi.Custom.urlAjaxify(LBi.forms.pageForm.action);

			LBi.forms.pageForm.send({
				evalScripts: false,
				data: LBi.forms.getData(trigger),
				onRequest: function(){
					LBi.forms.products.inProgress = true;
				},
				onComplete: function(response) {
					LBi.forms.pageForm.action = LBi.forms.pageForm.savedAction;
					LBi.forms.products.inProgress = false;
					LBi.forms.products.manageResponse(response);
				},
				onFailure: function() {
					LBi.forms.pageForm.action = LBi.forms.pageForm.savedAction;
					LBi.forms.products.inProgress = false;
				}
			});

		},
		manageResponse: function(response) {
			// JSONify the response and decide what to do.
			if(!response) { return false }

			var content = Json.evaluate(response);
			
			// Update leaf counter
			var leafDigits = $ES(LBi.forms.products.leafBankSelector,document);
			if (leafDigits.length == content.remainingLeafCount.length) {
				leafDigits.each(function(digit, d){
					var newDigit = content.remainingLeafCount.charAt(d);
					if (newDigit == ' ') {
						newDigit = LBi.forms.products.blankNumIdent;
					}
					if (digit.src.contains(LBi.forms.products.blankNumIdent)){
						digit.src = digit.src.replace(LBi.forms.products.blankNumIdent,newDigit);
					} else {
						digit.src = digit.src.replace(/(._)[0-9]/,'l_'+newDigit);
					}					
					if(d == leafDigits.length-1) {
						digit.alt = content.remainingLeafCount.trim();
					}
				});
			}
			
			// Update product counter
			var prodDigits = $ES(LBi.forms.products.productCountSelector,document);
			if (prodDigits.length == content.productCount.length) {
				prodDigits.each(function(digit, d){
					var newDigit = content.productCount.charAt(d);
					if (newDigit == ' ') {
						newDigit = LBi.forms.products.blankNumIdent;
					}
					if (digit.src.contains(LBi.forms.products.blankNumIdent)){
						digit.src = digit.src.replace(LBi.forms.products.blankNumIdent,newDigit);
					} else {
						digit.src = digit.src.replace(/(._)[0-9]/,'l_'+newDigit);
					}					
					if(d == prodDigits.length-1) {
						digit.alt = content.productCount.trim();
					}
				});
			}
			if($E(LBi.forms.products.leavesUsedSelector,document)) {
				$E(LBi.forms.products.leavesUsedSelector,document).setHTML(content.spentLeafCount);
			}
			
			// Update tab product count
			if ( $E(LBi.forms.products.tabSelector,document) ) {
				$E(LBi.forms.products.tabSelector,document).setHTML(content.tabProductCount);
			}			
			
			// Update products
			if(content.products) {
				content.products.each(function(product){
					if ($(product.productID)) {
						var prod = $(product.productID);
						var parent = prod.getParent();
						
						if (product.quantity > 0) {
							parent.addClass(LBi.forms.products.orderedClass);
						} else {
							parent.removeClass(LBi.forms.products.orderedClass);
						}
						
						if(product.available == false) {
							parent.addClass(LBi.forms.products.unavailableClass);
							//$E(LBi.forms.products.quantityValSelector,prod).setHTML(LBi.forms.products.unavailableText);
							$E(LBi.forms.products.quantityValSelector,prod).setHTML(LBi.forms.products.quantityValText+product.quantity);
						} else {
							parent.removeClass(LBi.forms.products.unavailableClass);
							$E(LBi.forms.products.quantityValSelector,prod).setHTML(LBi.forms.products.quantityValText+product.quantity);
						}
						
						if(product.allowPlus == false) {
							$E(LBi.forms.products.controlAddSelector,prod).addClass(LBi.forms.products.triggerDisableClass);
							$E(LBi.forms.products.controlAddSelector,prod).setProperty('disabled','disabled');
						} else {
							$E(LBi.forms.products.controlAddSelector,prod).removeClass(LBi.forms.products.triggerDisableClass);
							$E(LBi.forms.products.controlAddSelector,prod).removeProperty('disabled');
						}
						
						if(product.allowMinus == false) {
							$E(LBi.forms.products.controlRemoveSelector,prod).addClass(LBi.forms.products.triggerDisableClass);
							$E(LBi.forms.products.controlRemoveSelector,prod).setProperty('disabled','disabled');
						} else {
							$E(LBi.forms.products.controlRemoveSelector,prod).removeClass(LBi.forms.products.triggerDisableClass);
							$E(LBi.forms.products.controlRemoveSelector,prod).removeProperty('disabled');
						}
												
					}
				});
			}
			
			LBi.Custom.ajax.updateBuffer();
			
		}
		
	}

}/* /LBi.forms */

LBi.quickFinder = {
	// Also used by LBi.Maps.SearchMap

	ajaxPath					: '/htmltemplates/modules/stub_quickfinder.shtml',
	//ajaxPath					: '/AJAX/FindSchool.ashx',
	finderID					: 'quickFinder',
	finderContID				: 'quickFinderContent',
	typeAheadSelector			: '.typeAhead',
	submitSelector				: '.submit',
	resultsSelector				: 'li a',
	resultsWrapperID			: 'quickFinderResults',
	searchCharMin				: 3,
	focusClass					: 'current',
	activeClass					: 'active',
	remoteErrorMsg				: '<p class="errorMsg">Sorry an error has occured, please try again in a minute.</p>',

	identSelectorFreeText		: 'freeTextSearch',
	identSelectorPostCode		: 'postCodeSearch',
	identSelectorPostCodeMap	: 'postCodeMap',

	submitID					: 'resultsSubmit',
	submitImgPath				: '/images/buttons/view_schools_profile.gif',
	submitImgAlt				: "View School's profile",
	submitImgWidth				: 182,
	submitImgHeight				: 37,
	queryStateParameters		: '',
	
	setupLinks: function() {
		if(!$(LBi.quickFinder.resultsWrapperID)) { return false }

		var resultsWrapper = $(LBi.quickFinder.resultsWrapperID);
		var schoolLinks = $ES(LBi.quickFinder.resultsSelector,resultsWrapper);
		if (LBi.quickFinder.activeLink) {
			// Clear current link in cases of second data call
			LBi.quickFinder.activeLink = null;
		}
		schoolLinks.each(function(schoolLink){
			schoolLink.addEvent('click',function(e){
				var e=new Event(e).preventDefault();
				LBi.quickFinder.populateSubmit(this);
				if (LBi.quickFinder.activeLink) {
					LBi.quickFinder.activeLink.removeClass(LBi.quickFinder.activeClass);
				}
				LBi.quickFinder.activeLink = this;
				this.addClass(LBi.quickFinder.activeClass);
			});
			schoolLink.addEvent('focus',function(e){
				this.toggleClass(LBi.quickFinder.focusClass);
			});
			schoolLink.addEvent('blur',function(e){
				this.toggleClass(LBi.quickFinder.focusClass);
			});
		});
	},
	populateSubmit: function(trigger) {
		if(!trigger) { return false }

		if(!($(LBi.quickFinder.submitID))) {
			LBi.quickFinder.submitLink = LBi.quickFinder.buildSubmit();
			LBi.quickFinder.submitLink.injectInside($(LBi.quickFinder.resultsWrapperID));
		}
		$E('a',LBi.quickFinder.submitLink).href = trigger.href;
	},
	buildSubmit: function() {
		var sudoSubmit = new Element('p');
		sudoSubmit.id = LBi.quickFinder.submitID;
		var sudoSubmitLink = new Element('a');
		sudoSubmitLink.href = '#';
		var sudoSubmitImg = new Element('img');

		sudoSubmitImg.src = LBi.quickFinder.submitImgPath;
		sudoSubmitImg.alt = LBi.quickFinder.submitImgAlt;
		sudoSubmitImg.width = LBi.quickFinder.submitImgWidth;
		sudoSubmitImg.height = LBi.quickFinder.submitImgHeight;

		sudoSubmitImg.injectInside(sudoSubmitLink);
		sudoSubmitLink.injectInside(sudoSubmit);
		return sudoSubmit;
	},
	getRemote: function() {
		if(!LBi.quickFinder.field) { return false }
		// Pick up search string
		var query = LBi.quickFinder.field.value;
		var remotePath = LBi.quickFinder.ajaxPath + "?text=" + escape(query);
		// Pick up state parameters if present and append to path
		if (LBi.quickFinder.queryStateParameters) {
			remotePath = remotePath  + LBi.quickFinder.queryStateParameters;
		}
		// Identify wrapper for spinner display
		var wrapper = $(LBi.quickFinder.finderContID);
		// Get remote data
		var userSearch = new Ajax(remotePath, {
			method: 'get',
			update: $(LBi.quickFinder.resultsWrapperID),
			evalScripts: false,
			onRequest: function(){
				LBi.spinner.show(wrapper,true);
			},
			onFailure: function(){
				LBi.spinner.show(wrapper,false);
				$(LBi.quickFinder.resultsWrapperID).setHTML(LBi.quickFinder.remoteErrorMsg);
			},
			onComplete: function(){
				LBi.spinner.show(wrapper,false);
				LBi.quickFinder.setupLinks();
				LBi.Custom.ajax.updateBuffer();
			}
		}).request();
	},
	init: function () {
		if (!$(LBi.quickFinder.finderID)) { return false }

		var finder = $(LBi.quickFinder.finderID);

		// Setup state tokens
		LBi.quickFinder.field = $E(LBi.quickFinder.typeAheadSelector,finder);

		if (finder.hasClass(LBi.quickFinder.identSelectorFreeText)) {
			//
			// Behaviour for free text type ahead - AJAX
			//
			var spinner = LBi.spinner.buildSpinner();
			//spinner.setStyle('visibility','hidden');
			spinner.injectInside($(LBi.quickFinder.finderContID));

			// Do search if field is pre-populated
			if( LBi.quickFinder.field.value.length >= LBi.quickFinder.searchCharMin){
				LBi.quickFinder.getRemote();
			}
			// Prevent default submission on 'enter'
			LBi.quickFinder.field.addEvent('keydown',function(e){
				var e = new Event(e);
				if (e.key == 'enter'){
					e.preventDefault();
					if( this.value.trim().length >= LBi.quickFinder.searchCharMin){
						clearTimeout( LBi.quickFinder.getSearch );
						LBi.quickFinder.getSearch = setTimeout("LBi.quickFinder.getRemote();",400);
					}
				}
			});
			// Setup type-ahead
			LBi.quickFinder.field.addEvent('keyup',function(e){
				var e = new Event(e);
				if( this.value.trim().length >= LBi.quickFinder.searchCharMin){
					// Get remote data if over min char limit
					// Use timeout to prevent too many hits with every key press
					if (e.key == 'down' && ($E('ul a',LBi.quickFinder.resultsWrapperID))){
						$E('ul a',LBi.quickFinder.resultsWrapperID).focus();
					} else if (e.key == 'enter'){
						e.preventDefault();
						clearTimeout( LBi.quickFinder.getSearch );
						LBi.quickFinder.getSearch = setTimeout("LBi.quickFinder.getRemote();",400);
					} else {
						clearTimeout( LBi.quickFinder.getSearch );
						LBi.quickFinder.getSearch = setTimeout("LBi.quickFinder.getRemote();",400);
					}
				} else if( this.value.length < LBi.quickFinder.searchCharMin+1) {
					// else remove data when not relevant
					$(LBi.quickFinder.resultsWrapperID).empty();
				}
			});
		} else if (finder.hasClass(LBi.quickFinder.identSelectorPostCode)) {
			//
			// Behaviour for postcode search
			//
			LBi.quickFinder.setupLinks();
		}
	}

}/* /LBi.quickFinder */

LBi.leafOmeter = {

	wrapperID		: 'leafOmeter',
	meterID			: 'meter',
	bubbleSelector	: 'p',
	minMeterWidth	: 80,

	showBubble: function() {
		var bubble = $E(LBi.leafOmeter.bubbleSelector,$(LBi.leafOmeter.meterID));
		bubble.setStyle('visibility','visible');
	},
	init: function () {
		if (!$(LBi.leafOmeter.meterID)) { return false }

		var leafometer = $(LBi.leafOmeter.wrapperID);
		var meter = $(LBi.leafOmeter.meterID);
		// Get percentage width and convert to px - mootools does this for us which is nice
		var meterCoords = meter.getCoordinates();
		var newWidth = meterCoords.width;
		if (newWidth < LBi.leafOmeter.minMeterWidth) {
			newWidth = LBi.leafOmeter.minMeterWidth;
		}
		meter.setStyle('width',newWidth);
		// Set slider
		meter.slide = new Fx.Slide(meter, {mode: 'horizontal', duration: 800, transition: Fx.Transitions.Quad.easeOut});
		meter.slide.hide();
		meter.setStyle('visibility','visible');
		meter.slide.addEvent('onComplete', function(){
			LBi.leafOmeter.showBubble();
		});
		//meter.getParent().setStyle('position','relative');
		meter.slide.slideIn();
	}

}/* /LBi.leafOmeter */

LBi.explanations = {

	explanationSelector	: '.explanation',
	contentSelector		: '.expCont',
	triggerSelector		: 'h3',

	init: function () {
		var explanations = $$(LBi.explanations.explanationSelector);
		explanations.each(function(explanation){
			var trigger = $E(LBi.explanations.triggerSelector,explanation);
			var area = $E(LBi.explanations.contentSelector,explanation);

			area.setStyle('visibility','hidden');
			area.setStyle('display','block');

			triggerText = trigger.getText();
			var triggerLink = new Element('a');
			triggerLink.href = '#';
			triggerLink.setText(triggerText);
			trigger.empty();
			triggerLink.injectInside(trigger);

			var slide = new Fx.Slide(area, {duration: 300, transition: Fx.Transitions.Quad.easeOut});
			slide.hide();
			area.setStyle('visibility','visible');
			area.getParent().setStyle('position','relative');
			triggerLink.addEvent('click',function(e){
				var e=new Event(e).preventDefault();
				slide.toggle();
			});
		});
	}

}/* /LBi.explanations */

LBi.accordion = {

	accordionID			: 'accordion',
	currentItemSelector	: '.open',
	
	ie6Fix: function() {
		// Force a re-draw of the wrapper for ie6 rendering
		if(window.ie6) {
			$('wrapper').setStyle('height',0);
			$('wrapper').setStyle('height','100%');
		}
	},
	focusInput: function(toggle) {
		var targetEl = toggle.getParent().getNext();
		var fieldEl = $E('.form-field',targetEl);
		
		// Focus first input
		var toFocus = $E('input',fieldEl);
		if ( $E('select',fieldEl) ) {
			toFocus = $E('select',fieldEl);
		}
		toFocus.focus();

		// Disable all but this button
		var buttons =$(LBi.accordion.accordionID).getElementsBySelector('input[type=image]');
		buttons.each(function(button) {
			//button.setStyle('visibility','hidden');
			button.setProperty('disabled','disabled');
		});
		var thisButton = targetEl.getElementsBySelector('input[type=image]');
		//thisButton.setStyle('visibility','visible');
		thisButton.removeProperty('disabled');

	},
	init: function () {
		
		if(!$(LBi.accordion.accordionID)) { return false }

		var togglers = $ES('.toggler',$(LBi.accordion.accordionID));
		togglers.each(function(toggle){
			toggle.savedText = toggle.getText();
		});
		var accordion = new Accordion('p.atStart', 'div.atStart', {
        display: false,
        alwaysHide: true,
        opacity: false,
			alwaysHide: true,
			onActive: function(toggler, element){
				LBi.accordion.ie6Fix();
				toggler.getFirst() ? toggler.getFirst().setStyle('margin-bottom', '10px') : element.setStyle('margin-bottom', '10px');
				toggler.getFirst() ? toggler.getFirst().toggler.setHTML('Cancel &#187;') : toggler.setHTML('Cancel &#187;');
				LBi.accordion.focusInput(toggler);
			},
			onBackground: function(toggler, element){
				LBi.accordion.ie6Fix();
				toggler.getFirst() ? toggler.getFirst().setStyle('margin-bottom', '0') : element.setStyle('margin-bottom', '0');
				toggler.getFirst() ? toggler.getFirst().toggler.setHTML(toggler.savedText) : toggler.setHTML(toggler.savedText);
			}
		},$(LBi.accordion.accordionID));

		accordion.addEvent('onComplete', function(){
			LBi.accordion.ie6Fix();
		});

		// Check for and set open the optional current item
		if ( $E(LBi.accordion.currentItemSelector,$(LBi.accordion.accordionID)) ) {
			var currentItem = $E(LBi.accordion.currentItemSelector,$(LBi.accordion.accordionID));
			currentItem.setStyle('height','auto');

			if ( !window.ie6 ) {
				currentItem.setStyle('height',currentItem.getCoordinates().height + 15);
			}
			currentItem.setStyle('margin-bottom','10');

			var toggle = $E('p.atStart',currentItem.getPrevious());
			toggle.setHTML('Cancel &#187;')

			LBi.accordion.focusInput(toggle);
		}

		LBi.accordion.ie6Fix();

	}

}/* /LBi.accordion */

LBi.donation = {

	closeLink: function(toReplace,newCopy) {
		if(!toReplace || !$(toReplace) || !newCopy) { return false }

		var closeP = new Element('p');
		closeP.addClass('moreLink');
		var closeLink = new Element('a');
		closeLink.href = '#';
		closeLink.setText(newCopy);
		closeLink.injectInside(closeP);

		closeLink.addEvent('click',function(e){
			var e=new Event(e).preventDefault();
			window.close();
		});

		$(toReplace).replaceWith(closeP);
	}

}/* /LBi.donation */

LBi.rotator = {

	rotatorSelector			: '.rotator',
	elementWrapperSelector	: 'p',
	elementSelector			: 'img',
	rotatorSpeed			: 1000,
	rotatorPause			: 5000,

	move: function(rotator) {
		if(!$E(LBi.rotator.elementSelector,rotator)) { return false }

		rotator.panel = $E(LBi.rotator.elementSelector,rotator);
		// Set negative offset based on width of first element
		if(!rotator.offSet) {
			rotator.offSet = rotator.panel.getCoordinates().width;
			rotator.offSet = rotator.offSet - rotator.offSet*2;
		}
		if (rotator.panel.getNext()) {
			var newPanel = rotator.panel.clone();
			newPanel.injectInside($E(LBi.rotator.elementWrapperSelector,rotator));
			var fx = rotator.panel.effects({duration: LBi.rotator.rotatorSpeed, transition: Fx.Transitions.Quart.easeOut});
			fx.addEvent('onComplete', function(){
				rotator.panel.remove();
				window.setTimeout(function () {
					LBi.rotator.move(rotator);
				},LBi.rotator.rotatorPause);
			});
			fx.start({
				'margin-left': rotator.offSet
			})
		}
	},
	init: function() {
		var rotators = $$(LBi.rotator.rotatorSelector);
		rotators.each(function(rotator){
			window.setTimeout(function () {
				LBi.rotator.move(rotator);
			},LBi.rotator.rotatorPause);
		});
	}

}/* /LBi.rotator */

LBi.products = {
	//
	// Leaf redemption products
	//

	productSelector		: '.products .product',
	linkParentSelector	: 'h5',
	titleSelector		: '.title',
	descriptionSelector	: '.description',
	largeImgSelector	: '.fullImg',
	largeImgClass		: 'fullImg',
	costSelector		: '.leafCost',
	detailClass			: 'prodDetail',
	
	init: function() {
		LBi.products.setupProducts();
	},
	setupProducts: function() {
		var products = $$(this.productSelector);
		products.each(function(product){
			var title = $E(LBi.products.linkParentSelector,product);
			var children = title.getChildren();
			var link = new Element('a');
			link.href = '#';
			children.each(function(child){
				child.injectInside(link);				
			});
			link.addEvent('click',function(e){
				var e=new Event(e).preventDefault();
				LBi.products.buildDetail(product,link);
			});
			title.empty();
			link.injectInside(title);
		});
	},
	buildDetail: function(product,link){
		var productDetail = new Element('div');
		productDetail.addClass(this.detailClass);
		
		if ($E(this.largeImgSelector, product)) {
			var source = $E(this.largeImgSelector, product);
			var prodImg = new Element('img');
			prodImg.alt = '';
			prodImg.src = source.value;
			prodImg.addClass(this.largeImgClass);
			prodImg.injectInside(productDetail);
		}		
		if ($E(this.titleSelector, product)) {
			var title = new Element('h2');
			$E(this.titleSelector, product).clone().injectInside(title);
			title.injectInside(productDetail);
		}
		if ($E(this.costSelector, product)) {
			var leafCount = $E(this.costSelector, product).clone()
			leafCount.injectInside(productDetail);
		}
		if ($E(this.descriptionSelector, product)) {
			var description = $E(this.descriptionSelector, product).clone()
			description.injectInside(productDetail);
		}
		
		LBi.overlay.populate(productDetail,link);
	}

}/* /LBi.products */

LBi.orders = {
	//
	// Leaf redemption orders display functionality
	//

	orderHistorySelector		: '.orderHistory',
	orderListSelector			: '.orderList',
	detailLinkSelector			: '.orderList .detailLink a',
	closeLinkSelector			: '.close a',
	detailShowClass				: 'showMe',
	listHideClass				: 'hideMe',
	
	init: function() {
		LBi.orders.setupOrders()
	},
	setupOrders: function() {
		if (!$E(this.orderHistorySelector,document)) { return false }
		var wrapper = $E(this.orderHistorySelector,document);
		if ( $E(this.orderListSelector, wrapper) ) {
			var orderListing = $E(this.orderListSelector, wrapper);
			var detailLinks = $ES(this.detailLinkSelector, wrapper);
			detailLinks.each(function(detailLink){
				var targetID = LBi.Custom.urlGetAnchor(detailLink);
				if (targetID && $(targetID)&& $E(LBi.orders.closeLinkSelector, $(targetID))) {
					var target = $(targetID);
					detailLink.addEvent('click', function(e){
						var e = new Event(e).preventDefault();
						if (window.ie6) {
							orderListing.setStyle('display', 'none');
							target.setStyle('display', 'block');
						} else {
							LBi.orders.toggleVisibility(orderListing, target);
						}
					});
					var closeLink = $E(LBi.orders.closeLinkSelector, target);
					closeLink.addEvent('click', function(e){
						var e = new Event(e).preventDefault();
						if (window.ie6) {
							orderListing.setStyle('display', 'block');
							target.setStyle('display', 'none');
						} else {
							LBi.orders.toggleVisibility(orderListing, target);
						}
					});
				} else {
					detailLink.addEvent('click', function(e){
						var e = new Event(e).preventDefault();
					});
				}
			});
		}
	},
	toggleVisibility: function(listing, item) {
		if (listing && item) {
			listing.toggleClass(LBi.orders.listHideClass);
			item.toggleClass(LBi.orders.detailShowClass);
		}
	}

}/* /LBi.orders */

LBi.overlay = {
	//
	// Generic overlay building and population
	//	
	
	overlayWrapper		: '#inner',
	overlayID			: 'overlay',
	overlayInnerID		: 'overlayInner',
	overlayContentID	: 'overlayContent',
	overlayHookID		: 'overlayHook',
	overlayCloseID		: 'overlayClose',
	overlayCloseTxt		: 'Close &#187',
	
	get: function(link) {
		// Build and return the overlay framework
		if ($(LBi.overlay.overlayID)) {
			return $(LBi.overlay.overlayID);
		} else {
			var overlay = new Element('div');
			overlay.id = LBi.overlay.overlayID;
			overlay.addClass('content');			
			var overlayInner = new Element('div');
			overlayInner.id = LBi.overlay.overlayInnerID;			
			var overlayContent = new Element('div');
			overlayContent.id = LBi.overlay.overlayContentID;
			overlayContent.injectInside(overlayInner);
			
			// Empty anchor to use as a hook to focus onthe overlay when it's opened
			var overlayHook = new Element('a');
			overlayHook.id = LBi.overlay.overlayHookID;
			overlayHook.injectInside(overlayInner);
			// Close link
			var overlayClose = new Element('a');
			overlayClose.id = LBi.overlay.overlayCloseID;
			overlayClose.href = '#';
			overlayClose.setHTML(LBi.overlay.overlayCloseTxt);
			overlayClose.addEvent('click',function(e){
				var e=new Event(e).preventDefault();
				LBi.overlay.close();
				// Re-focus on trigger link when overlay is closed
				if(link){
					link.focus();
				}
			});
			overlayClose.injectInside(overlayInner);
			
			overlayInner.injectInside(overlay);
			var wrapper = $E(LBi.overlay.overlayWrapper);
			overlay.injectInside(wrapper);
			return overlay;
		}
	},
	populate: function(node,link) {
		// Accepts a DOM node and source link (to re-focus on close and position overlay against)
		if (node && link) {
			var overlay = LBi.overlay.get(link);
			var contentArea = $(LBi.overlay.overlayContentID);
			overlay.setStyle('visbility','hidden');
			contentArea.empty();
			node.injectInside(contentArea);			
			LBi.overlay.position(link);
			overlay.setStyle('visbility','visible');
			LBi.overlay.focusOn();
		}
	},
	position: function(link) {
		if(!$(LBi.overlay.overlayID)) return false
		var overlay = $(LBi.overlay.overlayID)
		var wrapper = $E(LBi.overlay.overlayWrapper);
		if (link) {
			var linkCoords = link.getCoordinates();
			// Set initial position
			overlay.setStyle('top', linkCoords.top + 'px');
			overlay.setStyle('bottom', 'auto');
		}
		// Check it's inside bounds and re-position if necessary
		var overlayCoords = overlay.getCoordinates();
		var wrapperCoords = wrapper.getCoordinates();		
		var wrapperBound = wrapperCoords.height;
		var overlayEdge = overlayCoords.height + overlayCoords.top;
		var boundCheck = wrapperBound - overlayEdge;
		if(boundCheck<1) {
			var hPos = overlay.getStyle('top').toInt() +  boundCheck;
			overlay.setStyle('top',hPos);
		}
	},
	close: function() {
		var overlay = LBi.overlay.get();
		overlay.remove();
	},
	focusOn: function() {
		if($(LBi.overlay.overlayHookID)) {
			$(LBi.overlay.overlayHookID).focus();
		}
	}
	
}/* /LBi.overlay */

LBi.newsFeed = {
	
	curtailedTextAppendage : '...',
	messageNumberCurrentlyShown : null,
	maxMessageNumber : null,
	//Max Character Length Variable to ensure that newsFeed message is never greater than one line (~90 characters).  If it is then
	// the next message in the sequence will be attempted to be shown instead. 
	maxMessageCharacterLength : 95, 
	
	checkMessageLength : function(targetElement) {
		var messageText, messageLinkHTML, messageLinkElement, messageLinkText;
		var message = targetElement.innerHTML.toString();
		//If the news feed message has a link at the end of it
		if(message.toLowerCase().indexOf('</a>') != -1) {
			//If the newsfeed message total length including link is too long chop the message text, add 'curtailedTextAppendage' 
			//and then the newsFeedLink element
			if (targetElement.getText().length > LBi.newsFeed.maxMessageCharacterLength) {
				messageText =  message.substring(0, message.toLowerCase().indexOf('<a'));
				messageLinkHTML =  message.substring(message.toLowerCase().indexOf('<a'));
				messageLinkElement = targetElement.getElement('a');
				messageLinkText =  messageLinkElement.getText();
				messageText = messageText.substring(0, LBi.newsFeed.maxMessageCharacterLength-messageLinkText.length-LBi.newsFeed.curtailedTextAppendage.length);
				messageText = messageText.substring(0, messageText.lastIndexOf(' '))+LBi.newsFeed.curtailedTextAppendage + messageLinkHTML;
				targetElement.setHTML(messageText);
			}
		}
		//If no link case
		else {
			var messageText = message;
			if (targetElement.getText().length > LBi.newsFeed.maxMessageCharacterLength) {
				messageText = messageText.substring(0, LBi.newsFeed.maxMessageCharacterLength-LBi.newsFeed.curtailedTextAppendage.length);
				messageText = messageText.substring(0, messageText.lastIndexOf(' '))+LBi.newsFeed.curtailedTextAppendage;
				targetElement.setHTML(messageText);
			}
		}
	},
	
	incrementNewsFeedMessageMarkup : function(targetElement) {
		if (LBi.newsFeed.messageNumberCurrentlyShown === null) {
			LBi.newsFeed.messageNumberCurrentlyShown = 0;
		}
		else {
			LBi.newsFeed.messageNumberCurrentlyShown++;	
		}
		if (LBi.newsFeed.messageNumberCurrentlyShown > LBi.newsFeed.maxMessageNumber) {
			LBi.newsFeed.messageNumberCurrentlyShown = 0;
		}
		targetElement.setHTML(newsFeedMessages[LBi.newsFeed.messageNumberCurrentlyShown]);
		LBi.newsFeed.checkMessageLength(targetElement);
	},
	
	fadeout : function(targetElement) {
		var fadeOutFx = new Fx.Style(targetElement, 'opacity', {duration: 500});
		fadeOutFx.addEvent('onComplete', function(){
			LBi.newsFeed.incrementNewsFeedMessageMarkup(targetElement);
			LBi.newsFeed.fadein(targetElement);
		});
		fadeOutFx.start(1, 0);
	},	
	
	fadein : function(targetElement) {
		var fadeInFx = new Fx.Style(targetElement, 'opacity', {duration: 500});
		fadeInFx.addEvent('onComplete', function(){
			(function(){LBi.newsFeed.fadeout(targetElement)}).delay(5000);
		});
		fadeInFx.start(0, 1);
		//LBi.newsFeed.incrementNewsFeedMessage();
	},
	
	init : function(newsFeedMessages) {
		if (newsFeedMessages != undefined && $type(newsFeedMessages)&& newsFeedMessages.length > 0) {
			LBi.newsFeed.maxMessageNumber = newsFeedMessages.length-1;
			//Get element to inject newsFeedMessages into
			if ($('newsFeed') && $('newsFeed').getElement('p.newsMessage')) {
				var newsMessageContainer = $('newsFeed').getElement('p.newsMessage');				
			}
			else {
				return false;
			}
			//Make initial message transparent
			newsMessageContainer.setOpacity(0);
			newsMessageContainer.setStyles({
				visiblity: 'visible',
				//backgroundColor must be set to a solid colour in order to prevent jagged looking text in IE
				backgroundColor: '#fff'
			});
			//Set innerHTML to be first newsMessage in array (nb -1 as using an incremantin function) 
			LBi.newsFeed.incrementNewsFeedMessageMarkup(newsMessageContainer);
			//Fade in initial message
			LBi.newsFeed.fadein(newsMessageContainer);
		}
		else {
			return false;
		}
	}

}

LBi.smoothBox = {
	//
	// Recall smoothbox when needed for a specific parent element
	//
	redo: function(wrapper) {
		$ES("a.smoothbox","wrapper").each(function(el){el.onclick=TB_bind});
	}

}/* /LBi.functions */

LBi.gameCordion = {
	//
	// Setup accodion behaviour on gamesRoom Prof. Green games list
	//
	
	accordionSelector		: '.gamesMenu',
	accordionIDPrefix		: 'gameCordion',
	accordionItemSelector	: 'li',
	accordionCurrentClass	: 'current',
	accordionClosedClass	: 'closed',
	accordionOpenClass		: 'open',
	
	init: function() {
		var accordions = $$(LBi.gameCordion.accordionSelector);

		accordions.each(function(accordion,i){
			// Find if has current item and mark position for intial display
			var showIndex = false;
			var hideAll = true;
			var accordionItems = $ES(LBi.gameCordion.accordionItemSelector,accordion);
			accordionItems.each(function(accordionItem,j){
				if (accordionItem.hasClass(LBi.gameCordion.accordionCurrentClass)) {
					showIndex = j;
					hideAll = false;
				}
			});
			
			// Set an id if its doesnt have one to allow accordion to function
			if (!accordion.id) {
				accordion.id = LBi.gameCordion.accordionIDPrefix + i;
			}
			
			// Setup accordion
			var accordion = new Accordion('h3.gameTitle', 'div.gameInfo', {
	        opacity: false,
	        display: showIndex,//false,
			alwaysHide: hideAll,//true,
			onActive: function(toggler, element){
				toggler.getParent().removeClass(LBi.gameCordion.accordionClosedClass);
				toggler.getParent().addClass(LBi.gameCordion.accordionOpenClass);
			},
			onBackground: function(toggler, element){
				toggler.getParent().addClass(LBi.gameCordion.accordionClosedClass);
				toggler.getParent().removeClass(LBi.gameCordion.accordionOpenClass);
			}
			},$(accordion.id));			
		});
	}

}/* /LBi.gameCordion  */

//Other job field
function displayOtherJob(){
		if ($('jobTitle')!= null) {
			var selectElement = $('jobTitle').getElements('select');
		
			jobValue = selectElement[0].selectedIndex + 1;
			jobOptions = selectElement[0].options.length;
			
			if (jobValue == jobOptions) {
				$('otherJob').removeClass('hide');
			}
			else {
				$('otherJob').addClass('hide');
			}
		}	
}

function otherJobValue() {
if ($('jobTitle') != null) {
	$('jobTitle').getElements('select').addEvents({
		'change': function(){
			displayOtherJob();
		}
	});
}
};

//games promo tabs

LBi.gamesPromoTabs = {
init: function(){
	if ($('gamesPromoTabs') != null) {
		var tabsContent = $$('#gamesPromoTabs div.contentInfo');
		var tabsCollection = $$('#gamesPromoTabs ul.tabLinks li');
		var resetLinks = $('gamesPromoTabs').getElements('ul.tabLinks li a')
		//alert(tabsContent.length);
		
		//removes all anchored links from the tabs
		resetLinks.each(function(eachLink, i){
			eachLink.href = "javascript:void(0)";
		})
		
		//hides all tabs content at the start
		tabsContent.each(function(eachContent, i){
			//eachContent.addClass("hide");

			
		})
		
		
		
		//triggers onclick event on the tabs	
		tabsCollection.each(function(tabs, i){
			tabs.addEvent('click', function(){			
				tabsContent.each(function(eachContent, i){
					eachContent.addClass("hide");
					eachContent.removeClass("currentTab");
				})
				
				tabsCollection.each(function(tabs, i){
					tabs.removeClass("current");
				})
				
				var tabsCount = i + 1;
				var currentTab = "tab" + tabsCount;
				$(currentTab).removeClass("hide");
				$(currentTab).addClass("currentTab")
				tabs.addClass("current");
				return false;
			})
		})
	}	
}
}

//Show hide all episodes

function showAll(){
	slidingContent = $E('div#allEpisodes');
	var myVerticalSlide = new Fx.Slide(slidingContent);
	 if ($('allEpisodes') != null) {
		
		 myVerticalSlide.toggle();
		 $('showEp').removeClass('hide');
		 $('hideEp').addClass('hide');
		
		 $('showEp').addEvent('click', function(e){
		 	new Event(e).stop();
		 	myVerticalSlide.toggle();
		 	//e.stop();
		 	$('hideEp').removeClass('hide');
		 	$('showEp').addClass('hide');
		 });
		
		 $('hideEp').addEvent('click', function(e){
			new Event(e).stop();
		 	myVerticalSlide.toggle();
		 	$('hideEp').addClass('hide');
		 	$('showEp').removeClass('hide');
		});

	}
}

/* function for changing the href of the tab */
function changeTabHref() {
	var targetLink= $$('#tabList li a');
	for(var i=0; i<targetLink.length; i++)
	{
		reqHref ="#"+ targetLink[i].getProperty('title');
		targetLink[i].setProperty('href',reqHref);		
	}

}


LBi.functions = {
	//
	// Functions that need to be called before DOM ready etc, mainly down to .Net implementation
	//
	init: function() {
		if (window.newsFeedMessages) {
			LBi.newsFeed.init(newsFeedMessages);
		}
		LBi.forms.init();
		// Setup identJS not for show/hide behaviours but as a hook for ie6 png filters
		LBi.Custom.identJS();
		window.addEvent('domready', LBi.gameCordion.init); // Have to set this up here for IE
	}

}/* /LBi.functions */

LBi.hideDivs = {
	init: function(){
		$$('.viewSampleEntry a').removeClass('hide');
		$$('.hintList').removeClass('hintList');
		$$('.crbInfo').removeClass('clearfix');
		$$('.crbInfo').addClass('hide');
	 }
}

LBi.togglePhotoOptionPanels = {
	init: function(){
		
		
		if ( document.getElementById('expandedPhotoOptions') != null )
		
		{
		
			var mySlideExpandPhotoOptions = new Fx.Slide('expandedPhotoOptions').hide();
			var mySlideExpandMultiplePhotoOptions = new Fx.Slide('expandedMultiplePhotoOptions').hide();
			 
			if( $('expandedPhotoOptions').getProperty('class') == "photoOptionsError" ){
				mySlideExpandPhotoOptions.slideIn();
				$('photoUploadIntro').style.display = "none";
			}
			 
			$('expandPhotoOptions').addEvent('click', function(e){
				e = new Event(e);
				mySlideExpandPhotoOptions.slideIn();
				e.stop();
				$('photoUploadIntro').style.display = "none";
			});
			
			$('expandMultiplePhotoOptions').addEvent('click', function(e){
				$('expandedPhotoOptions').getParent().setStyles({overflow: 'visible', height: 'auto'});
				e = new Event(e);
				mySlideExpandMultiplePhotoOptions.slideIn();
				e.stop();
				$('expandMultiplePhotoOptions').style.display = "none";
			});
			
			$('contractPhotoOptions').addEvent('click', function(e){
				$('expandedPhotoOptions').getParent().setStyles({overflow: 'hidden'});
				e = new Event(e);
				mySlideExpandMultiplePhotoOptions.slideOut();
				mySlideExpandPhotoOptions.slideOut();
				e.stop();
				$('photoUploadIntro').style.display = "block";
				$('expandMultiplePhotoOptions').style.display = "block";
			});
			
		}
		
		
		
	 }
}
LBi.textLength = {
	init: function(){
			if ($$('.yourMsg').length >0){
		var textFiels=$$('.yourMsg');	
		var length=50;
		textFiels[0].addEvent('keypress', function(e){
			if (this.value.length > length) {
					this.value = this.value.substr(0,length);
			}
			});
		
		textFiels[0].addEvent('blur', function(e){	
			if (this.value.length > length) {
					this.value = this.value.substr(0,length);
			}
			});
	 }
	}
}

LBi.toggleSomeoneElsePanel = {
	init: function() {
		if (!$E('div.applyNow') || !$E('input.another') || !$E('input.me')) {
			return;
		}
		
		if($E('input.another').getProperty('checked')) {
			$E('div.someoneElse').setStyle('display', 'block');
		}
		
		$E('.another').addEvent('click', function() {
			$E('div.someoneElse').setStyle('display', 'block');
		});
		$E('.me').addEvent('click', function() {
			$E('div.someoneElse').setStyle('display', 'none');
		});
	}
};




// SETUP EVENTS HERE
window.addEvent('domready', LBi.navigation.setupNav);
window.addEvent('domready', LBi.tabs.init);
window.addEvent('domready', LBi.quickFinder.init);
window.addEvent('domready', LBi.explanations.init);
window.addEvent('domready', LBi.accordion.init);
window.addEvent('domready', LBi.sideTabs.doSideTabs);
window.addEvent('domready', LBi.products.init);
window.addEvent('domready', LBi.orders.init);
window.addEvent('domready', LBi.pageExtracts.setupIE6Rollovers);
window.addEvent('domready', LBi.Custom.getNewWindowLinks);
window.addEvent('load', LBi.leafOmeter.init);
window.addEvent('load', LBi.rotator.init);
window.addEvent('load', LBi.gameCordion.init);
window.addEvent('domready', displayOtherJob);
window.addEvent('domready', otherJobValue);
window.addEvent('load', LBi.gamesPromoTabs.init);
window.addEvent('domready', showAll);
window.addEvent('domready', changeTabHref);
window.addEvent('domready', LBi.hideDivs.init);
window.addEvent('domready', LBi.togglePhotoOptionPanels.init);
window.addEvent('domready', LBi.toggleSomeoneElsePanel.init);
