// Setup Shipping namespaces
Shipping = {};


Shipping.updateBasket = function(form, basket, code) {

    if( code == '' ){
        return;
    }

    jQuery.post(form.attr('action'), 
        {
            // tell the resource only to render the basket
            'basket_only': "1",
            'code': code
        }, 
        function(data) {
            // replace the basket
            jQuery(basket).empty();
            jQuery(basket).append(data);
        }
    );
}

Shipping.enhanceEUShippingOptions = function(basket) {
    var number_of_blocks = 3;

    var form = jQuery("#eu-shipping-options-form");

    var countries = jQuery("li", form);

    var countries_per_block = Math.ceil(countries.length / number_of_blocks);

    // replacement bits
    var container = jQuery("<div></div>");
    var blocks = new Array();
    for( var i = 0 ; i < number_of_blocks ; i++ ) {
        var inner = jQuery('<div class="eu-country-column" ><ul></ul></div>');
        container.append(inner);
        blocks.push(jQuery("ul", inner));
    }

    // enhance the countries
    countries.each(function(i) {
        var listElement = jQuery(this);
        var label = jQuery("label", listElement);

        blocks[Math.floor(i/countries_per_block)].append(listElement);

        var input = jQuery("input", label);
        var code = input.attr('value');
        if( input.attr('checked') ) {
            listElement.addClass('selected');
        }
        // inject an image
        label.prepend('<img src="/images/flags/'+code.toLowerCase()+'.png" />');
        // make the label clickable
        label.click( function() {
            var radio = jQuery('input:radio', this)[0];
            Shipping.resetUKShippingOptions();
            jQuery('.eu-country-column li').removeClass('selected');
            listElement.addClass('selected');
            Shipping.updateBasket(form, basket, radio.value);
        });
    });
    form.toggleClass("enhanced");
    form.toggleClass("clearfix");

    form.empty();
    form.append(container);

    // Make the header clickable
    var header = jQuery('#eu-shipping-options-header');
    header.empty();
    header.append('<img src="#" /><span style="text-decoration: underline;">EU Countries</span>');
    header.addClass('clickable');
    header.click( function() {
        Shipping.showHideShippingPanel('#eu-shipping-options-header', '#eu-shipping-options-panel');
    });
    jQuery('#eu-shipping-options-panel').addClass('visible');
    Shipping.showHideShippingPanel('#eu-shipping-options-header', '#eu-shipping-options-panel');
}

Shipping.enhanceUKShippingOptions = function(basket) {
    var form = jQuery('#uk-shipping-options-form');

    // Hide the submit
    jQuery('input:submit', form).hide();

    jQuery('.uk-shipping-option').each( function() {
        // Make changing the radio buttons submit the form.
        var description = jQuery('.description', this);
        var label = jQuery('label', this);
        var option = jQuery(this);

        label.click( function() {
            var radio = jQuery('input:radio', this)[0];
            if( radio.checked == true ) {
                jQuery('.uk-shipping-option .description').hide();
                jQuery('.uk-shipping-option').removeClass('selected');
                option.addClass('selected');
                description.show();
                Shipping.resetEUShippingOptions();
                Shipping.updateBasket(form, basket, radio.value);
            }
       })
    });

    // Hide various bits and bobs
    jQuery('.uk-shipping-option .description').hide();
    jQuery('.uk-shipping-option.selected .description').show();

    // Make the header clickable
    var header = jQuery('#uk-shipping-options-header');
    header.empty();
    header.append('<img src="#" /><span style="text-decoration: underline;">UK Options</span>');
    header.addClass('clickable');
    header.click( function() {
        Shipping.showHideShippingPanel('#uk-shipping-options-header', '#uk-shipping-options-panel');
    });
    jQuery('#uk-shipping-options-panel').addClass('visible');
    Shipping.showHideShippingPanel('#uk-shipping-options-header', '#uk-shipping-options-panel');
}

Shipping.resetUKShippingOptions = function() {
    jQuery('.uk-shipping-option').removeClass('selected');
    jQuery('.uk-shipping-option .description').hide();
    var form = jQuery('#uk-shipping-options-form');
    jQuery('input:radio[checked]', form).each( function() {
        this.checked = false;
    });
    var panel = jQuery('#uk-shipping-options-panel');
    panel.addClass('visible');
    Shipping.showHideShippingPanel('#uk-shipping-options-header', '#uk-shipping-options-panel');
}

Shipping.showHideShippingPanel = function(headerId, panelId) {
    var panel = jQuery(panelId);
    var headerImg = jQuery(headerId+" img");

    // Is there an option selected?
    // either checked or in IE's case just selected
    if(jQuery('input:radio[checked]', panel).length > 0
        || jQuery('.selected', panel).length > 0 ) {
        // Make sure the from remains visible
        panel.addClass('visible');
        panel.show();
        headerImg.attr('src', '/images/toggleclose.gif');
    }
    else {
        // toggle if it has a recognised class
        panel.toggleClass('visible');
        if( Shipping.hasClass( panel, 'visible' ) ) {
            panel.show();
            headerImg.attr('src', '/images/toggleclose.gif');
        }
        else {
            panel.hide();
            headerImg.attr('src', '/images/toggleopen.gif');
        }
    }
}

Shipping.hasClass = function(obj, testClass) {
    var classes = obj.attr('class');
    if( !classes ) {
        return false;
    }
    classes = classes.split(/\s+/);
    for( var i = 0 ; i < classes.length ; i++ ) {
        if( classes[i] == testClass ) {
            return true;
        }
    }
    return false; 
}

Shipping.resetEUShippingOptions = function() {
    jQuery('.eu-shipping-container li').removeClass('selected');
    var form = jQuery('#eu-shipping-options-form');
    jQuery('input:radio[checked]', form).each( function() {
        this.checked = false;
    });
    var panel = jQuery('#eu-shipping-options-panel');
    panel.addClass('visible');
    Shipping.showHideShippingPanel('#eu-shipping-options-header', '#eu-shipping-options-panel');
}

Shipping.enhanceShippingOptions = function(basket) {
    Shipping.enhanceUKShippingOptions(basket);
    Shipping.enhanceEUShippingOptions(basket);
}

