$.fn.photoslide = function( settings )
{
    var container = this;
    var mainPhoto = $();
    var mainPhotoWrap = $();
    var loading = $('<div id="photoslide_loading" />');
    var title = $('<span/>');

    var activeGroup = null;
    var activeSlide = null;

    var animateStopped = true;
    var loaded = false;
    var lastGroup = null;

    var slideShowTimeout = null;
    var waitUserTimeOut = null;
    var loadingTimeOut = null;

    var roomLink = null;
	var bookingArea = $('.b-foto-rooms-info');

    var defaultSettings = {
        'thumbsNumber': 3,
        'preload': true,
        'animateSpeed': 300,
        'animateAutoSpeed': 800,
        'slideShow': true,
        'slideShowDelay': 5000,
        'slideShowFirstSlideDelay': 7000,
        'slideShowStartDelay': 5000
    };

    init();

    function _setActiveGroup( group, cb )
    {
        if ( activeGroup != null )
        {
            activeGroup.removeClass("active");
        }
        activeGroup = $(".groups a[rel="+group+"]", container);
        activeGroup.addClass("active");


        $(".slides li", container).css('display', 'none');

        $(".slides li:has(a[rel="+group+"])", container).fadeIn('slow', function() {
            if ( typeof( cb ) == 'function' ) cb();
        });
        //$(".slides").css('left', '0px');

    }

    function _handleChangeGroup( event )
    {
        _destroyTimers();
        var group = $(this).attr("rel");

        var li = $(".slides li:has(a[rel="+group+"])", container).filter(":first");
        $("a", li).click();
        li.click();

        event.preventDefault();
    }

    function _handleChangeSlide( event )
    {
        _destroyTimers();
        _changeSlide( $(this), function(){}, true );

        event.preventDefault();
    }

    function _destroyTimers()
    {
        clearTimeout( slideShowTimeout );
        clearTimeout( waitUserTimeOut );

        waitUserTimeOut = setTimeout( _startSlideShow, settings.slideShowStartDelay );
    }

    function _autoChangeSlide( slideContainer )
    {
        _destroyTimers();

        var slide = $('a', slideContainer);

        var group = slide.attr("rel");
        if (lastGroup != group)
        {
            _setActiveGroup( group, function() {slideContainer.click();} );
            lastGroup = group;
        }

        _changeSlide( slide, function(){slideContainer.click();}, false );
    }

    function _changeSlide( slide, cb, onclick )
    {
        //if (!animateStopped) return;
        var group = slide.attr("rel");
        if (lastGroup != group)
        {
            _setActiveGroup( group );
            lastGroup = group;
        }

        if ( activeSlide != null )
        {
            activeSlide.removeClass("active");
        }

        activeSlide = slide;
        activeSlide.addClass("active");

        _cbChangeSlide( slide, cb, onclick );
    }

    function _cbChangeSlide( slide, cb, onclick )
    {
        var isPhotoVisible = ($(mainPhoto).css('opacity') == '1') ? true : false;

        loadingElement = new Image();
        loadingElement.onload = function() {
            loadingElement.onload = null;

            clearTimeout( loadingTimeOut );
            loaded = true;
            _toggleLoading();

            title.fadeOut('fast');

            $( isPhotoVisible ? mainPhotoWrap : mainPhoto ).css('background', 'url(' + this.src + ') no-repeat');

            var onImageLoad = function()
            {
				roomId = $(".room-id", slide).text();
				if(roomId)
				{
					bookingArea.css({'display': 'block'});
					title.text( slide.attr("title") );
					roomLink.attr("href", "/room/details/id/" + roomId);
					roomPrice.text( $(".room-price", slide).text() );
					title.fadeIn();
				}
				else
				{
					bookingArea.css({'display': 'none'});
				}

                animateStopped = true;
                loaded = true;
                _toggleLoading();

                if ( typeof( cb ) == 'function' )
                {
                    cb();
                }

                _preloadImage();
            }

            animateStopped = false;

            var opacity = 0;
            if ( !isPhotoVisible ) { opacity = 1; }
            $(mainPhoto).animate( {'opacity': opacity}, onclick ? settings.animateSpeed : settings.animateAutoSpeed, onImageLoad );
        };

        loadingElement.src = slide.attr("href");
        loaded = false;
        loadingTimeOut = setTimeout( _toggleLoading, 500 );
    }

    function _toggleLoading()
	{
        visible = !loaded;

        if ( visible )
        $(loading).fadeIn( "fast" );
        else
        $(loading).fadeOut( "fast" );
    }

    function _preloadImage()
    {
        if ( !settings.preload )
        {
            return false;
        }

        var next = _getNextAfterActive();
        var preloadElement = new Image();
        preloadElement.src = next.attr("href");

        return true;
    }

    function _startSlideShow()
    {
        if ($(".slides a", container).length <= 1)
        {
            return false;
        }

        var cbSlideShow = function ()
        {
            var cb = function()
            {
                slideShowTimeout = setTimeout( cbSlideShow, settings.slideShowDelay );
            }

            clearTimeout( slideShowTimeout );

            var next = _getNextAfterActive();
            _autoChangeSlide(next.parent());
            //_changeSlide( next, cb, false );
        }

        slideShowTimeout = setTimeout( cbSlideShow, settings.slideShowFirstSlideDelay );

        return true;
    }

    function _getNextAfterActive()
    {
        var index = $(".slides li", container).index($(".slides li:has(a.active)", container));
        index++;

        var next = $(".slides li:eq(" + index + ")", container);

        if ( index == 0 || next.length < 1 )
        {
            next = $(".slides a:first", container);
        }
        else
        {
            next = $("a", next);
        }

        return next;
    }

    function _bindEventHandlers()
    {
        $(".slides a", container).hover(_destroyTimers);
        $(".groups a", container).click(_handleChangeGroup);
        $(".slides a", container).click(_handleChangeSlide);
    }

    function init()
    {
        settings = $.extend({}, defaultSettings, settings);

        $("#photoslide_image", container).wrap("<div id='photoslide_image_wrap'/>");
        $("#photoslide_wrap", container).prepend(loading);
        $("#photoslide_text", container).prepend(title);

        mainPhoto = $("#photoslide_image");
        mainPhotoWrap = $("#photoslide_image_wrap");
	roomLink = $("#photoslide_text");
	roomPrice = $("#room-price");
	bookingLink = $("#booking-link");
	rub = $("#rub");

        _bindEventHandlers();
        $(".scrollable", container).scrollable({size: settings.thumbsNumber}).mousewheel();

        lastGroup = $(".groups a:first", container).attr("rel") || $(".slides a:first").attr('rel');
        _setActiveGroup( lastGroup );
        $(".slides a[rel="+lastGroup+"]:first", container).click();

        if ( settings.slideShow )
        {
            _startSlideShow();
        }
    }
}
