(function($) { 
    var settings = {
        'maxSpeed': 8,
        'accelleration': 1,
        'minTransparency': 0,
        'maxTransparency': 1,
        'scrollElementSelector': '#fbscroller',
        'smallElementsSelector': 'div.fbsmall',
        'largeElementsSelector': 'div.fblarge',
        'currentElementSelector': '#fbdefault',
        'containerElementSelector': '#fbcontainer'
    };
    
    var leftArrow;
    var rightArrow;
    var timer = scrolltimer = null;
    var isScrolling = false;
    var isAccellerating = false;
    var isDecellerating = false;
    var speed = 0;
    var currentPos = 0;
    
    var methods = {
        'init': function(options) {
            if ( options ) { 
                $.extend( settings, options );
            }
            
            leftArrow = $('<div/>', {
                'id': 'fbarrowleft',
                'class': 'fbarrow',
                'style': 'opacity:' + settings.minTransparency
            });
            rightArrow = $('<div/>', {
                'id': 'fbarrowright',
                'class': 'fbarrow',
                'style': 'opacity:' + settings.minTransparency
            });
            
            return this.each(function() {
                $(settings.containerElementSelector).css('overflow', 'hidden');
                $(settings.smallElementsSelector).each( function(index, item) {
                    $(item).find('a').each( function(index2, item2) {
                        // Remove the links from the divs
                        $(item2).removeAttr('href');
                    });
                    
                    // Set the cursor to pointer
                    $(item).css('cursor', 'pointer');
                    
                    // Add the click events to the divs (remember to bind)
                    $(item).bind('click', {'id': $(item).attr('id')}, methods.setCurrent);
                });
                
                if( $(settings.containerElementSelector).outerWidth() < $(settings.containerElementSelector).children().first().outerWidth() ) {
                    // Add events to arrows
                    leftArrow.mouseenter(methods.startLeft);
                    leftArrow.mouseleave(methods.stopLeft);
                    rightArrow.mouseenter(methods.startRight);
                    rightArrow.mouseleave(methods.stopRight);
                    // Add arrows to container
                    $(settings.containerElementSelector).after(leftArrow).after(rightArrow);
                    // Hide left arrow by default
                    methods.hideArrow('left');
                }
            });
        },
        'setCurrent': function(event) {
            var previous = $('.telefoonbox_selected');
            if (previous) {
                previous.removeClass('telefoonbox_selected');
            }
            
            var smallelement = $('#' + event.data.id);
            smallelement.addClass('telefoonbox_selected');
            
            // Get the element to be shown from the event, by replacing the id
            var element = event.data.id.replace('fbsmall_', 'fblarge_');
            if (settings.currentElementSelector != element) {
                $(settings.currentElementSelector).css('display', 'none');
                settings.currentElementSelector = '#' + element;
                $(settings.currentElementSelector).css('display', 'block');
            }
        },
        'startLeft': function(event) {
            $(event.target).css('opacity', settings.maxTransparency);
            speed = 0;
            methods.showArrow('right');
            methods.accellerate('left');
        },
        'startRight': function(event) {
            $(event.target).css('opacity', settings.maxTransparency);
            speed = 0;
            methods.showArrow('left');
            methods.accellerate('right');
        },
        'stopLeft': function(event) {
            if ($(event.target).css('visibility') == 'visible') {
                $(event.target).css('opacity', settings.minTransparency);
            }
            methods.decellerate('left');
        },
        'stopRight': function(event) {
            if ($(event.target).css('visibility') == 'visible') {
                $(event.target).css('opacity', settings.minTransparency);
            }
            methods.decellerate('right');
        },
        'hideArrow': function(direction) {
            if (direction == 'left') {
                leftArrow.css('opacity', 0);
            }
            else {
                rightArrow.css('opacity', 0);
            }
        },
        'showArrow': function(direction) {
            if (direction == 'left') {
                leftArrow.css('opacity', settings.minTransparency);
            }
            else {
                rightArrow.css('opacity', settings.minTransparency);
            }
        },
        'accellerate': function(direction) {
            window.clearTimeout(timer);
            if( speed < settings.maxSpeed ) {
                speed += (settings.accelleration / settings.maxSpeed);
                if( direction == 'left' ) {
                    currentPos += speed;
                    if( currentPos > 0 ) {
                        currentPos = 0;
                        methods.hideArrow(direction);
                    }
                    else {
                    }
                }
                else {
                    currentPos -= speed;
                    if( currentPos < -($(settings.scrollElementSelector).outerWidth() - $(settings.containerElementSelector).outerWidth()) ) {
                        currentPos = -($(settings.scrollElementSelector).outerWidth() - $(settings.containerElementSelector).outerWidth());
                        methods.hideArrow(direction);
                    }
                    else {
                    }
                }
                $(settings.scrollElementSelector).css('left', Math.round(currentPos) + 'px');
                timer = window.setTimeout(methods.accellerate, 10, direction);
            }
            else {
                methods.scroll(direction);
            }
        },
        'scroll': function(direction) {
            if( direction == 'left' ) {
                currentPos += settings.maxSpeed;
                if( currentPos > 0 ) {
                    window.clearTimeout(timer);
                    currentPos = 0;
                    methods.hideArrow(direction);
                }
            }
            else {
                currentPos -= settings.maxSpeed;
                if( currentPos < -($(settings.scrollElementSelector).outerWidth() - $(settings.containerElementSelector).outerWidth()) ) {
                    window.clearTimeout(timer);
                    currentPos = -($(settings.scrollElementSelector).outerWidth() - $(settings.containerElementSelector).outerWidth());
                    methods.hideArrow(direction);
                }
            }
            $(settings.scrollElementSelector).css('left', Math.round(currentPos) + 'px');
            window.clearTimeout(scrolltimer);
            scrolltimer = window.setTimeout(methods.scroll, 10, direction);
        },
        'decellerate': function(direction) {
            window.clearTimeout(scrolltimer);
            window.clearTimeout(timer);
            if( speed > 0 ) {
                speed -= (settings.accelleration / settings.maxSpeed);
                if( direction == 'left' ) {
                    currentPos += speed;
                    if( currentPos > 0 ) {
                        currentPos = 0;
                        methods.hideArrow(direction);
                    }
                    else {
                        timer = window.setTimeout(methods.decellerate, 10, direction);
                    }
                }
                else {
                    currentPos -= speed;
                    if( currentPos < -($(settings.scrollElementSelector).outerWidth() - $(settings.containerElementSelector).outerWidth()) ) {
                        currentPos = -($(settings.scrollElementSelector).outerWidth() - $(settings.containerElementSelector).outerWidth());
                        methods.hideArrow(direction);
                    }
                    else {
                        timer = window.setTimeout(methods.decellerate, 10, direction);
                    }
                }
                $(settings.scrollElementSelector).css('left', Math.round(currentPos) + 'px');
            }
            else {
            }
        }
    };

    $.fn.phonescroller = function(method) {
    
        
        // Method calling logic
        if ( methods[method] ) {
            return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        } else {
            $.error( 'Method ' +  method + ' does not exist on jQuery.phonescroller' );
        }
    }
})(jQuery);
