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

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 == '') {
        step1();
    }
    else if (step == 1 && anchor == '2') {
        if (validateCarStep1()) {
            showCarPartnerButtons();
        }
        else {
            setAnchor('');
        }
    }
}

function initCarAnchorWatcher () {
    new PeriodicalExecuter(checkCarAnchor, 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();
        $('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();
    var from = normalizeAirport($('from').value);
    var to = normalizeAirport($('to').value);
    var searchMsg = from + ' to ' + to;
    $('search_box_msg').innerHTML = ($('air_and_hotel').checked) ? 'Air &amp; Hotel Discount Packages' : 'Cheapest Flights &amp; Airfare';
    $('search_msg').innerHTML = searchMsg;
    centerLoader('loader');
    $('step1_headline').className = 'gray';
    $('step2_headline').className = 'color';
    $('step2_headline_text').innerHTML = cityOnly(to);
    $('has_hotel').innerHTML = ($('air_and_hotel').checked) ? ' &amp; Hotels' : '';
    serializedSearch = Form.serialize($('airfare_form'));
    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').toggle();
                    $('step2').toggle();
                    new Effect.Opacity('step2', { to: 0.999, duration: 0.5 });
                    displayItinerary('flights',serializedSearch);
                    $('travel-center').innerHTML = cityOnly(to);
                    setTimeout("$('loader').toggle()",500);
                    toggleScreen();
                }
            }
        );
    } });
}

function showCarPartnerButtons () {
    clearError();
    toggleScreen();
    clearBubble();
    var loc = normalizeAirport($('location').value);
    $('search_msg').innerHTML = loc;
    $('search_box_msg').innerHTML = 'Best Car Rental Rates';
    centerLoader('loader');
    $('step1_headline').className = 'gray';
    $('step2_headline').className = 'color';
    serializedSearch = Form.serialize($('car_form'));
    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').toggle();
                    $('step2').toggle();
                    new Effect.Opacity('step2', { to: 0.999, duration: 0.5 });
                    displayItinerary('cars', serializedSearch);
                    setTimeout("$('loader').toggle()", 1000);
                    toggleScreen();
                }
            }
        );
    } });
}

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();
            }
        });
}

var hotelChecked = false;

function updatePartners () {
    toggleScreen();
    hotelChecked = !hotelChecked;
    $('air_and_hotel').checked = $('hotel').checked = hotelChecked;
    $('has_hotel').innerHTML = ($('air_and_hotel').checked) ? ' &amp; Hotels' : '';
    var from = normalizeAirport($('from').value);
    var to = normalizeAirport($('to').value);
    var searchMsg = from + ' to ' + to;
    $('search_box_msg').innerHTML = ($('air_and_hotel').checked) ? 'Air &amp; Hotel Discount Packages' : 'Cheapest Flights &amp; Airfare';
    $('search_msg').innerHTML = searchMsg;
    centerLoader('loader');
    $('airfare_form').enable();
    serializedSearch = Form.serialize($('airfare_form'));
    $('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 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);
    var mainPos = $('main_area').cumulativeOffset();
    var mainDims = $('main_area').getDimensions();
    var loader = area.getDimensions();
    x = Math.round(((mainDims['width'] - loader['width']) / 2) + mainPos[0])  + 'px';
    area.style.left = x;
    area.style.top = '180px';
    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 your favorite sites and</b><br>';
        break;
    case 1:
        s = 'Compare: <b>' + p + '</b><small id="compare-list-msg">Please pick one, two or three more sites</small>';
        break;
    case 2:
        s = 'Compare: <b>' + p + '</b><small id="compare-list-msg">Please pick one or two more for the best comparison</small>';
        break;
    case 3:
        s = 'Compare: <b>' + p + '</b><small id="compare-list-msg">Tip: You can compare up to four sites at once</small>';
        break;
    default:
        s = 'Compare: <b>' + p + '</b>';
        break;
    }
    $('compare-message').innerHTML = s;
}

function selectPartner (partnerID, size) {
    size = (size == 's') ? '_small' : '';
    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).style.background = 'url(/images/button_hover' + size + '.gif) top left no-repeat';
        checkPartner(partnerID);
    } 
    else { 
        $('adv_' + partnerID).style.background = 'url(/images/button' + size + '.gif) top left no-repeat';
        uncheckPartner(partnerID);
    }
    updateCompareMsg();
}

function doPopWindows () {

    if (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 = '/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 (getCookie('user') == '' && $('exit_email')) {
        toggleScreen();
        centerLoader('exit');
//      $('exit_email').focus();
    }
}

var emailRegex = /^\s*[a-z0-9!#$%&'*+/=?^_`{|}~-]+(\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+(aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|a[c-gil-oq-uwxz]|b[abd-jmnorstvwyz]|c[acdf-iklnruvxyz]|d[ejkmoz]|e[ceghrsu]|f[ijkmor]|g[abd-ilmnp-uwy]|h[kmnrtu]|i[del-oq-t]|j[emop]|k[eghimnprwyz]|l[abcikr-vy]|m[acdeghk-z]|n[acfgilopruz]|p[ae-hk-nrstwy]|qa|r[eosuw]|s[a-eg-ortuvyz]|t[cdfghj-prtvwz]|u[agksyz]|v[aceginu]|w[fs]|y[etu]|z[amw]|arpa)\s*$/i;

function submitEmailForm () {
    if (!emailRegex.test($('widget_email').value)) {
        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 == '') {
        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&' + Form.serialize($('email_form')), {
        onSuccess: function (transport) {
            $('bottom_email').innerHTML = transport.responseText;
        }
    });
    clearError();
    return false;
}

function submitExitEmailForm () {
    if (!emailRegex.test($('exit_email').value)) {
        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 == '') {
        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&' + Form.serialize($('exit_email_form')), {
        onSuccess: function (transport) {
            $('exit_email_container').innerHTML = transport.responseText;
        }
    });
    clearError();
    return false;
}

function showDeals () {
    toggleScreen();
    clearBubble();
    var from = normalizeAirport($('from').value);
    $('search_box_msg').innerHTML = 'Getting Amazing Deals...';
    $('search_msg').innerHTML = from;
    centerLoader('loader');
    serializedSearch = Form.serialize($('deals_form'));
    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();
    var from = normalizeAirport($('from').value);
    $('search_box_msg').innerHTML = 'Getting Amazing Deals...';
    $('search_msg').innerHTML = from;
    centerLoader('loader');
    serializedSearch = Form.serialize($('deals_form'));
    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();
}
