(function($) {
    var $previous = null;
    
    $.fn.AddressSlider = function(options) {
        var settings = {
            'pidData': null,
            'showCallback': null,
            'hideCallback': null,
            'animationDuration': 500,
            'isCTA': false,
            'leftMargin': 0,
            'leftBound': 0
        }
        
        var config = $.extend({}, settings, options)

        this.each(function() {
            var context = {
                container: this,
                pidData: config.pidData,
                config: config
            }
            
            $(this).find('a:last').bind('click', context, $.fn.AddressSlider.show);
            $('.address-xbutton').unbind().bind('click', context, $.fn.AddressSlider.hide);
        });
        
        return this;
    }
    
    $.fn.AddressSlider.show = function(evt) {
        evt.preventDefault();
        
        var $container = $(evt.data.container);
        var pidData = evt.data.pidData;
        var config = evt.data.config;
        
        if ($previous != null) {
            $.fn.AddressSlider.hide(evt);
            $('#login-box').hide(); // to prevent 'the blink' on the cta
        }

        // empty out values
        $('#scKey').val('');
        $('#spId').val('');
        $('#keyword').val('');
        $('#packageID').val('');
        $('#scpId').val('');
        
        if (pidData != null) {
            var $a = $(evt.target).parent();
            if ($a) {
                var pid = $a.attr('href').match(/\?id=(\d+)/).pop();
                $('#scKey').val(pidData[pid].scKey);
                
                if (pidData[pid].spId != '' 
                    && pidData[pid].keyword != '') 
                {
                    $('#spId').val(pidData[pid].spId);
                    $('#keyword').val(pidData[pid].keyword);
                } else {
                    $('#packageID').val(pidData[pid].packageId);
                    $('#scpId').val(pidData[pid].scpId);
                }
            }
        }
        
        if (config.isCTA == true) {
            $('body').addClass('ctaLogin').removeClass('gridLogin');
            
            $.fn.AddressSlider.showAddressBox(config, $container);
        } else {
            $('body').addClass('gridLogin').removeClass('ctaLogin');
    
            $container.fadeTo(config.animationDuration, 0, function() {
                $.fn.AddressSlider.showAddressBox(config, $container);
            });
        }
        
        if (config.showCallback != null) {
            config.showCallback.call(evt, $container, $previous);
        }
        
        $previous = $container;
    }
    
    $.fn.AddressSlider.showAddressBox = function(config, $container) {
        $('.login-box').css({
            'position': 'absolute',
            'left'    : config.leftBound
        });
        
        $('#login-box').css({
            'top'     : $container.offset().top,
            'height'  : $container.height(),
            'left'    : 0,
            'display' : 'none',
            'overflow': 'hidden'
        }).fadeIn(config.animationDuration, function() {
            if (!$.support.opacity) {
                $('#login-box').get(0).style.removeAttribute('filter');
            }
            
            $('.login-box').animate({
                'left': config.leftMargin
            }, config.animationDuration);
        });
    }
    
    $.fn.AddressSlider.hide = function(evt) {
        var config = evt.data.config;
        var $container = $(evt.data.container);
        
        if (config.hideCallback != null) {
            config.hideCallback.call(evt, $container, $previous);
        }
        
        $('#login-box').fadeOut(config.animationDuration, function() {
            $('.login-box').css({ 'left': config.leftBound });
        });
        
        $previous.fadeTo(config.animationDuration, 1);
    }
})(jQuery);