/*
 * Living Greener - JavaScript
 */

// Global vars
var globalUrls = {
    story_template:         'http://' + window.location.hostname + '/real-stories/template/story-template/_nocache',
    gallery:                'http://' + window.location.hostname + '/real-stories/template/story-gallery/_nocache',
    take_action:            'http://' + window.location.hostname + '/take-action'            
};

/* Shows a pre-styled overlay */
function showLoadingOverlay(message)
{
    if (!$('#overlay').length) {
        $('body').prepend('<div id="overlay"></div>');
    }// End if
    
    $('#overlay').html('<div class="loading">' + message + '</div>');
    $('#overlay').show();
}

/* Hides the overlay by removing it from the DOM */
function hideLoadingOverlay()
{
    $('#overlay').remove();
}

/**
 * Converts text data into usable html
 */
function convertTextToHTML(text)
{
    // Convert new lines into breaks
    text = text.replace(/</g,'&lt;');
    text = text.replace(/>/g,'&gt;');
    var html = text.replace(/\n/g,'<br />');
    return html;
}

function createButton(id,text)
{
    var buttonHTML = '<div id="' + id + '" class="search-input"><span class="search-br"><span class="search-tr"><span class="search-bl"><span class="search-tl">' +
        '<input type="button" id="' + id + '-button" class="" value="' + text + '" name="' + id + '-button">' +
        '</span></span></span></span></div>';
    return buttonHTML;
}// End createButton

/** 
 * Homepage Banner slide show controls
 */
var BannerSlideShow = function($nav)
{
    this.$nav = $nav;
};

BannerSlideShow.prototype = {
    interval: null,
    
    play: function(delay)
    {
        var self = this;
        self.interval = setInterval(function(){
            self.next.call(self);
        },delay);
        $last = self.$nav.find('li:last');
        $last.removeClass('play').addClass('pause').find('a').text('Pause');
    },
    
    pause: function()
    {
        clearInterval(this.interval);
        this.interval = null;
        $last = this.$nav.find('li:last');
        $last.addClass('play').removeClass('pause').find('a').text('Play');
    },
    
    next: function()
    {
        $current = this.$nav.find('.current');
        $next = $current.next('li').find('a');
        if ($next.parent().is('.play,.pause')) {
            $next = this.$nav.find('li:first a');
        }// End if
        $next.trigger('click');
    }
};
 
(function ($)
{
    $(document).ready(function ()
    {
        processPrintButton();
        processMenu();
        processSectionHeader();
        processRebateMap();
        processHomeBanner();
        collapsibleContent();
        processDidYouKnow();
        processActionTable();
        otherActions();
        processRebatesSearchPage();
        processRebatePage();
        processCategoryIcons();
        processGlossaryPage();
        processContactPage();
        processEmailFriend();
        processActionPage();
        processRealStoriesContributeForm();
        processRealStoriesList();
        processRealStoryPage();
        processRealStoriesSubmissionPage();
        processSearchResults();
        processTakeActionPage();
        processTakeActionSearchHomePage();
    });
    
    $.validator.setDefaults({   
        errorElement: "em",
        errorPlacement: function(error, element) {
            error.insertAfter(element);
        },
        invalidHandler: function(form,validator){
            var errors = validator.numberOfInvalids();
            if (errors) {
                $('div.errors').html('<ul><li>Some required information is missing, the fields have been highlighted.</li></ul>').show();
            }
        },
        submitHandler: function(form){
            if ($(form).valid()){
                form.submit();
            }
        }
    });
    
    // URL params solution posted on: http://stackoverflow.com/questions/901115/get-querystring-with-jquery
    $.urlParam = function(name)
    {
        var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
        if (!results) { return 0; }
        return results[1] || 0;
    };
    
    function processSearchResults()
    {
        if (!$('#search-results').length){
            return false;
        }// End if
        
        var numberPerPage = $.urlParam('results_per_page')*1;
        
        if (numberPerPage !== 0) {
            // Setup default selection
            $('#results_per_page_select_bottom,#results_per_page_select_top').find('option[value="' + numberPerPage + '"]').attr('selected',true);
        }// End if
        
        $('#results_per_page_select_bottom,#results_per_page_select_top').bind('change',function(){
            var newUrl = '';
            var newVal = $(this).find('option:selected').val();
            if (numberPerPage !== 0) {
                // There is already a value used, replace it
                newUrl = window.location.href.replace('results_per_page=' + numberPerPage,'results_per_page=' + newVal);
            } else {
                newUrl = window.location.href + 'results_per_page=' + newVal;
            }// End if
            window.location = newUrl;
        });
    }
    
    function processPrintButton()
    {
        // Print icon functionality
        $('#print-page').click(function(e){
            e.preventDefault();
            window.print();
        });
        // Only enabled in some circumstances
        $('#print-page').hide();
    }
    
    function processRealStoriesSubmissionPage()
    {
        if (!$('#story-submission').length) {
            return false;
        }// End if
        
        showLoadingOverlay('Completing your submission...');
        window.api_key = '7699889215';
    }
    
    // Real story page content (with comments list)
    function processRealStoryPage()
    {
        var $originalForm = $('#add-comment');
        if (!$originalForm.length) {
            return false;
        }// End if
        
        // Create new HTML for the comment form
        $('#comments-list').after('<div id="add-comment-form" class="custom-form"></div>');
        $('#add-comment-form').append($originalForm.parent());
                
        // Hide the original form inputs
        $originalForm.addClass('screenHide');
        
        // Add each question
        var $email = $originalForm.find('input[type="text"]').filter(function(){
           return ($(this).attr('id').indexOf('_value') !== -1);
        });
        var $name = $originalForm.find('input[id="comment_0_name"]');
        var $comment = $originalForm.find('textarea');
        
        $('#add-comment-form').find('form')
            .append($originalForm.find('.required'))
            .append('<div class="form-section"></div')
            .append($('#comment-submission'));
            
        var $submit = $('#sq_commit_button');                                                          
        $submit.attr('value','submit');
        $('#comment-submission .search-tl').append($submit);
        // Button markup hidden by default (not relevant when js is disabled)
        $('#comment-submission .search-input').removeClass('screenHide');
        
        var $formSection = $('#add-comment-form').find('.form-section');
        
        $('<div class="question"></div>')
            .append('<label for="' + $name.attr('name') + '" class="required">Your name</label>')
            .append($name)
            .appendTo($formSection);
            
        $('<div class="question"></div>')
            .append('<label for="' + $email.attr('name') + '" class="required">Email address</label>')
            .append($email)
            .appendTo($formSection);

        $email.attr('disabled',false);
        $('input[id^="metadata"]:checked').remove(); // The input for disabled shouldn't be there
        
        $('<div class="question"></div>')
            .append('<label for="' + $comment.attr('name') + '" class="required">Comments</label>')
            .append($comment)
            .appendTo($formSection);
            
        // Process the in-page image gallery
        loadGallery('story-gallery');
    }
    
    function loadGallery(id)
    {
        var $galleryDiv = $('#' + id);
        
        if (!$galleryDiv.length) {
            return false;
        }// End if
        
        $('a',$galleryDiv).attr('href','#');
        
        $('a',$galleryDiv).bind('click',function(e){
            e.preventDefault();
            showLoadingOverlay('Loading the gallery');
            
            // URL for real story template has to be hardcoded to pickup design and layouts
            $.ajax({
                url:    globalUrls.gallery + '?root_node=' + $galleryDiv.find('.currentAssetId').text(),
                method: 'GET',
                success: function(data){
                    $('#overlay').html(data);
                    if ($(data).text().toLowerCase().indexOf('no results') !== -1) {
                        alert('error');
                        hideLoadingOverlay();
                    }// End if
                    
                    var $gallery = $('#gallery');
                    
                    // Close function
                    $('#overlay .close').click(function(e){
                       e.preventDefault();
                       $(document).unbind('keydown');
                       hideLoadingOverlay();
                    });
                    
                    var $images = $gallery.find('.image');
                    var $next   = $gallery.find('.next');
                    var $prev   = $gallery.find('.previous');
                    var total  = $images.length;

                    // Show the first image
                    $images.eq(0).removeClass('screenHide');
                    
                    // Navigation
                    if (total > 1) {
                        $next.removeClass('screenHide');
                    }// End if
                    
                    $gallery.find('.controls .total').text(total);
                    
                    function updateState($currentImage)
                    {
                        // Next/Previous buttons
                        $next.removeClass('screenHide');
                        $prev.removeClass('screenHide');
                        
                        var currentImageNumber = $currentImage.index() + 1;
                        
                        if (currentImageNumber*1 >= total*1) {
                            $next.addClass('screenHide');
                        } else if (currentImageNumber*1 === 1) {
                            $prev.addClass('screenHide');
                        }// End if
                        
                        $gallery.find('.controls .current').text(currentImageNumber);
                        
                        // Captions
                        var caption = $currentImage.find('.caption').text();
                        $gallery.find('.controls .caption').text(caption);
                        
                        if ($images.length <= 1) {
                            $prev.addClass('screenHide');
                        }// End if
                        
                        // Element width (Required for IE centering)
                        $gallery.css('width',
                            $currentImage.find('img').attr('width') + 'px');
                    }
                    
                    updateState($images.eq(0));
                    
                    $next.find('a').click(function(e){
                        e.preventDefault();
                        var $nextImage = $images.not('.screenHide').addClass('screenHide').next();
                        $nextImage.removeClass('screenHide');
                        updateState($nextImage);
                    });
                    
                    $prev.find('a').click(function(e){
                        e.preventDefault();
                        var $prevImage = $images.not('.screenHide').addClass('screenHide').prev();
                        $prevImage.removeClass('screenHide');
                        updateState($prevImage);
                    });

                    $(document).keydown(function(e){
                        // "N"
                        if (e.keyCode === 78) {
                            if (!$next.hasClass('screenHide')) {
                                $next.find('a').trigger('click');
                            }// End if
                        }// End if
                        
                        // "P"
                        if (e.keyCode === 80){
                            if (!$prev.hasClass('screenHide')) {
                                $prev.find('a').trigger('click');
                            }// End if
                        }// End if
                        
                        // "ESC"
                        if (e.keyCode === 27){
                            $('#overlay .close').trigger('click');
                        }// End if
                    });

            }});
        });
    }
    
    function processRebatePage()
    {
        if (!$('#content-inner.rebate-content').length){
            return false;
        }// End if
        
        // Built the tab menu
        var $ul = $('<ul id="action-menu"></ul>');
        $ul.append('<li class="current"><a href="#">Details</a></li>');
        $ul.append('<li><a href="#">Take action</a></li>');
        $ul.prependTo('#body-text');
        
        $('#print-page').show();
        
        // Hide rebates by default
        $('#related-actions').hide();
        
        // Details link
        $ul.find('a:first').click(function(e){
            e.preventDefault();
            $('#related-actions').hide();
            $('#rebate').show();
            $ul.find('a:last').parent().removeClass('current');
            $(this).parent().addClass('current');
        });
        
        // Actions link
        $ul.find('a:last').click(function(e){
            e.preventDefault();
            $('#rebate').hide();
            $('#related-actions').show();
            $ul.find('a:first').parent().removeClass('current');
            $(this).parent().addClass('current');
        });
    }
    
    function processRealStoriesList()
    {
        if (!$('#story-results').length) {
            return false;
        }// End if
        
        var storyCount = $('#story-results .result').length;
        $('#real-story-title').html(storyCount + ' ' + ((storyCount > 1) ? 'Real stories' : 'Real story'));
        
        var locationRegExp = /related_nodes\=([^&]+)/;
        if (locationRegExp.test(window.location.href)){
            
            // Deselect defaults
            $('#category-inputs input').each(function(){
               $(this).attr('checked',false);
            });
            
            var match = locationRegExp.exec(window.location.href);
            var categories = match[1].split(',');
            for (var i = 0, l = categories.length; i<l; i++) {
                if ($('#category-inputs input[value="' + categories[i] + '"]').length){
                    $('#category-inputs input[value="' + categories[i] + '"]').attr('checked',true);
                }// End if
            }// End for
            
            if (window.location.href.indexOf('page_related_asset_listing_16244_sort_by=1') !== -1) {
                $('#sort-by-title').attr('checked',true);
            }// End if
        }// End if
        
        $('#story-filter-button').click(function(e){
            e.preventDefault();
            
            var checkBoxValues = (function(){
                var retArr = [];
                $('#category-inputs input:checked').each(function(){
                    retArr.push($(this).val());
                });
                return retArr.join(',');
            })();
            
            var currentUrl = window.location.href.split('?')[0];
            
            var newUrl = currentUrl + '?related_nodes=' + checkBoxValues;
            
            if ($('#sort-by-date').is(':checked')) {
                newUrl += '&page_related_asset_listing_16244_sort_by=4&page_related_asset_listing_16244_sort_direction=1';
            } else {
                newUrl += '&page_related_asset_listing_16244_sort_by=1&page_related_asset_listing_16244_sort_direction=0';
            }// End if
            
            window.location = newUrl + '&page_related_asset_listing_16244_submit_button=Submit';
        });
    }
    
    function processRealStoriesContributeForm()
    {
        window.api_key = '7699889215';
        
        function getFieldValue(questionNumber,attributeData) {
            var fieldName = "8878:q" + questionNumber;
            if (typeof(attributeData[fieldName].answer) !== "undefined") {
                return attributeData[fieldName].answer;
            }// End if
            return '';
        }// End getFieldValue()
        
        if ($('#form-thank-you').length){
            showLoadingOverlay('Completing your submission, please wait...');
            // The form has been submitted and requires additional processing
            var submissionId = $('#form-submission-id').text();

            getAttributes(submissionId,function(data){
                if (typeof(data.error) === "undefined"){

                    var attr = data.attributes.answers;
                    
                    var name = getFieldValue(1,attr);
                    
                    // Gather form submission as metadata
                    var metadata = {
                        8910:       getFieldValue(2,attr), // Submitters first name
                        62207:      getFieldValue(30,attr), // Submitters Surname
                        8911:       getFieldValue(3,attr), // City
                        8912:       getFieldValue(4,attr), // State
                        8913:       getFieldValue(5,attr), // Email
                        8914:       convertTextToHTML(getFieldValue(6,attr)), // Quote
                        8915:       convertTextToHTML(getFieldValue(7,attr)), // About
                        8916:       convertTextToHTML(getFieldValue(8,attr)), // Story
                        8917:       convertTextToHTML(getFieldValue(9,attr)), // Recommendations
                        8918:       getFieldValue(11,attr) // Category (Other)
                        // Flickr and youtube urls not implemented
                        // 8919:    getFieldValue(19,attr) // Flickr
                        // 8920:    getFieldValue(20,attr) // Youtube
                    };
                    
                    var fileNames = {};
                    for (var i = 12, pos = 1, max = 16; i <= max; i ++, pos ++) {
                        fileNames[getFieldValue(i,attr)] = pos;
                    }// End for
                    
                    // Category selection
                    
                    var selected = getFieldValue(10,attr);
                    $.each(selected,function(index,val){
                        selected[index] = (function(number){
                            var strings = {
                                0:  "Energy",
                                1:  "Water",
                                2:  "Waste",
                                3:  "Travel"
                            };
                            return strings[number];
                        })(val);
                    });
                    var categoryText = selected.join('; ');
                    metadata[8342] = categoryText;
                    
                    // Series of callbacks to create the new asset, publish metadata and
                    // move any associated files to the associate them with the new asset
                    var unpublishedFolderId = 8903;
                    var tempImageFolderId   = 8881;
                    getChildren(tempImageFolderId,1,function(images){
                        
                        createAsset(unpublishedFolderId,
                                    'page_standard',
                                    name,
                                    '1',
                                    '',
                                    '-1',
                                    '0',
                                    '0',
                                    '',
                                    '',
                            function(createSet){
                                
                                setMetadataAllFields(createSet.id,metadata,function(metadataSet){
                                    // Get a list of image id's that need to be put into the correct location
                                    var imagesToMove = [];
                                    for (var assetid in images) {
                                        if (typeof(fileNames[images[assetid].name]) !== "undefined") {
                                            imagesToMove.push(assetid);
                                        }// End if
                                    }
                                    
                                    function nextImage() {
                                        if (imagesToMove.length >= 1) {
                                            var next = imagesToMove.pop();
                                            moveLink(tempImageFolderId,next,createSet.id,1,-1,nextImage);
                                        } else {
                                            getGeneral(createSet.id,function(data){
                                                if (data.hasOwnProperty('web_path')) {
                                                    // Removes public permissions
                                                    $.get(data.web_path + '?unapply=yes', function(data) {
                                                        hideLoadingOverlay();
                                                    });
                                                } else {
                                                    hideLoadingOverlay();
                                                }// End if
                                            });
                                        }// End if
                                    }// End nextImage
                                    
                                    // Start the moving image process off
                                    nextImage();
                                });
                        });
                    });
                    
                } else {
                    alert("There was an error processing the remainder of this form submission: " + data.error);
                }// End if
            });
        }// End if
        
        if (!$('#contribute-content').length) {
            return false;
        }// End if
        
        jQuery('#contribute-content .image').not(':first').addClass('screenHide');
        
        // Process the add image button to show a new input (up to 5) each
        // time the button is clicked, then removed the button once max is shown
        $('a#add-image').attr('href','javascript: void(0)'); // Not sure why prevent default isn't working, add a safety catch
        $('a#add-image').click(function(e){
            e.preventDefault();
            
            var $hiddenInputs = $('#contribute-content .image').filter(function(){
                    return $(this).hasClass('screenHide');
            });
            
            if ($hiddenInputs.length >= 1) {
                $hiddenInputs.eq(0).removeClass('screenHide');
                var recountHidden = $('#contribute-content .image').filter(function(){
                    return $(this).hasClass('screenHide');
                }).length;
                if (recountHidden === 0) {
                    $('#add-image').addClass('screenHide');
                }// End if
            }// End if
        });
        
        // Add the preview button. This option is only accessible with javascript
        // enabled for users.
        var $previewButton = $(createButton('preview','Preview'));
        $('#story-submit').after($previewButton).addClass('screenHide');
        
        // URL for real story template has to be hardcoded to pickup design and layouts
        $.ajax({
            url:    globalUrls.story_template,
            method: 'GET',
            success: function(data){
                // Store the return data in a global var
                document.storyTemplate = data;
                
                // Bind the events to the preview button
                $('#preview-button').click(function(){
                    // "Submit" the form to trigger validation
                    $('#body-text form').submit();
                });
        }});
        
        var extensionError = "Please select an image with a valid extension (.jpg,.jpeg or .gif)";
        var captionError   = "Please enter some text to describe your image";
        
        $('#body-text form').validate({
                rules: {
                "q8878:q1": {
                    required: true
                },
                "q8878:q2":  {
                    required: true
                },
                "q8878:q3": {
                    required: true
                },
                "q8878:q5": {
                    required: true,
                    email: true
                },
                "q8878:q6": {
                    required: true
                },
                "q8878:q7": {
                    required: true
                },
                "q8878:q8": {
                    required: true
                },
                "q8878:q9": {
                    required: true
                },
                "q8878:q12": {
                    accept: 'jpg,jpeg,gif'
                },
                "q8878:q21": {
                    required: {
                        depends: function(element){
                            return $('#q8878_q12').val() !== "";
                        }
                    }
                },
                "q8878:q13": {
                    accept: 'jpg,jpeg,gif'
                },
                "q8878:q22": {
                    required: {
                        depends: function(element){
                            return $('#q8878_q13').val() !== "";
                        }
                    }
                },
                "q8878:q14": {
                    accept: 'jpg,jpeg,gif'
                },
                "q8878:q23": {
                    required: {
                        depends: function(element){
                            return $('#q8878_q14').val() !== "";
                        }
                    }
                },
                "q8878:q15": {
                    accept: 'jpg,jpeg,gif'
                },
                "q8878:q24": {
                    required: {
                        depends: function(element){
                            return $('#q8878_q15').val() !== "";
                        }
                    }
                },
                "q8878:q16": {
                    accept: 'jpg,jpeg,gif'
                },
                "q8878:q25": {
                    required: {
                        depends: function(element){
                            return $('#q8878_q16').val() !== "";
                        }
                    }
                },
                "term": {
                    required: true
                }
            },
            messages: {
                "q8878:q12": extensionError,
                "q8878:q13": extensionError,
                "q8878:q14": extensionError,
                "q8878:q15": extensionError,
                "q8878:q16": extensionError,
                "q8878:q21": captionError,
                "q8878:q22": captionError,
                "q8878:q23": captionError,
                "q8878:q24": captionError,
                "q8878:q25": captionError,
                "term":      "You must agree to the terms of use"
            },
            submitHandler: function(form) {
                if ($(form).valid()){
                    $('#story-content').remove(); // Remove any previous previews
                    $('#content-inner').prepend('<div id="story-content"></div>');
                    
                    // Construct the preview from user entered data
                    var $preview = $($(document.storyTemplate).find('#body-text').html());
                    $preview.find('h2').html($('#q8878_q1').val());
                    $preview.find('#story-quote-content').html($('#q8878_q6').val());
                    $preview.find('#story-author-name').html($('#q8878_q2').val() + " " + $('#q8878_q30').val());
                    $preview.find('.story-title-author-name').html($('#q8878_q2').val());
                    $preview.find('#story-author-city').html($('#q8878_q3').val());
                    $preview.find('#story-author-state').html($('#q8878_q4').val());
                    var today = new Date();
                    $preview.find('#story-author-date').html(today.getDate() + ' ' + (today.getMonth()+1) + ' ' + today.getFullYear());
                    $preview.find('#story-about').html(convertTextToHTML($('#q8878_q7').val()));
                    $preview.find('#story-content').html(convertTextToHTML($('#q8878_q8').val()));
                    $preview.find('#story-recommentation-content').html(convertTextToHTML($('#q8878_q9').val()));
                    $preview.find('.category-icon').html(function(){
                        var html = '';
                        $('input[id^=q8878_q10]:checked').each(function(){
                            var category = $(this).next().text().toLowerCase();
                            html += '<span class="' + category + '">' + category + '</span>'; 
                        });
                        return html;
                    });
                    
                    $('#body-text').addClass('screenHide');
                    $('#story-content').append($preview);
                    $('#story-submit-holder').append(createButton('submit','Submit'));
                    
                    // Extra content that appears, but doesn't get included with
                    // the template
                    $('#story-content').prepend('<div class="green-bg-br"><div class="green-bg-tr"><div class="green-bg-bl"><div class="green-bg-tl">Preview</div></div></div></div>');
                    $('#story-content').prepend('<h2>Share your story</h2>');
                    
                    $('#edit-button').click(function(e){
                        e.preventDefault();
                        $('#story-content').remove();
                        $('#body-text').removeClass('screenHide');
                    });
                    
                    // Make sure the sample gallery isn't clickable
                    $('#story-gallery').find('a').click(function(e){
                        e.preventDefault();
                    });
                    
                    $('#submit-button').click(function(){
                        showLoadingOverlay('Submitting your real story, please wait...');
                        $(form).append('<input type="hidden" id="form_email_8878_submit2" class="sq-form-field" value="Submit" name="form_email_8878_submit">');
                        form.submit();
                    });
                    
                    // Move some content around the page
                    // Moves the submit and edit buttons to the top of the page before the preview area
                    $('#story-content').find('h2:first').after($('#preview-confirm')).after($('#story-recommentation-content').next('div'));
                    
                }// End if
            }
        });
    }
    
    // Process pages with step by step actions
    function processActionPage()
    {
        // Conditional display of the rebates
        if ($('#related-rebates').length && !$('#content-inner .action').length) {     
           $('#related-rebates').remove();
        }// End if
        
        if (!$('#content-inner .action').length){
            return false;
        }// End if
        
        $('#print-page').show();
        
        // Add the step numbers and html to the heading levels for action pages
        var count = 1;
        $('#content-inner .action h2').each(function(){
            var text = $(this).text();
            $(this).html('<span class="number">' + count + '.</span><span class="step">' + text + '</span>');
            count ++;
        });
        

        // Built the tab menu
        var $ul = $('<ul id="action-menu"></ul>');
        
        if ($('#related-rebates .result').length) {
            // Remove the heading (not necessary with tabs)
            $('#related-rebates').find('h2').remove();
            
            $ul.append('<li class="current"><a href="#">Details</a></li>');
            $ul.append('<li><a href="#">Rebates &amp; assistance</a></li>');
        }
        $ul.prependTo('#body-text');
        
        // Hide rebates by default
        $('#related-rebates').hide();
        
        // Details link
        $ul.find('a:first').click(function(e){
            e.preventDefault();
            $('#body-text div.action').show();
            $('#related-rebates').hide();
            $ul.find('a:last').parent().removeClass('current');
            $(this).parent().addClass('current');
        });
        
        // Rebates link
        $ul.find('a:last').click(function(e){
            e.preventDefault();
            $('#body-text div.action').hide();
            $('#related-rebates').show();
            $ul.find('a:first').parent().removeClass('current');
            $(this).parent().addClass('current');
        });

    }
    
    function processEmailFriend()
    {
        if (!$('#email-a-friend').length){
            return false;
        }// End if
        
        // Bind event for the stay connected area
        var $overlay = $('#email-a-friend');
        $('#stay-connected .email-to-friend').click(function(e){
            e.preventDefault();
            $overlay.show();
            $('#email-a-friend-feedback').remove();
            $('#email-a-friend-form .original-form').show();
        });
        
        $('#email-a-friend-form .close').click(function(e){
            e.preventDefault();
            $overlay.hide();
        });
        
        var $form = $('#email-a-friend-form').parent();
        $form.submit(function(){
           return false;
        });
        $form.validate({
            rules: {
                "q8776:q1": {
                    required: true
                },
                "q8776:q2":  {
                    required: true
                },
                "q8776:q3": {
                    required: true,
                    email: true
                },
                "q8776:q4": {
                    required: true,
                    email: true
                }
            },
            messages: {
                "q8776:q1": "Please enter your friends name",
                "q8776:q2": "Please enter your name",
                "q8776:q3": {
                    required: "Please enter your friend's email address",
                    email: "Please enter a valid email address"
                },
                "q8776:q4": {
                    required: "Please enter your email address",
                    email: "please enter a valid email address"
                }
            },
            submitHandler: function(form) {
                if ($(form).valid()){
                    var serialised = $form.serialize();
                    var url = $('#email-a-friend-form-url').attr('href');
                    $('#email-a-friend-form .original-form').hide();
                    
                    // Add some temporary output to show while ajax is processing
                    // and for feedback
                    $('#email-a-friend-form').append('<div id="email-a-friend-feedback" class="loading"><h2>Please wait...</h2><p>Sending your message.</p></div>');
                    
                    $.ajax({
                        url:        url,
                        type:       "POST",
                        data:       serialised,
                        success:    function(data){
                            var $data = $(data);
                            if ($data.find('#success').length) {
                                $('#email-a-friend-feedback').removeClass('loading').html('<h2>Success</h2><p>Your message has been sent</p>');
                            } else {
                                $('#email-a-friend-feedback').removeClass('loading').html('<h2>Error</h2><p>There was an error sending your message.</p>');
                            }// End if
                        }
                    });
                }// End if
            }
        });
    }
    
    function processContactPage()
    {
        if (!$('#contact-content').length) {
            return false;
        }// End if
        
        var $contactForm = $('#contact-content');
        
        // Hide show groups
        $('#preferred-contact-method input').click(function(){
            var selection = $(this).val();
            $('.contact-group',$contactForm).hide();
            switch(selection){
            case '0':
                $('#contact-group-email').show();
                break;
            case '1':
                $('#contact-group-phone').show();
                break;
            case '2':
                $('#contact-group-mail').show();
                break;
            }
        });
        // Default show
        $('#preferred-contact-method input:checked').trigger('click');
         
        // The state select 'other' option
        $('#other-location').hide();
        $('#q7934_q11').bind('change',function(){
            if ($(this).val() === "Other") {
                $('#other-location').show();
            } else {
                $('#other-location').hide();
            }// End if
        });
         
             
        $('#form_email_7934').validate({
            rules: {
                "q7934:q1": {
                    required: true
                },
                "q7934:q6": {
                    email: true,
                    required: {
                        depends: function(element) {
                            return ($('#preferred-contact-method input:checked').val() === '0');
                        }
                    }
                }
            },
            messages: {
                "q7934:q1": {
                    required: "You must enter feedback or a question"
                },
                "q7934:q6": {
                    required: "You must enter an email address",
                    email: "The email address you entered is not valid"
                }
            }
         });
    }
    
    function processGlossaryPage()
    {
        if (!$('#glossary-content').length){
            return false;
        }// End if
        
        var count       = $('#glossary-content .terms h2').length;

        // If there is only one heading level in here then we know that there
        // the user is viewing one heading level
        if (count === 1 || $.urlParam('letter') !== 0) {
            var firstLetter = (count !== 0) ? $('#glossary-content .terms h2:first').text() : $.urlParam('letter');
            // Highlight the navigation item as active in the glossary navigation
            $('#glossary-content .glossary-navigation a:contains(' + firstLetter + ')').parent().addClass('active');
        }// End if
        
    }
    
    function processCategoryIcons()
    {
        // Add category icons
        $('.category').each(function(){
            var categories = $(this).text().split('; ');
            var $span = $('span',this);
            $span.addClass('category-icon').empty();
            for (var i = 0, l = categories.length; i<l; i++) {
                $span.append('<span class="' + categories[i].toLowerCase() + '">' + categories[i] + '</span>');
            }
        });
    }
    
    function preloadImage(src)
    {
        var image = new Image();
        image.src = src;
    }
    
    function processDidYouKnow()
    {
        $('#banner #did-you-know li').ellipses({maxchars: 120});
    }
    
    function processRebatesSearchPage()
    {
        if (!$('#banner .rebates').length) {
            return false;
        }// End if
        
        var $rebatesDiv = $('#rebates-assistance');
        
        // Hide out the original search inputs
        // These will still be submitted, but the interface for selecting
        // the results is improved through this js
        var $demographicInputsDiv = $('#demo-inputs');
        
        $demographicInputsDiv.before(
                '<div id="programs-area" class="screenHide">' +
                    '<div class="radio-option">' +
                        '<input name="programs-input" id="programs-inputs-home" value="Home" type="radio" checked />' +
                        '<label for="programs-inputs-home">Home</label>' +
                    '</div>' +
                '</div>');

        // Iterate each input and display only the ones we are interested in, hide the rest
        $demographicInputsDiv.append('<strong>I\'m a:</strong>');
        $demographicInputsDiv.find('input').each(function(){
            var $input = $(this);
            var $label = $input.next();
            if ($input.attr('id') !== 'queries_demographic_query_posted') {
                $label.html($label.text().replace(/s$/,''));
                if ($input.val() !== "Businesses" && $input.val() !== "Schools") {
                    $('<div class="radio-option"></div>').append($input).append($label).appendTo($demographicInputsDiv);
                } else {
                    $('<div class="radio-option screenHide"></div>').append($input).append($label).appendTo($demographicInputsDiv);
                }// End if
            } else {
                $(this).appendTo($demographicInputsDiv);
            }
        });
        
        // Get rid of the table output via matrix keyword
        $demographicInputsDiv.find('table').remove();
        
        // Iterate the inputs and pop it into new markup
        var $ownRentInputsDiv = $('#own-rent-inputs');
        $ownRentInputsDiv.append('<strong>I own or rent a:</strong>');
        $ownRentInputsDiv.find('input').each(function(){
            var $input = $(this);
            var $label = $input.next();
            $('<div class="radio-option"></div>').append($input).append($label).appendTo($ownRentInputsDiv);
        });
        
        // Get rid of the table output via matrix keyword
        $ownRentInputsDiv.find('table').remove();
        
        // Add some events to drive the selection process
        var $programsArea = $('#programs-area');
        $('#programs-inputs').val("Home"); // Pre-fill hidden field
        $programsArea.find('input').click(function(){
            if ($(this).val() === "Home") {
                $ownRentInputsDiv.removeClass('screenHide');
                $demographicInputsDiv.removeClass('screenHide');
            } else {
                // Filter out the other checkboxes from being shown and
                // uncheck all the options
                $ownRentInputsDiv.addClass('screenHide').find('input').each(function(){
                    $(this).attr('checked',false);
                });
                $demographicInputsDiv.addClass('screenHide').find('input').each(function(){
                    $(this).attr('checked',false);
                });
                switch($(this).val()) {
                    case 'Business':
                        $('#queries_demographic_query_Businesses').attr('checked',true);
                        break;
                    case 'School':
                        $('#queries_demographic_query_Schools').attr('checked',true);
                        break;
                }
            }
        });
        
        // Fix up the category display
        var $categoryInputDiv = $('#category-inputs');
        $categoryInputDiv.find('input').each(function(){
            var $input = $(this);
            if ($input.attr('id') !== "queries_category_query_posted") {
                $label = $input.next();
                switch ($label.text()) {
                    case 'Energy':
                        $label.text('Saving energy');
                        break;
                    case 'Water':
                        $label.text('Saving water');
                        break;
                    case 'Waste':
                        $label.text('Reducing waste');
                        break;
                    case 'Travel':
                        $label.text('Smarter travel');
                        break;
                }
                $('<div class="radio-option"><div class="rebate-category-icon ' + $input.val().toLowerCase() + '">' + $input.val().toLowerCase() + '</div></div>')
                    .prepend($label).prepend($input).appendTo($categoryInputDiv);
            } else {
                $categoryInputDiv.append($input);
            }// End if
        });
        
        $categoryInputDiv.find('table').remove();
        
        // Process query string parameters for autoselection of area
        var queryMatches = $.urlParam('query');
        if (queryMatches !== 0) {
            $('#programs-inputs-' + queryMatches).trigger('click');
        }// End if
        
        // Process query string parameters for state
        $('input#queries_state_query').remove();
        var state = $.urlParam('queries_state_query');
        if (state !== 0) {
            $('#states-select-list').find('option').attr('selected',false);
            $('#states-select-list').find('option[value=' + state + ']').attr('selected',true);
            
            // Because the search page caches our states select value we need to remove the hidden field
            $('input#queries_state_query').remove();
        }// End if
    }
    
    function processRebateMap()
    {
        var $rebates        = jQuery('#rebates-assistance');
        var $img            = $rebates.find('img');
        var defaultImgSrc   = $img.attr('src');

        if (typeof(mapData) === "object") {
            
             // Preload images
            for (var state in mapData) {
                preloadImage(mapData[state]);
            }// End for
            
            if (!$rebates.length) {
                return false;
            }// End if

            // State hovers
            $rebates.find('area').hover(function(){
                // In
                var $this = jQuery(this);
                var state = $this.attr('href').replace('#','').toLowerCase();
                if (typeof(mapData[state]) === "string") {
                    $img.attr('src',mapData[state]);
                }// End if
            },function(){
                // Out
                $img.attr('src',defaultImgSrc);
            });
            
            // State selection
            $rebates.find('area').click(function(e){
                e.preventDefault();
                var $this = jQuery(this);
                var state = $this.attr('href').replace('#','').toLowerCase();
                if (typeof(mapData[state]) === "string") {
                    $img.attr('src',mapData[state]);
                    defaultImgSrc = mapData[state]; // Set this to default
                    
                    // Set the value in the select box
                    $rebates.find('option').attr('selected',false);
                    $rebates.find('option[value=' + state.toUpperCase() + ']').attr('selected',true);
                }// End if
            });

            // Add change event to state select
            $rebates.find('select').bind('change',function(){
                var state = jQuery(this).val().toLowerCase();
                if (typeof(mapData[state]) === "string" && mapData[state] !== "") {
                    $img.attr('src',mapData[state]);
                    defaultImgSrc = mapData[state]; // Set this to default
                }// End if
            });
        }// End if
    }
    
    function processHomeBanner() 
    {
        var $banner = jQuery('#banner.home');
        
        function selectBannerItem(position)
        {
            var $div           = jQuery('.position-' + position,$banner);
            var $li            = jQuery('.select-position-' + position,$banner);
            
            $li.addClass('current').siblings().removeClass('current');
            $div.show().siblings().not('#banner-home-nav').hide();
        }
        
        var $nav = jQuery('#banner-home-nav');
        
        if ($banner.length) {
            var $items = $banner.find('.banner-item');
            $nav.append('<ul></ul>');

            // Create the slideshow automation
            var slideShow = new BannerSlideShow($nav);
            
            // Create links for each banner item
            $items.each(function(i){
                var pos = i + 1;
                var $item = jQuery(this);
                jQuery('ul',$nav).append('<li class="select-position-' + pos + '">' +
                    '<a href="#" title="select item ' + pos + '">' + pos + '</a></li>');
                jQuery('ul li:last a',$nav).click(function(e){
                    e.preventDefault();
                    selectBannerItem(pos);
                });
            });

            // Play/Pause button
            $('ul',$nav).append('<li class="pause"><a href="#" id="banner-automate">Pause</a></li>');

            $('#banner-automate').click(function(e){
                e.preventDefault();
                // If the 'pause' class is shown, the player is playing
                if ($(this).parent().hasClass('pause')) {
                    slideShow.pause();
                } else {
                    slideShow.play(5000);
                }// End if
            });

            // Show the first banner item by default
            selectBannerItem(1);
            slideShow.play(5000);
        }// End if
    }
    
    function processMenu()
    {
        // Clear the divider from the menu (necessary for IE 7 and below
        $('#main-nav li:last-child').css('background','none').css('padding-right','0');
    }// End processMenu

    function processSectionHeader()
    {
        // Populate heading text for landing pages and hide breadcrumb where appropriate
        if ($('#banner').hasClass('landing') && !$('#banner').find('.action').length){
            $('#section-heading').html($('#banner h1').text());
            $('#breadcrumb').hide();
        }// End if
    }
    
    // Identify collapsible areas that match pre-defined markup
    function collapsibleContent()
    {
        var newMarkup = '';
        $('#content-inner .collapsible').each(function(){
            var $section = $(this);
            var title = $section.find('h2').text();
            $section.find('h2').remove();
            newMarkup += '<h2><a href="#" class="collapsed section-link">' + title + '</a></h2>' + 
                        '<span class="section screenHide">' + $section.html() + '</span>';
        });
        if (newMarkup !== '') {
            //newMarkup = '<h2 id="information-header">Information</h2>' + newMarkup;
            var $content = $('#body-text');  
            $('#content-inner .collapsible:first').before(newMarkup);
            $('#content-inner .collapsible').remove();
            $('.section-link',$content).click(function(e){
                e.preventDefault();
                if ($(this).hasClass('collapsed')) {
                    $(this).removeClass('collapsed');
                    $(this).parent().next('span.section').removeClass('screenHide');
                } else {
                    $(this).addClass('collapsed');
                    $(this).parent().next('span.section').addClass('screenHide');
                }
            });
            
            // Attach some events that look for the hash #expand=
            function expand()
            {
                var expand = $.bbq.getState('expand');
                
                // Toggle open accordians closed when #expand= is used
                $('.section-link').filter(function(){
                   return !$(this).is('.collapsed');     
                }).trigger('click');
                
                if (typeof(expand) !== "undefined" &&
                    expand !== "") {
                    var headings = (expand.indexOf(',') !== -1) ? expand.split(',') : [expand];
                    $.each(headings,function(i,v){
                        var heading = decodeURIComponent(v);
                        var $link = $('a.section-link:contains("' + heading + '")',$content);
                        if ($link.length) {
                            $link.trigger('click');
                        }// End if
                        
                        // Scroll the user to the first expanded element
                        var $first = $('.section-link:not(.collapsed):first',$content);
                        if ($first.length) {
                            $('html').scrollTop($first.offset().top);
                        }// End if
                    });
                }// End if
            }// End expand()
            
            $(window).bind('hashchange',expand);
            expand();
        }// End if
    }
    
    // Process the other actions div
    function otherActions()
    {
        // Add a query string value if a category class is found
        var $actionsItem = $('#other-actions .more-actions');
        if ($actionsItem.length) {
            var category = $actionsItem.attr('class').replace('more-actions ','');
            if (typeof(category) === "string" && category.length >= 4) {
                var $link = $('a',$actionsItem);
                $link.attr('href',$link.attr('href') + '?category=' + category);
            }// End if
        }// End if
    }
    
    function processActionTable()
    {
        var $actionTable = jQuery('#action');
        if (!$actionTable.length) {
            return false;
        }// End if
        
        // Fix up the default output of the metadata field value
        $('.jurisdiction',$actionTable).each(function(){
            var replace = $(this).text().replace(/;/g,'');
            $(this).text(replace);
        });
        
        $('th.sort-by span',$actionTable).text('Sort by:');
        
        // Table sorting
        $('th span',$actionTable).addClass('sortable');
        $('th span',$actionTable).live('click',function(){
            
            // Control parent styling
            var $parent = $(this).parent();
            
            $parent.addClass('current').siblings().removeClass('current asc desc');
            if ($parent.hasClass('asc')) {
                 $parent.removeClass('asc').addClass('desc');
            } else {
                 $parent.removeClass('desc').addClass('asc');
            }// End if
            
            // Get a collection of the appropriate cell data to sort on
            var tdClassName = $(this).text().toLowerCase();
            var $cells = $('td.' + tdClassName,'#action');
            
            // Add the cells to an array for sorting
            var tmpSortable = [];
            $cells.each(function(){tmpSortable.push($(this));});
            
            // Perform a different sort based on cell content
            if (tdClassName === "title") {
                tmpSortable.sort(function(a,b){
                    var sortData = [a.text(),b.text()];
                    var origSortData = [a.text(),b.text()];
                    sortData.sort(); // Sort alpha
                    if ($parent.hasClass('desc')) {
                        sortData.reverse();
                    }// End if
                    return (sortData[0] === origSortData[0]) ? -1 : 1;
                });
            } else {
                tmpSortable.sort(function(a,b){
                    var first = a.attr('class').replace(tdClassName + ' level-','')*1;
                    var second = b.attr('class').replace(tdClassName + ' level-','')*1;
                    if ($parent.hasClass('asc')) {
                        return (first - second);
                    } else {
                        return (second - first);
                    }// End if
                }).reverse();
            }// End if
            $.each(tmpSortable,function(){
               // Using append here will move the element.
               $('tbody',$actionTable).append($(this).parent());
            });
            
            actionTableZebraStrip();
        });
        
        // Process query string parameters for sorting
        var sortByMatch = $.urlParam('sort');
        if (sortByMatch !== 0) {
            // There was a sorting parameter supplied
            var sortBy = sortByMatch.slice(0,1).toUpperCase() + sortByMatch.slice(1);
            var span = $('th span:contains(' + sortBy + ')',$actionTable);
            console.log(span);
            $('th span:contains(' + sortBy + ')',$actionTable).trigger('click');
        }// End if
    }
    
    function actionTableZebraStrip()
    {
        var $actionTable = jQuery('#action');
        $('tbody',$actionTable).find('tr:visible:odd').filter(function(){return !$(this).hasClass('screenHide');}).addClass('even').removeClass('odd');
        $('tbody',$actionTable).find('tr:visible:even').filter(function(){return !$(this).hasClass('screenHide');}).addClass('odd').removeClass('even');
    }
    
    /**
     * Filtering functionality for the take action table on the take action page
     */
    function processTakeActionPage()
    {
        var $actionTable = jQuery('#action');
        if (!$('#banner .action').length) {
            return false;
        }// End if
        
        function resortTable(options) {
            $('tbody',$actionTable).find('tr').addClass('screenHide');
            $('tbody',$actionTable).find('tr').each(function(){
                var tr = $(this);
                var category = tr.find('td:first span');
                $.each(options,function(index,value){
                    if (tr.find('span.' + value.toLowerCase()).length) {
                        tr.removeClass('screenHide');    
                    }
                });
            });            
            // Re-do the action count
            var rowCount = $('tbody',$actionTable).find('tr').filter(function(){return !$(this).hasClass('screenHide');}).length;
            $('#action-count').text(rowCount + ' action' + ((rowCount > 1) ? 's' : ''));
            
            actionTableZebraStrip();
            populateDidYouKnow(options);
        }
        
        var loading = false; // Store a loading var so we don't get multiple loads
        function populateDidYouKnow(options) {
            if (loading) {
                return false;   
            }
            loading = true;
            // Get the url of the related listing from the DOM
            var url = $('#facts-related-listing a').attr('href');
            
            var assets_per_page = 5;
            
            // Requires hard-coded asset ids for the related nodes
            var nodes = {
                energy:         8379,
                water:          8380,
                waste:          8381,
                travel:         8382
            };
            
            var newRelatedNodes = [];
            
            for (var i = 0, l = options.length; i<l; i++) {
                newRelatedNodes.push(nodes[options[i]]);
            }// End for
            
            url += '?assets_per_page=' + assets_per_page;
            url += '&related_node=' + newRelatedNodes.join(',');
            
            // Preloading
            $('#right-column').html('<div class="loading"></div>');
            
            // Load the content
            $('#right-column').load(url,function(){
                loading = false; 
            });
        }
        
        // Move the menu div
        var $menu = $('#take-action-menu');
        $('#left-column').append($menu);
        $menu.removeClass('screenHide');
        
        $('#take-action-menu a.go-back').click(function(e){
            e.preventDefault();
            window.history.go(-1);
        });
        
        $menu.find('input').bind('change',function(){
            var options = [];
            $menu.find('input:checked').each(function(){
                options.push($(this).val());
            });
            $.bbq.pushState({
                actions: options.join(',')
            },0);
            resortTable(options);
        });
        
        // Set the initial state from the url
        var actions = $.bbq.getState('actions');
        var options = [];
        var checkedOptions = [];
        
        $menu.find('input:checked').each(function(){
            checkedOptions.push($(this).val());
        });
        
        if (typeof(actions) !== "undefined" && actions !== "") {
            if (actions.indexOf(',') !== -1) {
                options = actions.split(',');  
            } else {
                options.push(actions);
            }// End if
            
            // Reset the checked values
            $menu.find('input:checked').each(function(){
                $(this).removeAttr('checked').trigger('change');
            });
            
            // Set the checked value
            $.each(options,function(i,v){
                $('#' + v.toLowerCase() + '-filter').attr('checked','checked').trigger('change');
            });
        } else {
            options = checkedOptions;   
        }// End if
        resortTable(options);
    }
    
    /**
     * The 'Take Action' filtered search option on the home page
     */
    function processTakeActionSearchHomePage()
    {
        var $searchButton = $('#action-search-submit');
        if ($searchButton.length) {
            $searchButton.click(function(e){
                e.preventDefault();
                var href = globalUrls.take_action;
                var options = [];
                $('#take-action-checkboxes input:checked').each(function(value){
                    options.push($(this).val());
                });
                
                if (options.length >= 1) {
                    href = href + '#actions=' + options.join(',');   
                }// End if
                
                window.location = href;
            });
        }
    }
})(jQuery);

$(document).ready(function(){
    if ($('form#search_page_7900 div.result > *').length > 0) {
        var target_top = $('div#results').offset().top;
        $('html, body').animate({
            scrollTop: target_top
        }, 0);
    }
});
