jQuery.fn.liScroll = function(settings) {
		settings = jQuery.extend({
		travelocity: 0.3
		}, settings);		
		return this.each(function(){
				var $strip = jQuery(this);
				$strip.addClass("newsticker")
				var stripWidth = 0;
				var $mask = $strip.wrap("<div class='mask'></div>");
				var $tickercontainer = $strip.parent().wrap("<div class='tickercontainer'></div>");								
				var containerWidth = $strip.parent().parent().width();	//a.k.a. 'mask' width 	
				$strip.find("li").each(function(i){
				stripWidth += jQuery(this, i).outerWidth(true) + 30; // thanks to Michael Haszprunar
				});
				$strip.width(stripWidth);			
				var totalTravel = stripWidth+containerWidth;
				var defTiming = totalTravel/settings.travelocity;	// thanks to Scott Waye		
				function scrollnews(spazio, tempo){
				$strip.animate({left: '-='+ spazio}, tempo, "linear", function(){$strip.css("left", containerWidth); scrollnews(totalTravel, defTiming);});
				}
				scrollnews(totalTravel, defTiming);				
				$strip.hover(function(){
				jQuery(this).stop();
				},
				function(){
				var offset = jQuery(this).offset();
				var residualSpace = offset.left + stripWidth;
				var residualTime = residualSpace/settings.travelocity;
				scrollnews(residualSpace, residualTime);
				});			
		});	
};


$(function() {

    $("ul#news_band").css("visibility", "visible" );
    $("ul#news_band").liScroll({travelocity: 0.1}); 


    var carousel   = $('#news_carousel');
    var news       = carousel.find('ul.news');
    var controls   = null; // Will hold the ul with the controls
    var timer      = null; // Will hold the timer div
    var wait       = 5000; // Milliseconds to wait for auto-switching
    var widths     = [];   // Will hold the widths of each image
    var items_size = news.find('li').length;
    var initialized = false;
 
    if (!items_size) { return; }
 
 
    $('#news_carousel p').fadeTo(1, 0.7);
    
    // Controls html to append
    var controls_str = '<ul class="controls">';
    for ( var i = 1; i <= items_size; i++) {
       controls_str += '<li><a href="#">' + i + '</a></li>';
    }
    controls_str += '</ul>';
 
    // Cache the controls list
    controls = carousel.append(controls_str).find('ul.controls');

    $('#news_carousel ul.controls li a').fadeTo(1, 0.7);
    
 
    // Make the first button in controls active
    controls.find('li:first a').addClass('active');
 
    // Hook to the controls' click events
    controls.find('li a').click(function(event) {
      move_news( $(this) );
      return false;
    });
 
    // Append the timer and cache it
    timer = carousel.append('<div class="timer"></div>').find('div.timer');
 
    // Store each item's width and calculate the total width
    news.find('li img')
        .each(function(i, e) {
            widths[i] = $(e).width();          
            if ( all_images_loaded() ) { init_carousel(); }
        })        
        .load(function(e) {
            var i = news.find('li img').index(this);
            widths[i] = $(this).width();
            if ( all_images_loaded() ) { init_carousel(); }
        });
 
 
    function all_images_loaded() {
      return (items_size == widths.length) && (jQuery.inArray(0, widths) < 0);
    }
 
 
    function move_news( new_active ) {
 
      // Move unless it is already moving
      if ( $('#news_carousel ul.news:animated').length > 1 ) {
        return false;
      }    
 
      var current_active = controls.find('li a.active');
 
      if (new_active == 'next') {
        var next = current_active.parent().next().find('a');
 
        if ( !next.length ) { next = controls.find('li:first a'); }
 
        new_active = next;
      }
 
      var current_index = parseInt(current_active.text(), 10) - 1;
      var new_index     = parseInt(new_active.text(), 10) - 1;
      var move_to       = new_index - current_index;
 
 
      if (!move_to) { return false; }
 
      var direction = (move_to > 0)? '-=': '+=';
 
      var move   = 0;
      var bottom = Math.min(current_index, new_index);
      var top    = Math.max(current_index, new_index);
 
      while (bottom < top) {
        move += widths[bottom];
        bottom++;
      }
 
      news.animate({marginLeft: direction + move }, 500);
      new_active.addClass('active');
      current_active.removeClass('active');
    }
 
    function animate_timer() {
      timer.stop().css({width: '100px'}).animate({width: '1px'}, wait);
    }
 
    // Initializer, called when all images are loaded
    function init_carousel() {
      if (initialized) { return false; }
 
      // Set the news ul total width
      var width = 0;
      for( var i = 0; i < widths.length; i++) { width += widths[i]; }
      news.width(width);
 
      // Make the news change every X seconds
      setInterval(function() { move_news('next'); animate_timer(); }, wait);
      animate_timer();
 
      initialized = true;
    }
});