


//	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;
        }
        
//        This funciton shows the next button when you select a school.        
//        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')
                                                       

                                                                                        //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);
