jQuery.fn.gmxteaser_carousel = function () {

    function repeat(str, num) {
        return new Array( num + 1 ).join( str );
    }
  
    return this.each(function () {
        var $wrapper = jQuery('> div.wrapper', this).css('overflow', 'hidden'),
            $slider = $wrapper.find('> ul'),
            $items = $slider.find('> li'),
            $single = $items.filter(':first'),

            singleWidth = $single.outerWidth(), 
            visible = Math.ceil($wrapper.innerWidth() / singleWidth), // note: doesn't include padding or border
            currentPage = 1,
            autoSlide = parseInt(jQuery(this).attr("timer")),
            timerSlide = null,
            flashname = null,
            pages = Math.ceil($items.length / visible); 


        // 1. Pad so that 'visible' number will always be seen, otherwise create empty items
        if (($items.length % visible) != 0) {
            $slider.append(repeat('<li class="empty" />', visible - ($items.length % visible)));
            $items = $slider.find('> li');
        }

        // 2. Top and tail the list with 'visible' number of items, top has the last section, and tail has the first
        $items.filter(':first').before($items.slice(- visible).clone().addClass('cloned'));
        $items.filter(':last').after($items.slice(0, visible).clone().addClass('cloned'));
        $items = $slider.find('> li'); // reselect
        
        // 3. Set the left position to the first 'real' item
        $wrapper.scrollLeft(singleWidth * visible);

        // 4. paging function
        function gotoPage(page) {
		    flashname = $items.filter('#ajaxsteaser'+currentPage).find('object,embed').attr('id');
            var dir = page < currentPage ? -1 : 1,
                n = Math.abs(currentPage - page),
                left = singleWidth * dir * visible * n;
            $navigation.find('li#nav_teaser'+currentPage).removeClass("current");
		    if (flashname != undefined) {
                if (flashname.indexOf('mp')!=-1) {
                    //getFlashMovieObject(flashname).sendEvent('STOP')
                    RestartFlashMovie(flashname);
                }
                flashname = null; 
		    }

            $wrapper.filter(':not(:animated)').animate({
                scrollLeft : '+=' + left
            }, 500, function () {
                if (page == 0) {
                    $wrapper.scrollLeft(singleWidth * visible * pages);
                    page = pages;
                } else if (page > pages) {
                    $wrapper.scrollLeft(singleWidth * visible);
                    // reset back to start position
                    page = 1;
                } 

                currentPage = page;
    			if (timerSlide) {
    			    flashname = $items.filter('#ajaxsteaser'+currentPage).find('object,embed').attr('id');
    			    if (flashname != undefined) {
                        PlayFlashMovie(flashname); 
    			    }
    				clearTimeout(timerSlide);
                    tempautoSlide = parseInt($items.filter('#ajaxsteaser'+currentPage).attr("timer"));		
                    if (!tempautoSlide) tempautoSlide = autoSlide;		
                    timerSlide = setTimeout(function(){f_autoSlide()}, tempautoSlide);
    			}
                $navigation.find('li#nav_teaser'+currentPage).addClass("current");
            });                
            
            return false;
        }
        
        $items.filter('li.gmxteaser_item').each(
            function(){ 
                if ( jQuery(this).attr('itemurl')!= '')
                    jQuery(this).find('div.full-content').before('<a class="teaserLink" target="' + jQuery(this).attr('targeturl') + '" href="' + jQuery(this).attr('itemurl') +'"></a>');
            } 
        );

        var $navigation = jQuery('> div.navigation', this);
        $navigation.find('li#nav_teaser'+currentPage).addClass("current");
        $navigation.find('li#.gmxteaser_item a').each(
            function(index){ 
                jQuery(this).bind('click',
                    function(event){
                        //event.preventDefault();
                        //alert(index + " - " +currentPage);
                        return gotoPage(index+1);
                    })
            }
        );
        
        // 5. Bind to the forward and back buttons
        $navigation.find('li#.gmxteaser_back a').click(function () {
            return gotoPage(currentPage - 1);                
        });
        
        $navigation.find('li#.gmxteaser_forward a').click(function () {
            return gotoPage(currentPage + 1);                
        });
        
		if (autoSlide) {
            tempautoSlide = parseInt($items.filter('#ajaxsteaser'+currentPage).attr("timer"));		
            if (!tempautoSlide) tempautoSlide = autoSlide;
			timerSlide = setTimeout(function(){f_autoSlide();}, tempautoSlide);
			$wrapper.hover(function(){ clearTimeout(timerSlide);}, function(){
				timerSlide = setTimeout(function(){f_autoSlide()}, tempautoSlide);
			});
		}
		// auto slide
		function f_autoSlide(){
			$navigation.find('li#.gmxteaser_forward a').trigger('click');
		};
		
        
    });  
};

jQuery(document).ready(function () {
  jQuery('.gmxteaser_carousel').gmxteaser_carousel();
});


function getFlashMovieObject(movieName)
{
  if (window.document[movieName]) 
  {
    return window.document[movieName];
  }
  if (navigator.appName.indexOf("Microsoft Internet")==-1)
  {
    if (document.embeds && document.embeds[movieName])
      return document.embeds[movieName]; 
  }
  else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
  {
    return document.getElementById(movieName);
  }
}

function isJWplayer(movieName)
{
  if (window.document[movieName]) 
  {
    if (window.document[movieName].nodeName == "OBJECT")
        if (typeof(window.document[movieName].data) != 'undefined')
            return false;
        else {
            return (window.document[movieName].object.Movie.indexOf('mediaplayer.swf') != -1);
        }
    else
        return (window.document[movieName].src.indexOf('mediaplayer.swf') != -1);
  }
  if (navigator.appName.indexOf("Microsoft Internet")==-1)
  {
    if (document.embeds && document.embeds[movieName])
      return (document.embeds[movieName].src.indexOf('mediaplayer.swf') != -1); 
  }
  else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
  {
    return (document.getElementById(movieName).object.Movie.indexOf('mediaplayer.swf') != -1);
  }
}

function RestartFlashMovie(movieObj)
{
	var flashMovie=getFlashMovieObject(movieObj);
    if (isJWplayer(movieObj))
        flashMovie.sendEvent("STOP","true")
    else {
    	flashMovie.StopPlay();
    	flashMovie.Rewind();
    }
}

function StopFlashMovie(movieObj)
{
	var flashMovie=getFlashMovieObject(movieObj);
	flashMovie.StopPlay();
}

function PlayFlashMovie(movieObj)
{
	var flashMovie=getFlashMovieObject(movieObj);
	//variante per JWplayers
    if (isJWplayer(movieObj))
        flashMovie.sendEvent("PLAY","true")
    else
	    flashMovie.Play();
	//embed.nativeProperty.anotherNativeMethod();
}

function RewindFlashMovie(movieObj)
{
	var flashMovie=getFlashMovieObject(movieObj);
	flashMovie.Rewind();
}

function NextFrameFlashMovie(movieObj)
{
	var flashMovie=getFlashMovieObject(movieObj);
	// 4 is the index of the property for _currentFrame
	var currentFrame=flashMovie.TGetProperty("/", 4);
	var nextFrame=parseInt(currentFrame);
	if (nextFrame>=10)
		nextFrame=0;
	flashMovie.GotoFrame(nextFrame);		
}


function ZoominFlashMovie(movieObj)
{
	var flashMovie=getFlashMovieObject(movieObj);
	flashMovie.Zoom(90);
}

function ZoomoutFlashMovie(movieObj)
{
	var flashMovie=getFlashMovieObject(movieObj);
	flashMovie.Zoom(110);
}


function SendDataToFlashMovie(movieObj)
{
	var flashMovie=getFlashMovieObject(movieObj);
	flashMovie.SetVariable("/:message", document.controller.Data.value);
}

function ReceiveDataFromFlashMovie(movieObj)
{
	var flashMovie=getFlashMovieObject(movieObj);
	var message=flashMovie.GetVariable("/:message");
	document.controller.Data.value=message;
}


