var partnerUrls;
var partnerNames;
var numPartnersChecked;
var minPartnersChecked = 3;
var maxPartnersChecked = 3;
var serializedSearchHash;
var serializedSearch;
var partnersChecked = new Hash();
var popWindows = new Hash();
var popTiled = true;
var popsEnabled;
var popWindowIndex = 0;
var step = 1;
var showExit = 0;

function setAnchor (anchor) {
    var url = document.location.href;
    var i = url.indexOf('#');
    if (i != -1) url = url.substring(0, i); 
    if (anchor != '') anchor = '#' + anchor;
    document.location.href = url + anchor;
}

function getAnchor () {
    var url = document.location.href;
    var i = url.indexOf('#');
    if (i != -1) return url.substring(i + 1); 
    return '';
}

function checkAnchor () {
    var anchor = getAnchor();
    if (step == 2 && anchor == '') {
        step1();
    }
    else if (step == 1 && anchor == '2') {
        if (validateStep1()) {
            showPartnerButtons();
        }
        else {
            setAnchor('');
        }
    }
}

function initAnchorWatcher () {
    new PeriodicalExecuter(checkAnchor, 0.5);
}

function checkCarAnchor () {
    var anchor = getAnchor();
    if (step == 2 && anchor == '') {
        step1Car();
    }
    else if (step == 1 && anchor == '2') {
        if (validateCarStep1()) {
            showCarPartnerButtons();
        }
        else {
            setAnchor('');
        }
    }
}

function initCarAnchorWatcher () {
    new PeriodicalExecuter(checkCarAnchor, 0.5);
}

function checkHotelAnchor () {
    var anchor = getAnchor();
    if (step == 2 && anchor == '') {
        step1Hotel();
    }
    else if (step == 1 && anchor == '2') {
        if (validateHotelStep1()) {
            showHotelPartnerButtons();
        }
        else {
            setAnchor('');
        }
    }
}

function initHotelAnchorWatcher () {
    new PeriodicalExecuter(checkHotelAnchor, 0.5);
}

function tryTestPopWindow () {
    popWindowIndex++;
    var w = window.open('about:blank', 'w_' + popWindowIndex, 'toolbar,menubar,scrollbars,resizable,location,screenX=0,screenY=0,left=0,top=0,width=10,height=10');
    if (w) {
        w.close();
        window.focus();
        return true;
    }
    else {
        return false;
    }
}

function determinePopMethod () {
    popsEnabled = !Prototype.Browser.IE;
}

function step1 () {
    setAnchor(1);
    step = 1;
    $('step1_headline').className = 'color';
    $('airfare_form').enable();
    $('itinerary').hide();
    $('step1_inner').show();
    new Effect.Opacity('step2', { to: 0, duration: 0.5, afterFinish: function() {
        restorePartners();
        new Effect.Opacity('step1_inner', { to: 0.999, duration: 0.5 });
        $('top-content').toggle();
        $('step2').hide();
        $('itinerary').hide();
        $('from').focus();
    } });
}

function step1Car () {
    setAnchor(1);
    step = 1;
    $('step1_headline').className = 'color';
    $('car_form').enable();
    $('itinerary').hide();
    $('step1_inner').show();
    new Effect.Opacity('step2', { to: 0, duration: 0.5, afterFinish: function() {
        new Effect.Opacity('step1_inner', { to: 0.999, duration: 0.5 });
        $('top-content').toggle();
        $('step2').hide();
        $('itinerary').hide();
        $('from').focus();
    } });
}

function step1Hotel () {
    setAnchor(1);
    step = 1;
    $('step1_headline').className = 'color';
    $('hotel_form').enable();
    $('itinerary').hide();
    $('step1_inner').show();
    new Effect.Opacity('step2', { to: 0, duration: 0.5, afterFinish: function() {
        restorePartners();
        new Effect.Opacity('step1_inner', { to: 0.999, duration: 0.5 });
        $('top-content').toggle();
        $('step2').hide();
        $('itinerary').hide();
        $('location').focus();
    } });
}

function updateStep2Msg () {
    $('step2_msg').innerHTML = ' - Select ' + 
        (minPartnersChecked == maxPartnersChecked ? 
            minPartnersChecked + ' Site' + (minPartnersChecked == 1 ? '' : 's') :
            minPartnersChecked + 1 == maxPartnersChecked ?
                minPartnersChecked + ' or ' + maxPartnersChecked + ' Sites' :
                'from ' + minPartnersChecked + ' to ' + maxPartnersChecked + ' Sites') + ' to Compare';
}

function showPartnerButtons () {
    clearError();
    toggleScreen();
    clearBubble();
    submitEmail();
    if ($('search_email')) $('search_email').value = '';
    var from = normalizeAirport($('from').value);
    var to = normalizeAirport($('to').value);
    $('city_text').innerHTML = cityOnly(to);
    if ($('vacations')) {
        $('search_box_msg').innerHTML = 'Vacation Packages';
        $('step2_headline_text').innerHTML = 'Vacations';
    } 
    else {
        $('search_box_msg').innerHTML = ($('air_and_hotel').checked) ? 'Air &amp; Hotel Discount Packages' : 'Cheapest Flights &amp; Airfare';
        $('step2_headline_text').innerHTML = ($('air_and_hotel').checked) ? 'Flights &amp; Hotels' : 'Flights';
    }        
    $('search_msg').innerHTML = from + ' to ' + to;
    centerLoader('loader');
    $('step1_headline').className = 'gray';
    $('step2_headline').className = 'color';
    serializedSearchHash = $('airfare_form').serialize(true);
    serializedSearch = $('airfare_form').serialize();
    step = 2;
    setAnchor(2);
    dropCookie('form', serializedSearch, 30 * 24 * 60 * 60);
    $('step1_inner').style.filter = 'alpha(opacity=50)';
    $('airfare_form').disable();
    new Effect.Opacity('step1_inner', { to: 0.5, duration: 0.5, afterFinish: function() {
        new Ajax.Updater(
            'partner_list', 
            '/l1/partners.html?' + serializedSearch, { 
                method: 'get', 
                evalJS: 'force',
                evalScripts: true, 
                onComplete: function (transport) {
                    $('top-content').hide();
                    $('step2').show();
                    new Effect.Opacity('step2', { to: 0.999, duration: 0.5, afterFinish: function() {
                        new Effect.ScrollTo('bubble', {duration: 0.2});
                        } 
                    });
                    displayItinerary('flights',serializedSearch);
                    setTimeout("$('loader').toggle()",500);
                    toggleScreen();
                }
            }
        );
    } });
}

function showCarPartnerButtons () {
    clearError();
    toggleScreen();
    clearBubble();
    var from = normalizeAirport($('from').value);
    var to = normalizeAirport($('to').value);
    $('search_msg').innerHTML = $('dropoff_different_from_pickup').checked ? from + ' to ' + to : from;
    $('search_box_msg').innerHTML = 'Best Car Rental Rates';
    centerLoader('loader');
    $('step1_headline').className = 'gray';
    $('step2_headline').className = 'color';
    serializedSearchHash = $('car_form').serialize(true);
    serializedSearch = $('car_form').serialize();
    step = 2;
    setAnchor(2);
    dropCookie('car_form', serializedSearch, 30 * 24 * 60 * 60);
    $('step1_inner').style.filter = 'alpha(opacity=50)';
    $('car_form').disable();
    new Effect.Opacity('step1_inner', { to: 0.5, duration: 0.5, afterFinish: function() {
        new Ajax.Updater(
            'partner_list', 
            '/l1/partners.html?' + serializedSearch, { 
                method: 'get', 
                evalScripts: true, 
                onComplete: function (transport) {
                    $('top-content').hide();
                    $('step2').show();
                    new Effect.Opacity('step2', { to: 0.999, duration: 0.5, afterFinish: function() {
                        new Effect.ScrollTo('bubble', {duration: 0.2});
                        } 
                    });
                    displayItinerary('cars', serializedSearch);
                    setTimeout("$('loader').toggle()", 1000);
                    toggleScreen();
                }
            }
        );
    } });
}

function showHotelPartnerButtons () {
    clearError();
    toggleScreen();
    clearBubble();
    var loc = normalizeAirport($('location').value);
    $('search_msg').innerHTML = loc;
    $('search_box_msg').innerHTML = 'Searching ' + cityOnly(loc) + ' Hotels';
    centerLoader('loader');
    $('step1_headline').className = 'gray';
    $('step2_headline').className = 'color';
    $('step2_headline_text').innerHTML = cityOnly(loc);
    serializedSearchHash = $('hotel_form').serialize(true);
    serializedSearch = $('hotel_form').serialize();
    step = 2;
    setAnchor(2);
    dropCookie('hotel_form', serializedSearch, 30 * 24 * 60 * 60);
    $('step1_inner').style.filter = 'alpha(opacity=50)';
    $('hotel_form').disable();
    new Effect.Opacity('step1_inner', { to: 0.5, duration: 0.5, afterFinish: function() {
        new Ajax.Updater(
            'partner_list', 
            '/l1/partners.html?' + serializedSearch, { 
                method: 'get', 
                evalScripts: true, 
                onComplete: function (transport) {
                    $('top-content').hide();
                    $('step2').show();
                    new Effect.Opacity('step2', { to: 0.999, duration: 0.5, afterFinish: function() {
                        new Effect.ScrollTo('bubble', {duration: 0.2});
                        } 
                    });
                    displayItinerary('hotels', serializedSearch);
                    setTimeout("$('loader').toggle()", 1000);
                    toggleScreen();
                }
            }
        );
    } });
}

function showButtonFares(button, fareButtonOn) {
    position = $('adv_' + button).cumulativeOffset();
    advSize = $('adv_' + button).getDimensions();
    fbSize = $('button-fares').getDimensions();
    $('button-fares').style.left = position[0] + (advSize.width / 2 - fbSize.width / 2) - 3 + 'px';
    $('button-fares').style.top = position[1] - fbSize.height + 10 + 'px';
    if (fareButtonOn) {
        $('button-fares').show();
    } else {
        $('button-fares').hide();
    }
    clearError();
}

function displayItinerary (type, serializedSearch) {
    $('favorite-dialog').hide();
    $('step1_inner').hide();
    new Ajax.Updater(
        'itinerary',
        '/l1/' + type + '/itinerary.html?' + serializedSearch, {
            method: 'get',
            evalScripts: true,
            onComplete: function (transport) {
                $('itinerary').show();
                new Effect.Appear('partners', {duration: 0.5});
            }
        });
}

var hotelChecked = false;

function updatePartners (mode) {
    toggleScreen();
    hotelChecked = !hotelChecked;
    $('air_and_hotel').checked = $('hotel').checked = hotelChecked;
    $('step2_headline_text').innerHTML = ($('air_and_hotel').checked) ? 'Flights &amp; Hotels' : 'Flights';
    $('search_box_msg').innerHTML = ($('air_and_hotel').checked) ? 'Air &amp; Hotel Discount Packages' : 'Cheapest Flights &amp; Airfare';
    var from = normalizeAirport($('from').value);
    var to = normalizeAirport($('to').value);
    $('search_msg').innerHTML = from + ' to ' + to;
    $('airfare_form').enable();
    centerLoader('loader');
    serializedSearchHash = $('airfare_form').serialize(true);
    serializedSearch = $('airfare_form').serialize();
    $('airfare_form').disable();
    dropCookie('form', serializedSearch, 30 * 24 * 60 * 60);
    new Ajax.Updater(
        'partner_list', 
        '/l1/partners.html?' + serializedSearch, { 
            method: 'get', 
            evalScripts: true, 
            onComplete: function (transport) {
                restorePartners();
                setTimeout("toggleScreen();$('loader').toggle()", 1000);
            }
        }
    );
}

function editItinerary(mode) {
    if (mode == 'edit') {
        new Effect.BlindUp('itinerary-display', {
            duration: 0.5,
            afterFinish: function() {
                new Effect.BlindDown('itinerary-edit', {duration: 0.5});
                new AirportAutocompleter('iti_from');
                new AirportAutocompleter('iti_to');
                Calendar.attach($('iti_depart'), onItiDepartUpdate);
                Calendar.attach($('iti_return'), onItiReturnUpdate);
            }
        });
    }
    if (mode == 'update') {
        var trip = ($('iti_roundtrip').checked) ? 'roundtrip' : 'one_way';
        var tickets = $('iti_tickets').value;
        updateItineraryFromDeals($('iti_depart').value, $('iti_return').value, $('iti_from').value, $('iti_to').value, trip, tickets);
    }
    if (mode == 'reset') {
        new Effect.BlindUp('itinerary-edit', {
            duration: 0.5,
            afterFinish: function() {
                new Effect.BlindDown('itinerary-display', {duration: 0.5});
            }
        });
    }
}

function updateItineraryReturn() {
    if ($('iti_roundtrip').checked) {
        $$('.iti_return_block').each(function(s) {
            s.show();
        });
        $('one_way').checked = false;
        $('roundtrip').checked = true;
    } else {
        $$('.iti_return_block').each(function(s) {
            s.hide();
        });
        $('one_way').checked = true;
        $('roundtrip').checked = false;
    }
}

function useSADFromAir(departDate, returnDate, from, to) {
    $('from').value = from;
    $('to').value = to;
    $('depart').value = departDate;
    $('return').value = returnDate;
    $('airfare_form').enable();
    showPartnerButtons();
}

function useSAD(departDate, returnDate, from, to, slice) {
    url = '/l1/flights/?from=' + escape(from) + '&to=' + escape(to) + '&depart=' + departDate + '&return=' + returnDate + '&slice=' + slice + '#2';
    top.location.href = url;
}

function updateItineraryFromDeals(departDate, returnDate, from, to, trip, tickets) {
    $('step2_submsg').innerHTML = '<b>Checking fares from top travel sites...</b><br>Please be patient while we update your new itinerary';
    $('itinerary_panel').hide();
    $('itinerary_load').show();
    $('iti_depart_date').update(fullDate(departDate));
    $('iti_return_date').update(fullDate(returnDate));
    $('iti_from_txt').update(shortenAirport(from));
    $('iti_to_txt').update(shortenAirport(to));
    $('from').value = from;
    $('to').value = to;
    $('depart').value = departDate;
    $('return').value = returnDate;
    $('trip').value = trip;
    $('tickets').value = tickets;
    $('airfare_form').enable();
    serializedSearch = $('airfare_form').serialize();
    serializedSearch += '&searched=1';
    dropCookie('form', serializedSearch, 30 * 24 * 60 * 60);
    new Effect.Fade('partners', {duration: 0.5, afterFinish: function () {
        new Ajax.Updater(
            'partner_list', 
            '/l1/partners.html?' + serializedSearch, { 
                method: 'get', 
                evalScripts: true, 
                onComplete: function (transport) {
                    $('city_text').update(cityOnly(to));
                    updateStep2SubMsg();
                    displayItinerary('flights',serializedSearch);
                }
            }
        );
    }});
}

var searched = '';
function updateStep2SubMsg() {
    text = (searched) ? '<b>Select 3 sites to compare</b><br>Pick from your favorite travel agents and compare prices all at once' : '<b>Your itinerary has been updated.</b><br>Please select 3 travel agents to compare flight prices';
    skin = ($('step2_submsg').className == 'itinerary-changed-msg') ? 'submsg' : 'itinerary-changed-msg';
    $('step2_submsg').className = skin;
    $('step2_submsg').innerHTML = text;
}

function checkOnewayCar() {
    if ($('dropoff_different_from_pickup').checked) {
        new Effect.BlindDown('oneway-car', { duration: 0.2, afterFinish: function() { 
            if ($('to').visible()) {
                $('to').focus(); 
            }
        }});
    } 
    else {
        new Effect.BlindUp('oneway-car', { duration: 0.2 });
    }
}

function toggleScreen () {
    $('exit-bg').style.width = document.body.offsetWidth + 'px';
    $('exit-bg').style.height= document.body.offsetHeight + 60 + 'px';
    $('exit-bg').toggle();
}

function centerLoader (area) {
    area = $(area);
    area_width = area.getWidth();
    var arrayPageScroll = document.viewport.getScrollOffsets();
    var y = arrayPageScroll[1] + (document.viewport.getHeight() / 5);
    var x = arrayPageScroll[0] + ((document.viewport.getWidth() - area_width) / 2);
    area.setStyle({ top: y + 'px', left: x + 'px' });
    area.toggle();
}    

function setDates () {
    var d = $('depart').value;
    var re = /^(\d\d)\/(\d\d)\/(\d\d\d\d)$/;
    d = d.match(re);
    if (d != null) {
        d = '' + d[3] + d[1] + d[2];
        var elt = datePickerController.getDatePicker('return');
        if (elt) elt.setRangeLow(d);
    }
}

function getTempPopWindow (partnerID) {
    popWindowIndex++;
    var w = window.open('/thunk-msg.html?' + partnerUrls.get(partnerID) + '&' + serializedSearch, 'w_' + popWindowIndex, 'toolbar,menubar,scrollbars,resizable,location,screenX=0,screenY=0,left=0,top=0,width=480,height=360'); // 480x360
    w.blur();
    window.focus();
    return w;
}

function checkPartner (partnerID) {
    if (partnersChecked.get(partnerID)) return;
    $('check_' + partnerID).src = '/images/check_black.gif';
    partnersChecked.set(partnerID, true);
    numPartnersChecked++;
    if (!popsEnabled && !popWindows.get(partnerID)) {
        popWindows.set(partnerID, getTempPopWindow(partnerID));
    }
}

function uncheckPartner (partnerID) {
    if (!partnersChecked.get(partnerID)) return;
    $('check_' + partnerID).src = '/images/check_blank_black.gif';
    partnersChecked.unset(partnerID);
    numPartnersChecked--;
    if (popWindows.get(partnerID)) {
        popWindows.get(partnerID).close();
        popWindows.unset(partnerID);
    }
}

function updateCompareMsg () {
    if (!$('compare-message')) return;
    var s;
    var p = '';
    var pc = partnersChecked.keys();
    for (var i = 0; i < pc.length; i++) {
        if (i == 0) {
        }
        else if (i == pc.length - 1) {
            p += ' and ';
        }
        else {
            p += ', ';
        }
        p += partnerNames.get(pc[i]);
    }
    switch (numPartnersChecked) {
    case 0:
        s = '<b>Pick 3 favorite sites and</b><br>';
        break;
    case 1:
        s = 'Comparing <b>' + p + '</b><small id="compare-list-msg">Please pick another 2 partners</small>';
        break;
    case 2:
        s = 'Comparing <b>' + p + '</b><small id="compare-list-msg">Please pick 1 more partner</small>';
        break;
    case 3:
        s = 'Comparing <b>' + p + '</b><small id="compare-list-msg">Tip: You can compare up to 4 partners at once</small>';
        break;
    default:
        s = 'Comparing <b>' + p + '</b>';
        break;
    }
    $('compare-message').innerHTML = s;
}

function selectPartner (partnerID, size) {
    if (numPartnersChecked >= maxPartnersChecked && !partnersChecked.get(partnerID)) {
        displayError('You can only compare ' + (minPartnersChecked != maxPartnersChecked ? 'up to ' : '') + maxPartnersChecked + ' site' + (maxPartnersChecked == 1 ? '' : 's') + ' at a time.', 1, partnerID); 
    }
    else if (!partnersChecked.get(partnerID)) {
        $('adv_' + partnerID).className = 'advertiser_' + size + '_selected';
        checkPartner(partnerID);
    } 
    else { 
        $('adv_' + partnerID).className = 'advertiser_' + size;
        uncheckPartner(partnerID);
    }
    // showButtonFares(partnerID,false);
    updateCompareMsg();
}

function usDateToSqlDate(d) {
    var ms = d.match(/^(\d\d?)\/(\d\d?)\/(\d\d\d\d)$/);
    if (ms) {
        return '' + ms[3] + '-' + (ms[1] < 10 ? '0' : '') + ms[1] + '-' + (ms[2] < 10 ? '0' : '') + ms[2];
    }
    else {
        return '';
    }
}

function doPopWindows (force) {

    if (!force && numPartnersChecked < minPartnersChecked) {
        displayError('Please select ' + (minPartnersChecked != maxPartnersChecked ?  'at least ' : '') + minPartnersChecked + ' site' + (minPartnersChecked == 1 ? '' : 's') + ' to compare.', 0, '');
        return false;
    } 

    var cascadeDelta = 50;
    var coords = new Array;

    if (popTiled) {
        var numWindowsHorizontally = numPartnersChecked == 4 ? 2 : numPartnersChecked;
        var numWindowsVertically = numPartnersChecked == 4 ? 2 : 1;
        var windowWidth = screen.availWidth / numWindowsHorizontally;
        var windowHeight = screen.availHeight / numWindowsVertically;
        for (var i = 0; i < numPartnersChecked; i++) {
            var c = new Object;
            c.left = Math.floor((i % numWindowsHorizontally) * windowWidth + 0.5);
            c.top = Math.floor(Math.floor(i / numWindowsHorizontally) * windowHeight + 0.5);
            c.width = Math.floor(windowWidth + 0.5);
            c.height = Math.floor(windowHeight + 0.5);
            coords.push(c);
        }
    }
    else {
        var windowWidth = screen.availWidth - cascadeDelta * (numPartnersChecked - 1);
        var windowHeight = screen.availHeight - cascadeDelta * (numPartnersChecked - 1);
        for (var i = 0; i < numPartnersChecked; i++) {
            var c = new Object;
            c.left = i * cascadeDelta;
            c.top = i * cascadeDelta;
            c.width = Math.floor(windowWidth + 0.5);
            c.height = Math.floor(windowHeight + 0.5);
            coords.push(c);
        }
    }

    var index = 0;
    partnersChecked.keys().each(function (partnerID) {
        var url = (partnerID >= 1000000 ? '/thunk-deal.html' : '/thunk-redir.html') + '?' + partnerUrls.get(partnerID) + '&' + serializedSearch;
        var w = popWindows.get(partnerID);
        var c = coords[index];
        if (c) {
            if (w) {
                (document.all ? w.document.body : w).onbeforeunload = null;
                w.resizeTo(10, 10);
                w.moveTo(c.left, c.top);
                w.resizeTo(c.width, c.height);
                w.focus();
                w.document.location.href = url;
            }
            else {
                w = window.open(url, 'w_' + partnerID, 'toolbar,menubar,scrollbars,resizable,location,screenX=' + c.left + ',screenY=' + c.top + ',left=' + c.left + ',top=' + c.top + ',width=10,height=10');
                if (w) w.resizeTo(c.width, c.height);
            }
        }
        index++;
        $('check_' + partnerID).src = '/images/check_blank_black.gif';
    });

    partnersChecked = new Hash();
    popWindows = new Hash();
    numPartnersChecked = 0;
    updateCompareMsg();

    if ($('exit') && showExit || (getCookie('user') == '' && $('exit_email'))) {
        toggleScreen();
        centerLoader('exit');
//      $('exit_email').focus();
    }
}

function submitEmailForm () {
    if (!emailRegex.test($('widget_email').value)) {
        var pos = $('widget_email').cumulativeOffset();
        $('bubble_step2').update('Please enter ' + ($('widget_email').value == '' ? 'your' : 'valid') + ' E-Mail address');
        $('widget_email').focus();
        $('widget_email').select();
        moveIt($('bubble_step2'), pos[0] - 300, pos[1] - bubbleHeight);
        return false;
    }
    if ($('widget_home') && $('widget_home').value == '') {
        var pos = $('widget_home').cumulativeOffset();
        $('bubble_step2').update('Please enter your home airport');
        $('widget_home').focus();
        $('widget_home').select();
        moveIt($('bubble_step2'), pos[0] - 300, pos[1] - bubbleHeight);
        return false;
    }
    new Ajax.Request('/l1/submit-email.html?form=widget&' + $('email_form').serialize(), {
        onSuccess: function (transport) {
            $('bottom_email').innerHTML = transport.responseText;
        }
    });
    clearError();
    return false;
}

function submitExitEmailForm () {
    if (!emailRegex.test($('exit_email').value)) {
        var pos = $('exit_email').cumulativeOffset();
        $('bubble_step2').update('Please enter ' + ($('exit_email').value == '' ? 'your' : 'valid') + ' E-Mail address');
        $('exit_email').focus();
        $('exit_email').select();
        moveIt($('bubble_step2'), pos[0] - 300, pos[1] - bubbleHeight);
        return false;
    }
    if ($('exit_home') && $('exit_home').value == '') {
        var pos = $('exit_home').cumulativeOffset();
        $('bubble_step2').update('Please enter your home airport');
        $('exit_home').focus();
        $('exit_home').select();
        moveIt($('bubble_step2'), pos[0] - 300, pos[1] - bubbleHeight);
        return false;
    }
    new Ajax.Request('/l1/submit-email.html?form=exit&' + $('exit_email_form').serialize(), {
        onSuccess: function (transport) {
            $('exit_email_container').innerHTML = transport.responseText;
        }
    });
    clearError();
    return false;
}

function submitEmail () {
    showExit = 0;
    if (!$('search_email') || !emailRegex.test($('search_email').value)) return false;
    new Ajax.Request('/l1/submit-email.html?form=exit&section=search&email=' + escape($('search_email').value) + '&home=' + escape($('from').value), {
        onSuccess: function (transport) {
            $('exit_email_container').innerHTML = transport.responseText;
            showExit = 1;
        }
    });
    clearError();
    return false;
}

function showDeals () {
    toggleScreen();
    clearBubble();
    $('search_box_msg').innerHTML = 'Getting Amazing Deals...';
    $('search_msg').innerHTML = $('to').value;
    centerLoader('loader');
    serializedSearch = $('deals_form').serialize();
    dropCookie('deals_form', serializedSearch, 30 * 24 * 60 * 60);
    new Ajax.Updater(
        'feeds', 
        '/l1/deals.html?' + serializedSearch, { 
            method: 'get', 
            evalScripts: true, 
            onComplete: function (transport) {
                setTimeout("$('loader').toggle()",500);
                toggleScreen();
            }
        }
    );
}

function showAllDeals (category) {
    toggleScreen();
    clearBubble();
    $('search_box_msg').innerHTML = 'Getting Amazing Deals...';
    $('search_msg').innerHTML = $('to').value;
    centerLoader('loader');
    serializedSearch = $('deals_form').serialize();
    dropCookie('deals_form', serializedSearch, 30 * 24 * 60 * 60);
    new Ajax.Updater(
        'feeds', 
        '/l1/all-deals.html?category=' + category + '&' + serializedSearch, { 
            method: 'get', 
            evalScripts: true, 
            onComplete: function (transport) {
                setTimeout("$('loader').toggle()",500);
                toggleScreen();
            }
        }
    );
}

function showTwitter() {
    new Ajax.Updater(
        'feeds', 
        '/l1/deals/twitter.html', { 
            method: 'get', 
            evalScripts: true
        }
    );
}

function showPartnerReloadMsg() {
    $('step2_headline').hide();
    $('step2_headline_reload').show();
    $('step2_submsg').hide();
    $('step2_reloadmsg').show();
    var pos = $('step2_reloadmsg').cumulativeOffset();
    $('arrow-reload').style.top = pos[1] + 'px';
    $('arrow-reload').style.left = pos[0] - $('arrow-reload').getWidth() + 5 + 'px';
}

function restorePartners() {
    $('step2_submsg').show();
    $('step2_reloadmsg').hide();
    $('step2_headline').show();
    $('step2_headline_reload').hide();
}

function toggleSearchEmail() {
    text = 'Enter your e-mail address';
    elt = $('search_email');
    if (elt.value == text) {
        elt.style.color = '#000000';
        elt.value = '';
    }
    else if (elt.value == '') {
        elt.style.color = '#999999';
        elt.value = text;
    }

}

function showEmailSignup() {
    if ($('yes-email').checked) {
        new Effect.BlindDown('email-box', {duration: 0.2, afterFinish: function() {
            $('search_email').focus();
            }});
    } else {
        new Effect.BlindUp('email-box', {duration: 0.2});
    }
}

function onItiDepartUpdate () {
    return function() {
        Calendar.minDate = new Date(); 
        Calendar.highlightedDates = [ $('iti_return').value ]; 
        clearBubble();
    }
}

function onItiReturnUpdate () {
    return function() {
        Calendar.minDate = new Date($('iti_depart').value);
        var d = (!$('iti_return').value || $('iti_return').value == 'mm/dd/yyyy') ? '' : new Date($('iti_return').value);
        if (d < Calendar.minDate) {
            d = new Date(Calendar.minDate);
            d.setDate(d.getDate() + 7);
            $('iti_return').value = (d.getMonth() + 1) + '/' + d.getDate() + '/' + (d.getYear() % 100 + 2000);
        }
        Calendar.highlightedDates = [ $('iti_depart').value ]; 
        clearBubble();
    }
}

function onDealDepartUpdate (postfix) {
    return function() {
        Calendar.minDate = new Date(); 
        Calendar.highlightedDates = [ $('return' + postfix).value ]; 
        clearBubble();
    }
}

function onDealReturnUpdate (postfix) {
    return function() {
        Calendar.minDate = new Date($('depart' + postfix).value);
        var d = (!$('return' + postfix).value || $('return' + postfix).value == 'mm/dd/yyyy') ? '' : new Date($('return' + postfix).value);
        if (d < Calendar.minDate) {
            d = new Date(Calendar.minDate);
            d.setDate(d.getDate() + 7);
            $('return' + postfix).value = (d.getMonth() + 1) + '/' + d.getDate() + '/' + (d.getYear() % 100 + 2000);
        }
        Calendar.highlightedDates = [ $('depart' + postfix).value ]; 
        clearBubble();
    }
}

function useDeal(elt, from, to, depart, row) {
    $$('table.promos tbody').each(function (s) {s.className = ''});
    elt.className = 'selected';
    x = $('tr-row' + row);
    if (!x.visible()) {
        $('depart' + row).value = depart;
        $$('table.promos .tr-row').each(function (s) {s.style.display = 'none'});
        Calendar.attach($('depart' + row), onDealDepartUpdate(row));
        Calendar.attach($('return' + row), onDealReturnUpdate(row));
        new Effect.Appear(x, { duration: 0, afterFinish: function() {
            $('return' + row).focus();
        }});
    }
}

function searchFlightDeal(origin, destination, id) {
    if ($('depart' + id).value == 'mm/dd/yyyy' || $('depart' + id).value == '') {
        showStep1Bubble($('depart' + id), 'Please select a departure date');
    } 
    else if ($('return' + id).value == 'mm/dd/yyyy' || $('return' + id).value == '') {
        showStep1Bubble($('return' + id), 'Please select a return date');
    } 
    else {        
        url = '/l1/flights/index.html';
        url += '?promo=&type=Air&trip=roundtrip&air_and_hotel=&from=' + origin + '&to=' + destination + '&depart=' + $('depart' + id).value + '&return=' + $('return' + id).value + '&travelers=' + $('travelers' + id).value + '#2';
        window.open(url, '');
    }
}

