var running = new Array();
var show_loader = false;
var rid = 0;

jQuery(document).ready(function() {

       $("#loading").bind("ajaxSend", function(){
               if ( show_loader )
                   $(this).show();
           }).bind("ajaxStop", function(){
                   $(this).hide();
                   show_loader = false;
               });
       
       var bo = $("#booking_overview").attr('id');       
       if ( bo )
           reload_overview();

       var so = $("#special_offers_box").attr('id');
       if ( so )
           bulletins();

       var co = $("#chat_container").attr('id');
       if ( co )
           insert_chat();       
       
       
    });

function urlprefix() {
    return $("#_cruise_prefix").val();
}



/* AJAX functions */

function set_ships(def, callback) {

    if ( ! def )
        def = 0;    

    var cl = $("#cruiseline").val();
    if (! cl)
        cl = '';    

    var reg = $("#regions").val();
    if ( ! reg )
        reg = '';
    
    $.getJSON( urlprefix() + "/cruise/view/ships", {cruiseline: cl,
                                                    region: reg }, function(data) {

            $("#ships").empty();
            
            for ( ship in data ) {
                var sel = '';
                
                if ( data[ship].id == def )
                    sel = 'selected';
                
                $("#ships").append('<option ' + sel + ' value="' + data[ship].id + '">' + data[ship].shipname + '</option>');
            }

            if ( callback )
                callback();            
        });
}

function set_ports(def) {
    var cl = $("#cruiseline").val();
    var ship = $("#ships").val() || 0;    

    if ( ! def )
        def = 0;
    
    $.getJSON( urlprefix() + "/cruise/view/cruiseline_ports",
           {cruiseline: cl,
            ship: ship }, function(data) {

               $("#ports").empty();
            
               for ( port in data ) {
                   var sel = '';
                   
                   if ( data[port].id == def )
                       sel = 'selected';
                   
                   $("#ports").append('<option ' + sel + ' value="' + data[port].id + '">' + data[port].portname + '</option>');
               }

           });    
}


function set_regions(def) {
    var cl = $("#cruiseline").val();
    var ship = $("#ships").val() || 0;    

    if ( ! def )
        def = 0;

    $.getJSON( urlprefix() + "/cruise/view/regions",
           {cruiseline: cl,
            ship: ship }, function(data) {

            $("#regions").empty();

            for ( region in data ) {
                var sel = '';

                if ( data[region].id == def )
                    sel = 'selected';
                
                $("#regions").append('<option ' + sel + ' value="' + data[region].id + '">' + data[region].areaname + '</option>');
            }

        });
}

function set_dates(def) {
    var cl = $("#cruiseline").val();
    var ship = $("#ships").val() || 0;    

    if ( ! def )
        def = 0;
    
    $.getJSON( urlprefix() + "/cruise/view/cruiseline_dates",
           {cruiseline: cl,
            ship: ship }, function(data) {

               $("#dep_dates").empty();

               for ( d in data ) {
                   var sel = '';

                   if ( data[d].value == def )
                       sel = 'selected';
                   
                   $("#dep_dates").append('<option ' + sel + ' value="' + data[d].value + '">' + data[d].text + '</option>');
               }

           });    
}


function set_durations(def) {
    var cl = $("#cruiseline").val();
    var ship = $("#ships").val() || 0;    

    if ( ! def )
        def = 0;
    
    $.getJSON( urlprefix() + "/cruise/view/cruiseline_durations",
           {cruiseline: cl,
            ship: ship }, function(data) {

               $("#durations").empty();
               
               for ( d in data ) {
                   var sel = '';
                   
                   if ( data[d].value == def )
                       sel = 'selected';
                   
                   $("#durations").append('<option ' + sel + ' value="' + data[d].value + '">' + data[d].text + '</option>');
               }

               
           });
}

function cabins_available (cabinclass) {

    if (! cabinclass)
        cabinclass = $("input[name='cabinclass']:checked").val();


    
    var selid = $("input[name='cabinclass']:checked").attr('id');
    var ctype = $("label[for='" + selid + "']").html();
    //Header
    $("#cabin_select_extra_header").html(ctype);
        

    var ptabs = $("#available_cabins_byprice");
    var dtabs = $("#available_cabins");

    var atab = 0;
    var pselected = dtabs.is(':visible');
    
    if ( dtabs.is(':visible'))
        atab = dtabs.tabs('option', 'selected');
    else if (ptabs.is(':visible'))
        atab = ptabs.tabs('option', 'selected');
    
    
    progress_text("Getting available cabins...");
    
    var con = $("#connecting").attr('checked') ? '1' : 0;
    var pos = $("#cabinposition").val();
    var chc = $("input[name='chosen_cabin']:checked").val();

    var currtext = $("#currently_cabins").html(chc);
    
    var callback = function() {
        deckmap_links();
        $("#toggle_cabin_a").html($("#avail_text_deck").val());

        var ptabs = $("#available_cabins_byprice");
        var dtabs = $("#available_cabins");
        
        if ( pselected ) {
            toggle_cabin_list();
            ptabs.tabs('select', atab);
        } else {
	    // Why is this necessary?
            dtabs.tabs('select', atab + 1);
            dtabs.tabs('select', atab);
        }
        
        $("#a_cabins_tab_header").effect("highlight", {'color' : '#ffb400'}, 2000);
        $("#tabs").tabs('select', 0);
    };

    var paramstring = "cabinclass=" + cabinclass + "&connecting=" + con + "&position=" + pos + "&chosen_cabin=" + chc;
    do_remote('cabins', false,  urlprefix() + "/cruise/booking/available_cabins", paramstring, callback);
}

function translate_into (id, text) {
    do_remote(id, true, '/cruise/translate', 'text='+text);
}


function my_alert(text) {
    text = '<div class="warning">' + text + '</div><br/><div class="centered"><input type="button" onclick="$.fancybox.close();" value="Close"/></div>';    
    $("#error_content").html(text);
    $("#cruise_alert_box").click();
}

    

function warn (text) {
    $.post("/cruise/translate",
           {text: text},
           function(xml) {
               my_alert(xml);
           });
}

function my_prompt(text) {
    var ret = false;
    var callback = function(xml) {
        ret = confirm(xml);
    };
    
    do_remote('', true, '/cruise/translate', 'text=' + text, callback, 1);
    return ret;
}


function progress_text (text){
    $("#loading_text").html(' ');
    translate_into("loading_text", text);
}


function reload_overview(callback) {
    do_remote('booking_overview', true,  urlprefix() + '/cruise/booking/booking_overview', '', callback);
}

function insert_chat() {
    do_remote('chat_container', true,  urlprefix() + '/cruise/view/chat', '');
}


function do_remote(id, sync, url, paramstring, callback, post) {

    paramstring = paramstring ? paramstring + '&' : '';    
    paramstring = paramstring + "_rand=" + Math.floor(Math.random()*1000000);

    var index = rid;    
    rid++;
    
    show_loader = true;
    
    running[index] = $.ajax({
          mode: 'queue',
          async: !sync,
          url: url,
          type: (post ? 'POST' : 'GET'),
          data: paramstring,
          success: function(html) {        
                running[index] = false;
                if ( id )
                    $("#" + id).html(html);
                if ( callback )
                    callback(html);
            },
          error: function(xhr, textstatus, errorthrown) {
                running[index] = false;
                switch (xhr.status) {
                    case 503:
                        alert("Your session timed out");
                        cancel_ajax_requests();
                        document.location.replace('/cruise');
                        break;
                    default:
                        cancel_ajax_requests();
                        var r = /^SOFTERR:(.*)/;
                        if ( xhr.responseText.match(r) )
                            my_alert(RegExp.$1);
                        else
                            alert("The backend system encountered an error while performing an AJAX operation:\n\n\"" + xhr.responseText + "\"\n\nPlease reload this page to try the operation again");
                        
                        break;
                }
                
            }
            
        });    

    
}

function cancel_ajax_requests() {
    var i;

    for (i = 0; i < rid; i++) {
        if ( running[i] )
            running[i].abort();        
    }    
}

function get_dinings(cabin) {
    do_remote('', false,  urlprefix() + '/cruise/booking/dinings/' + cabin, '');
}



/* Other functions */


function open_popup(url, width, height, title) {

    if(! width)
        width = 700;
    if(!height)
        height = 600;         

    title = title ? title : 'cruisepopup';    
    
    window.open(url, title, 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width=' + width + ',height=' + height).focus();
}

function cabininfo (id, ba) {
    var chc = $("input[name='chosen_cabin']:checked").val();
    ba = ba ? 1 : 0;
    open_popup( urlprefix() + '/cruise/view/cabin/' + id + '/' + chc + '?ba=' + ba);
}

function portinfo (id, name) {
    open_popup( urlprefix() + '/cruise/view/portdetails/' + id + '?name=' + name);
}


function goloc (url, prompt) {

    if ( prompt )
        if (! confirm(prompt))
            return false;
    
    
    document.location.replace(url);
}


function cabin_distribution (p, use_def)  {
    var cabins = $("#cabins").val();
    var guests = $("#guests").val();    

    
    if ( p > 0 && guests != p )
        if ( ! my_prompt("If you change the number of guests while already having selected one or more cabins, you must re-select the cabin with the changed number of guests. This is to make sure the cabin can hold the correct number of guests, as well as to update the price information") ) {
            $("#guests").val(p);
            guests = p;
        }
    
    
    if ( cabins <= 1 && guests < 5 ) {
        $("#cabindistribution").html(' ');
        return;
    }
    
    var paramstring = "cabins=" + cabins + "&guests=" + guests;
    if ( use_def )
        paramstring += '&use_default=1';    

    do_remote('cabindistribution', false,  urlprefix() + "/cruise/booking/cabin_distribution", paramstring);
}


function check_valid_distribution() {

    var max = parseInt($("#guests").val());
    var cabins = $("#cabins").val();    
    var guests = 0;
    var sum = 0;

    if ( max <= 4 && cabins == 1)
        return true;    
    
    $("select[id^='c_dist_']").each(function() 
                                    {
                                        sum = sum + parseInt($(this).val());                                        
                                    });

    if ( sum != max) {
        warn("Please specify the same total number of guests for the cabins as for the cruise");
        return false;
    }
    
    
}


function hold_cabin (cabin, connecting, extra)  {

    var hold = function() {

        var chc = $("input[name='chosen_cabin']:checked").val();

        if ( ! connecting )
            connecting = 0;
    
        document.location.replace( urlprefix() + '/cruise/booking/hold_cabin/' + cabin + '/' + chc + '/' + connecting);
    };

    var tr = $("#cabin_" + extra + "_tr_" + cabin);
    tr.effect("highlight", {'color' : '#ffb400'}, 1000, hold);
}

function hold_gty_cabin (cabin, extra, cat)  {

    var hold = function() {

        var chc = $("input[name='chosen_cabin']:checked").val();        
        document.location.replace( urlprefix() + '/cruise/booking/hold_gty_cabin/' + cabin + '/' + chc + '/' + cat);
    };

    var tr = $("#cabin_" + extra + "_tr_" + cabin);
    tr.effect("highlight", {'color' : '#ffb400'}, 1000, hold);
}


function check_all_dinings (cabins) {

    var ok = 1;
    var checked = $("input[id^='selected_dining_']:checked");
    var v = $("input[id^='selected_dining_']:checked:first").val();
    
    if ( checked.size() == cabins)
        $("#continue_booking").fadeIn(800);
    
    checked.each(function() 
                 {
                     if ( $(this).val() != v)
                         ok = 0;
                 });
    
    if ( ok && checked.size() == cabins ) {        
        $("#link_dinings_box").removeAttr('disabled');
        $("#link_dinings").fadeIn(800);
    } else {
        $("#link_dinings_box").attr('disabled', true);
        $("#link_dinings").fadeOut(800);
    }
    
}


function check_guest_rows(prefix, rows, relaxed) {
    var row;
    var subrow;
    var ok = validate_guest_row(prefix, 1, relaxed);
    
    if ( ! relaxed ) {
        $("#verify_indicator").show();
    }

    if ( ok )
        for ( subrow = 1; subrow < 3; subrow++ ) {
            if ( ! validate_guest_row(prefix, 1, relaxed, subrow) ) {
                ok = false;
                break;                
            }
        }
    
    if (ok) 
        for ( row=2; row <= rows; row++) {        
            if ( ! validate_guest_row(prefix, row, relaxed) ) {
                ok = false;
                break;
            }
        }
    
    if ( ! relaxed )
        $("#verify_indicator").hide();
    
    return ok;    
}

function no_empty_rows(prefix) {
    var ok = 1;
    
    var elements = $("input[id^='" + prefix + "']");    
    elements.each(function() 
                  {
                      if ( $(this).val() == '' )
                          ok = 0;
                  });
    
    return ok;
}


function validate_guest_row(prefix, row, relaxed, subrow) {

    var ret;
    relaxed = relaxed ? 1 : 0;
    
    var pstring = 'level=' + (subrow ? subrow : 0) + "&relaxed=" + relaxed + '&';
    
    if ( subrow == 1 ) {
        var ad = $("#" + prefix + "_ad_" + row).val();
        var po = $("#" + prefix + "_po_" + row).val();
        var ct = $("#" + prefix + "_ct_" + row).val();        
        pstring += 'address=' + escape(ad) + '&postal=' + escape(po) + '&city=' + escape(ct);
    }
    else if ( subrow == 2 ) {
        var ph = $("#" + prefix + "_ph_" + row).val();
        var pp = $("#" + prefix + "_phpr_" + row).val();
        var em = $("#" + prefix + "_em_" + row).val();
        pstring += 'phone=' + escape(ph) + '&email=' + escape(em) + '&phone_prefix=' + escape(pp);
    }
    else {        
        var fn = $("#" + prefix + "_fn_" + row).val();
        var ln = $("#" + prefix + "_ln_" + row).val();
        var ag = $("#" + prefix + "_ag_" + row).val();
        pstring += 'firstname=' + escape(fn) + '&lastname=' + escape(ln) + '&age=' + escape(ag);
    }


    var callback = function(xml) {
        var data = window.JSON.parse(xml);
        var out = '';
        var status = 'ok';
        
        if ( ! data.verified ) {
            out = '<ul style="font-size: 85%; color: red">';
            for (m in data.message ) {
                out += '<li>' + data.message[m] + '</li>';
            }
            out += '</ul>';
            status = 'failed';            
        } else {
            out = '<img src="/cruise/static/images/checked.gif">';
            if ( subrow )
                $("#row_failed_" + row + "_" + subrow).html('');
            else
                $("#row_failed_" + row).html('');            
        }
        
        if ( subrow )
            $("#row_" + status + "_" + row + "_" + subrow).html(out);
        else
            $("#row_" + status + "_" + row).html(out);

        ret = data.verified ? true : false;
    };

    do_remote('', true, urlprefix() + '/cruise/booking/verify_guest_info', pstring, callback, 1);
    
    return ret;
}

function check_all_guest_input(prefix, row, subrow)  {
    check_guest_rows(prefix, row, 1, subrow);    
}

function fade_toggle_elem(c, id) {
    var e = $("#" + id);
    if ( $(c).is(':checked'))    
        e.fadeIn(800);
    else
        e.fadeOut(800);
}

function checkfield (from, type) {
    var handle = $("#" + from.id);    
    var val = handle.val();    
    var specific;    
    var r;
    
    switch(type) {
        case 'text':
            r = /^\w+.*$/;
            specific = 'description';
            break;            
            ;;
        case 'date':
            r = /^\d+-\d+-\d+$/;
            specific = 'date';
            break;            
            ;;
        case 'years':
            r = /^\d+$/;
            specific = 'number of years';
            break;            
            ;;

        default:
            r = /.*/;
            ;;
    }

    if ( ! r.test(val) )  {
        warn("Please specify a valid " + specific);
        handle.css('background', '#e70101');
        setTimeout( function() {
                handle.focus();
                handle.select();
            }, 10);
    } else {
        handle.css('background', '#57d214');
    }
    
    

}

function expand_selected(prefix, eid)  {
    var elements = $("input[id^='" + prefix + "']:checked");

    elements.each(function() 
                  {
                      r = /_(\d+)$/;
                      
                      $(this).attr('id').match(r);
                      var id = eid + $(this).val() + '_' + RegExp.$1;
                      fade_toggle_elem($(this), id);
                  });    
    
}


function do_booking_dialog() {

    if ( ! $("#accept_terms").is(':checked')) {
        warn("Please read and accept the terms and regulations");
        return false;
    }

    if ( ! $("#cancel_yes").is(':checked') &&
         ! $("#cancel_no").is(':checked') ) {
        warn("Please make a choice for cancellation protection");
        return false;        
    }
    

    if ( ! my_prompt("This will create your booking. Are you sure?") )
        return false;

    $("#do_booking").attr('disabled', true);
    $("#cancel_booking_button").attr('disabled', true);
    $("#booking_indicator").fadeIn(800);

    return true;    
}

function check_cabin_num(id) {
    var cnum = $("#lookup_cabin_num").val();
    var chc = $("input[name='chosen_cabin']:checked").val();
    id.href = urlprefix() + '/cruise/view/cabin/' + cnum + '/' + chc + '?ba=1';
}

function set_value(name, val) {
    do_remote('booking_status', true, urlprefix() + '/cruise/booking/set_session/' + name + '/' + val);
}

function enable_booking_button(enable, id1) {    
    if ( $("#cancel_yes").is(':checked') ||
         $("#cancel_no").is(':checked')) {
        fade_toggle_elem($("#" + enable), id1);
    }
}

function cabin_deckplan(id) {
    var cnum = $("#lookup_cabin_num").val();
    id.href = urlprefix() + '/cruise/view/deckplan/DUMMY' + '/' + cnum;
}

function enable_cabin_links(box) {
    var v = box.value;

    if ( v.length >= 3 ) 
        $("#check_c_avail").fadeIn(800);
    else 
        $("#check_c_avail").fadeOut(800);
}

function deckmap_links() {
    var h = '<table><tr><td valign="top"><span class="small">';
    var cnt = 0;
    
    $("#deckplan_list").empty();
    
    $("a[class='deckindex']").each(function(){
            var index = $(this).attr('rel');
            var title = $(this).html();            
            var link = urlprefix() + '/cruise/view/deckimage/deckplans/' + index + '/full/unscaled';
            h = h + '&nbsp;<a href="' + link + '" class="imagelightbox">' + title + '</a><br/>';
            cnt++;
            if ( cnt > 3 ) {
                h = h + '</span></td><td valign="top"><span class="small">';
                cnt = 0;
            }
        });

    h = h + '</span></td></tr></table>';
    $("#deckplan_list").html(h);
    $("a[class='imagelightbox']").fancybox({'type': 'image'});
}

function show_only(id, new_timeout) {

    var next = $("#" + id + " + div").attr('id');
    if ( ! next )
        next = $("#special_offers_box > div:first").attr('id');

    $("#special_offers_box > div").each(function() {
            if ( id == $(this).attr('id') )
                $(this).fadeIn(800);
            else 
                $(this).css('display', 'none');
        });

    setTimeout("show_only('" + next + "', " + new_timeout + ")", new_timeout * 1000);
}

        
function bulletins() {
    var timeout = 0;
    var num_offers = $("#special_offers_box > div").size();    
    var mt = num_offers * 15;

    if ( num_offers <= 1 ) {
        $("#special_offers_box > div").fadeIn(800);
        return;
    }
    
    var id = $("#special_offers_box > div:first").attr('id');
    show_only(id, 15);
}

function toggle_cabin_list() {
    var dlist = $("#available_cabins");
    var plist = $("#available_cabins_byprice");

    if ( dlist.is(':visible') ) {
        dlist.hide();
        plist.fadeIn(800);
        plist.tabs().tabs('select', 0);
        $("#toggle_cabin_a").html($("#avail_text_price").val());
    } else {
        plist.hide();        
        dlist.fadeIn(800);
        dlist.tabs().tabs('select', 0);
        $("#toggle_cabin_a").html($("#avail_text_deck").val());
    }    
}

function close_error_popup(id) {
    $("#" + id).hide();
}

function init_embedded_search(ship, port, region, duration, date) {
    var callback = function() {
    
        set_ports(port);
        set_regions(region);
        set_durations(duration);        
    };

    set_ships(ship, callback);
    
}

