function URLencode(sStr) {
    return escape(sStr).
           replace(/\+/g, '%2B').
           replace(/\"/g,'%22').
           replace(/\'/g, '%27').
           replace(/\//g,'%2F');
}

var bookingSelection = {}
var errorsIn = '';
var doingSubmit = false;

// Preload the AJAX activity indicator
if (document.images) {
    indicator = new Image();
    indicator.src = '/media/img/ajax_loading.gif';
}

var ajaxWait = null;
function showAjaxWait() {
    if (ajaxWait == null) {
        ajaxWait = document.createElement('div')
        ajaxWait.innerHTML = '<img src="/media/img/ajax_loading.gif" align="absmiddle" /> Please wait...';
        ajaxWait.style.background = '#f00';
        ajaxWait.style.color = '#fff'
        ajaxWait.style.fontWeight = 'bold';
        ajaxWait.style.position = 'absolute';
        ajaxWait.style.padding = '.5em';
        ajaxWait.style.right = '10px';
        document.body.appendChild(ajaxWait);
        Element.hide(ajaxWait);
    }
    Element.show(ajaxWait);
    ajaxWait.style.top = (document.documentElement.scrollTop + 10) + 'px';
}
function hideAjaxWait() {
    if (ajaxWait != null) {
        Element.hide(ajaxWait);
    }
}


var bottomScrollerOn = false;
var bottomScrollerOff = false;
var bottomScrollerTopOf = null;
function bottomScroller() {
    if (document.documentElement) {
        if (bottomScrollerOn || bottomScrollerOff) document.documentElement.scrollTop += 20;
        
        var reachedLimit = (document.documentElement.scrollTop + document.documentElement.clientHeight == document.documentElement.scrollHeight);
        if (bottomScrollerTopOf != null && bottomScrollerOn) {
            if ($(bottomScrollerTopOf).offsetTop > 0) {
                reachedLimit |= ($(bottomScrollerTopOf).offsetTop < document.documentElement.scrollTop);
                if (reachedLimit) {
                    document.documentElement.scrollTop = $(bottomScrollerTopOf).offsetTop;
                    bottomScrollerOff = true;
                }
            } else {
                reachedLimit = bottomScrollerOff;
            }
        }
        
        if (reachedLimit) {
            if (bottomScrollerOff || bottomScrollerTopOf != null) {
                bottomScrollerOn = false;
                bottomScrollerOff = false;
                bottomScrollerTopOf = null;
            }
        }
        if (ajaxWait != null) {
            ajaxWait.style.top = (document.documentElement.scrollTop + 10) + 'px';
        }
        setTimeout(bottomScroller, 1);
    }
}

function initEvents() {
    if ($('id_catering')) {
        $('id_catering').disabled = !$('id_room').checked;
        Event.observe('id_room', 'click', function() {
            $('id_catering').disabled = !$('id_room').checked;
            // Don't allow hub and room to be checked
            if ($('id_hub').checked) {
                $('id_hub').checked = false;
            }
        });
        Event.observe('id_hub', 'click', function() {
            if ($('id_room').checked) {
                $('id_room').checked = false;
            }
        });
    }
}

Event.observe(window, 'load', function() {
   
    bottomScroller();
    initEvents();
   
    var over = function(event) {
        Element.addClassName(this, 'hover');
    }
    var out = function(event) {
        Element.removeClassName(this, 'hover');
    }
   
    var dateButtons = $$('table.calendar input');
    for (var i = 0; i < dateButtons.length; i++) {
        Event.observe(dateButtons[i], 'mouseover', over.bindAsEventListener(dateButtons[i]));
        Event.observe(dateButtons[i], 'mouseout', out.bindAsEventListener(dateButtons[i]));
    }
    
    var submitClicked = false;
    var form = $('facility-booking');
    var submit = function(event) {
        if (doingSubmit) {
            Event.stop(event);
            return;
        }
        doingSubmit = true;
        
        var postData = [];
        var fields = [];
        var elements = form.getElementsByTagName('input');
        for (var i = 0; i < elements.length; i++) {
            var type = elements[i].type;
            if (type == 'text' || type == 'hidden' || type == 'checkbox') {
                fields.push(elements[i]);
            }
        }
        elements = form.getElementsByTagName('select');
        for (var i = 0; i < elements.length; i++) {
            fields.push(elements[i]);
        }
        
        var element = Event.element(event);
        fields.push(element);
        
        var container = null;
        var containerEffect = true
        var toHide = [];

        submitClicked = element.name == 'logout' || element.name == 'confirm'

        if (element.name == 'dummy') {
            // Prevent enter key submit on non-IE browsers
            alert('Please select a button, rather than just pressing enter.');
            Event.stop(event);
            doingSubmit = false;
            return;
        } else if (element.name == 'po_choice') {
            container = 'booking__what';
            toHide = ['booking__what', 'booking__rooms', 'booking__layouts', 'booking__howmany', 'booking__dates', 'booking__times', 'booking__final'];
            errorsIn = 'booking__po';
        } else if (element.name == 'requirements_choice') {
            if (form.elements['room'].checked) {
                container = 'booking__rooms';
            } else {
                container = 'booking__dates';
            }
            toHide = ['booking__rooms', 'booking__layouts', 'booking__howmany', 'booking__dates', 'booking__times', 'booking__final'];
            errorsIn = 'booking__what';
        } else if (element.name == 'change_requirements') {
            container = 'booking__what';
            containerEffect = false;
            toHide = ['booking__rooms', 'booking__layouts', 'booking__howmany', 'booking__dates', 'booking__times', 'booking__final'];
        } else if (element.name.substring(0, 12) == 'type_choice~') {
            
            if (element.value == 'Board room') {
                container = 'booking__howmany';
                toHide = ['booking__dates', 'booking__times', 'booking__final'];
            } else if (Element.hasClassName(element, 'has_layouts')) {
                container = 'booking__layouts';
                toHide = ['booking__howmany', 'booking__dates', 'booking__times', 'booking__final'];
            } else {
                container = 'booking__dates';
                toHide = ['booking__layouts', 'booking__howmany', 'booking__times', 'booking__final'];
            }
            if (bookingSelection['type_choice']) {
                Element.removeClassName(bookingSelection['type_choice'], 'selected');
            }
            Element.addClassName(element.parentNode, 'selected');
            bookingSelection['type_choice'] = element.parentNode;
            form.elements['type'].value = element.value;
            if (form.elements['layout']) form.elements['layout'].value = '';
            if (form.elements['date']) form.elements['date'].value = '';
            if (form.elements['timeframe']) form.elements['timeframe'].value = '';
            if (form.elements['period']) form.elements['period'].value = '';
            if (form.elements['attendees']) form.elements['attendees'].value = '';
        } else if (element.name.substring(0, 14) == 'layout_choice~') {
            if (form.elements['type'].value == 'Conference room') {
                container = 'booking__howmany';
                toHide = ['booking__dates', 'booking__times', 'booking__final'];
            } else {
                container = 'booking__dates';
                toHide = ['booking__times', 'booking__final'];
            }
            if (bookingSelection['layout_choice']) {
                Element.removeClassName(bookingSelection['layout_choice'], 'selected');
            }
            Element.addClassName(element.parentNode, 'selected');
            bookingSelection['layout_choice'] = element.parentNode;
            form.elements['layout'].value = element.value;
            if (form.elements['timeframe']) form.elements['timeframe'].value = '';
            if (form.elements['period']) form.elements['period'].value = '';
            if (form.elements['attendees']) form.elements['attendees'].value = '';
        } else if (element.name == 'attendees_choice') {
            container = 'booking__dates';
            toHide = ['booking__dates', 'booking__times', 'booking__final'];
            errorsIn = 'booking__howmany';
        } else if (element.name == 'change_howmany') {
            container = 'booking__howmany';
            containerEffect = false;
            toHide = ['booking__dates', 'booking__times', 'booking__final'];
        } else if (element.name == 'monthA_choice' || element.name == 'monthB_choice') {
            container = 'booking__times';
            if (bookingSelection['date_choice']) {
                Element.removeClassName(bookingSelection['date_choice'], 'selected');
            }
            Element.addClassName(element.parentNode, 'selected');
            bookingSelection['date_choice'] = element.parentNode;
            if (element.name == 'monthA_choice') {
                form.elements['date'].value = form.elements['monthA_year'].value + '-'
                                            + form.elements['monthA_month'].value + '-'
                                            + element.value;
            } else {
                form.elements['date'].value = form.elements['monthB_year'].value + '-'
                                            + form.elements['monthB_month'].value + '-'
                                            + element.value;
            }
            if (Element.visible(container) && $(container).offsetHeight > 0) {
                containerEffect = false;
            }
            toHide = ['booking__final']
        } else if (element.name == 'month_next' || element.name == 'month_prev') {
            container = 'booking__dates';
            toHide = ['booking__times', 'booking__final'];
            containerEffect = false;
        } else if (element.name.substring(0, 16) == 'timeframe_choice') {
            container = 'booking__times';
            toHide = ['booking__final'];
            containerEffect = false;
        } else if (element.name == 'period_hours_select') {
            container = 'booking__final';
            errorsIn = 'booking__times';
        } else if (element.name.substring(0, 14) == 'period_choice~') {
            container = 'booking__final';
            if (Element.visible(container)) containerEffect = false;
            if (bookingSelection['period_choice']) {
                Element.removeClassName(bookingSelection['period_choice'], 'selected');
            }
            Element.addClassName(element.parentNode, 'selected');
            bookingSelection['period_choice'] = element.parentNode;
            form.elements['period'].value = element.name.substring(14, element.name.indexOf('.'));
        } else {
            doingSubmit = false;
            return;
        }


        postData.push('ajax=True');
        for (var i = 0; i < fields.length; i++) {
            var name = fields[i].name;
            if (name.indexOf('~') != -1 && name.indexOf('.') == -1) name += '.x';
            var value = '';
            if (fields[i].tagName.toLowerCase() == 'select') {
                value = fields[i].options[fields[i].selectedIndex].value;
            } else {
                if (fields[i].type != 'checkbox' || fields[i].checked) {
                    value = fields[i].value;
                }
            }
            postData.push(name + '=' + URLencode(value));
        }

        var doRequest = function() {
            new Ajax.Request(location.href, {
                parameters: postData.join('&'),
                onComplete: function(transport, json){ 
                    
                    hideAjaxWait();
                    
                    if (json != null) {
                        container = json;
                        errorsIn = json;
                        containerEffect = false;
                    }

                    $(container).innerHTML = transport.responseText;
                    initEvents();
                    
                    var elements = $(container).getElementsByTagName('input');
                    for (var i = 0; i < elements.length; i++) {
                        if (elements[i].type == 'submit' || elements[i].type == 'image') {
                            Event.observe(elements[i], 'click', submit);
                        }
                    } 
                    
                    bottomScrollerOn = true;
                    bottomScrollerTopOf = container;
                    if (containerEffect) {
                        new Effect.BlindDown(container, { afterFinish: function() {
                            bottomScrollerOff = true;
                            doingSubmit = false;
                        }.bind($(container)) })
                    } else {
                        bottomScrollerOff = true;
                        doingSubmit = false;
                    }
                }
            });
        }
        
        var done = function() {
            
            if (errorsIn != '') {
                
                var postData2 = ['refresh=' + URLencode(errorsIn)]
                for (var i = 0; i < postData.length; i++) postData2.push(postData[i]);
                new Ajax.Request(location.href, {
                    parameters: postData2.join('&'),
                    onComplete: function(transport, json){ 
                        $(errorsIn).innerHTML = transport.responseText;
                        initEvents();
                        var elements = $(errorsIn).getElementsByTagName('input');
                        for (var i = 0; i < elements.length; i++) {
                            if (elements[i].type == 'submit' || elements[i].type == 'image') {
                                Event.observe(elements[i], 'click', submit);
                            }
                        }
                        
                        if (json == null) {
                            errorsIn = '';
                            doRequest();
                        } else {
                            if (errorsIn == 'booking__details') {
                                //if (bookingSelection['attendees_choice']) {
                                //    Element.removeClassName(bookingSelection['attendees_choice'], 'selected');
                                //}
                            }
                            hideAjaxWait();
                            doingSubmit = false;
                        }
                    }
                });
            } else {
                doRequest();
            }
        }
        
        showAjaxWait();
        
        var i = 0;
        while (i < toHide.length) {
            if (Element.visible(toHide[i]) && $(toHide[i]).offsetHeight > 0) {
                i++;
            } else {
                if ($(toHide[i]).offsetHeight == 0) {
                    Element.hide(toHide[i]);
                }
                toHide.splice(i, 1);
            }
        }
        if (toHide.length > 0) {
            for (var i = 0; i < toHide.length; i++) {
                new Effect.BlindUp(toHide[i]);
            }
        }
        if (Element.visible(container) && $(container).offsetHeight > 0) {
            if (containerEffect) {
                new Effect.BlindUp(container, { afterFinish:done });
            } else {
                done();
            }
        } else {
            Element.hide(container);
            done();
        }
        
        
        Event.stop(event);
    }
    
    var elements = form.getElementsByTagName('input');
    for (var i = 0; i < elements.length; i++) {
        if (elements[i].type == 'submit' || elements[i].type == 'image') {
            Event.observe(elements[i], 'click', submit);
        }
    }

    if ($('id_logout')) {
        Event.observe(form, 'submit', function(event) {
            if (!submitClicked) {
                // Prevent enter key submit on IE7+8, only on booking form not login form
                alert('Please select a button, rather than just pressing enter.');
                Event.stop(event);
            }
        });
    }

});

// vi: tabstop=4 shiftwidth=4 expandtab:

