(function($){
    $.fn.galleryView = function(options) {
        var opts = $.extend($.fn.galleryView.defaults,options);
        var id;
        var iterator = 0;
        var gallery_width;
        var frame_margin = opts.frame_margin;
        var strip_width;
        var wrapper_width;
        var item_count = 0;
        var slide_method;
        var img_path;
        var paused = true;
        var frame_caption_size = 20;
        var frame_margin_top = 10;
        var pointer_width = 2;
        var pointer_position = 0;
        var clicked_side = 'right';
        var j = 0;
        var old_i = 0;

        //Define jQuery objects for reuse
        var j_gallery;
        var j_filmstrip;
        var j_frames;
        var j_panels;
        var j_pointer;

/************************************************/
/*  Plugin Methods                              */
/************************************************/
        function showItem(i) {
            //Disable next/prev buttons until transition is complete
            $('img.nav-next').unbind('click');
            $('img.nav-prev').unbind('click');
            $('img.nav-next-page').unbind('click');
            $('img.nav-prev-page').unbind('click');
            $('img.nav-last-page').unbind('click');
            $('img.nav-first-page').unbind('click');
            j_frames.unbind('click');
            j_frames.unbind('mousemove');

            if(has_filmstrip) {
                if(slide_method=='strip') {
                    slide_strip(i);
                }
                else if(slide_method=='pointer') {
                    slide_pointer(i);
                }
            }
        };
        function slide_strip(i) {
            j_filmstrip.stop();
            if( clicked_side == 'left') { leftstr = '+=' + (opts.frame_width+frame_margin) + 'px'; }
            else if (clicked_side == 'right') { leftstr = '-=' + (opts.frame_width+frame_margin) + 'px'; }
            else if (clicked_side == 'right_page') {
                if(i > (item_count - (2*strip_size))) {
                    var pos = getPos(j_frames[i]);
                    pointer_position = parseInt((pos.left-(opts.strip_left_margin + opts.frame_margin))/(opts.frame_width+opts.frame_margin));
                    leftstr = '-=' + ((opts.frame_width+frame_margin)*(item_count-(i-pointer_position+strip_size))) + 'px';
                    var end_pos = getPos(j_frames[i+(opts.strip_size-pointer_position-1)]).left;
                    j_pointer.animate({
                        'left':(end_pos + 'px')
                    },opts.transition_speed,opts.easing,function(){});
                    i = item_count - 1;
                    iterator = item_count - 1;
                }
                else {
                    leftstr = '-=' + (opts.frame_width+frame_margin)*strip_size + 'px';
                    i = i + strip_size;
                    iterator = iterator + strip_size;
                }
            }
            else if (clicked_side == 'left_page') {
                var pos = getPos(j_frames[i]);
                pointer_position = parseInt((pos.left-(opts.strip_left_margin + opts.frame_margin))/(opts.frame_width+opts.frame_margin));
                if(i < (2*strip_size)) {
                    leftstr = '+=' + (opts.frame_width+frame_margin)*(i-pointer_position) + 'px';
                    var start_pos = getPos(j_frames[i-pointer_position]).left;
                    j_pointer.animate({
                        'left':(start_pos + 'px')
                    },opts.transition_speed,opts.easing,function(){});
                    iterator = 0;
                    i = 0;
                }
                else {
                    leftstr = '+=' + (opts.frame_width+frame_margin)*strip_size + 'px';
                    i = i - opts.strip_size;
                    iterator = iterator - opts.strip_size;
                }
            }
            else if (clicked_side == 'first_page') {
                var pos = getPos(j_frames[i]);
                pointer_position = parseInt((pos.left-(opts.strip_left_margin + opts.frame_margin))/(opts.frame_width+opts.frame_margin));
                leftstr = '+=' + ((i*(opts.frame_width+frame_margin))-(pointer_position*(opts.frame_width+frame_margin))) + 'px';
                var start_pos = getPos(j_frames[i-pointer_position]).left;
                j_pointer.animate({
                    'left':(start_pos + 'px')
                },opts.transition_speed,opts.easing,function(){});
                pointer_position=0;
                iterator = 0;
                i = 0;
                 pointer_position = 0;
            }
            else if (clicked_side == 'last_page') {
                var pos = getPos(j_frames[i]);
                pointer_position = parseInt((pos.left-(opts.strip_left_margin + opts.frame_margin))/(opts.frame_width+opts.frame_margin));
                leftstr = '-=' + ((opts.frame_width+frame_margin)*(item_count-(i-pointer_position+strip_size))) + 'px';
                var end_pos = getPos(j_frames[i+(opts.strip_size-pointer_position-1)]).left;
                j_pointer.animate({
                    'left':(end_pos + 'px')
                },opts.transition_speed,opts.easing,function(){});
                i = item_count - 1;
                iterator = item_count - 1;
                pointer_position = strip_size -1;
            }
            j_panels.fadeOut(opts.transition_speed).eq(i).fadeIn(opts.transition_speed,function(){});
            j_filmstrip.animate({
                'left':leftstr
                },opts.transition_speed,opts.easing,function(){
                    $('img.nav-prev').click(showPrevItem);
                    $('img.nav-next').click(showNextItem);
                    $('img.nav-prev-page').click(showPrevPage);
                    $('img.nav-next-page').click(showNextPage);
                    $('img.nav-first-page').click(showFirstPage);
                    $('img.nav-last-page').click(showLastPage);
                enableFrameClicking();
            });
            $('#numer_strony').html("<span>" + (i+1) + "</span>/" + (item_count));
            $('#galeria_gora span').css({
                'font-size': opts.frame_height/2.7 + 'px'
            });
        };

        function slide_pointer(i) {
            var pos = getPos(j_frames[i]);
            pointer_position = parseInt((pos.left-(opts.strip_left_margin + opts.frame_margin))/(opts.frame_width+opts.frame_margin));
            j_pointer.stop();
            j_panels.fadeOut(opts.transition_speed).eq(i).fadeIn(opts.transition_speed,function(){});
            j_pointer.animate({
                'left':(pos.left-2+'px')
            },opts.transition_speed,opts.easing,function(){
                $('img.nav-prev').click(showPrevItem);
                $('img.nav-next').click(showNextItem);
                $('img.nav-prev-page').click(showPrevPage);
                $('img.nav-next-page').click(showNextPage);
                $('img.nav-first-page').click(showFirstPage);
                $('img.nav-last-page').click(showLastPage);
                enableFrameClicking();
            });
            $('#numer_strony').html("<span>" + (i+1) + "</span>/" + (item_count));
            $('#galeria_gora span').css({
                'font-size': opts.frame_height/2.7 + 'px'
            });
        };

        // SHOW NEXT ITEM
        function showNextItem() {
            if (iterator!=(item_count-1)) {
                // koncowka
                if (pointer_position == (opts.strip_size - (item_count - iterator))) {
                    slide_method = 'pointer';
                }
                else {
                    slide_method = 'strip';
                    clicked_side = 'right';
                }
                showItem(++iterator);
            }
        };
        function showPrevItem() {
            if (iterator!=0) {
                if (iterator==pointer_position) {
                   slide_method = 'pointer';
                }
                else {
                    slide_method = 'strip';
                    clicked_side = 'left';
                }
                showItem(--iterator);
            }
        };

        // SHOW NEXT PAGE
        function showNextPage() {
            if (iterator!=(item_count-1)) {
                if (pointer_position == (opts.strip_size - (item_count - iterator))) {
                    slide_method = 'pointer';
                    iterator = item_count-1;
                    showItem(iterator);
                }
                else {
                    slide_method = 'strip';
                    clicked_side = 'right_page';
                    showItem(iterator);
                }
            }
        };
        function showPrevPage() {
            if (iterator!=0) {
                if (iterator==pointer_position) {
                    slide_method = 'pointer';
                    iterator = 0;
                    showItem(iterator);
                }
                else {
                    slide_method = 'strip';
                    clicked_side = 'left_page';
                    showItem(iterator);
                }
            }
        };

        function showFirstPage() {
            j_panels.eq(0).show();
            slide_method = 'strip';
            clicked_side = 'first_page';
            showItem(iterator);
        };
        function showLastPage() {
            slide_method = 'strip';
            clicked_side = 'last_page';
            showItem(iterator);
        };

        function getPos(el) {
            var left = 0, top = 0;
            var el_id = el.id;
            if(el.offsetParent) {
                do {
                    left += el.offsetLeft;
                    top += el.offsetTop;
                } while(el = el.offsetParent);
            }
            if(el_id == id) {return {'left':left,'top':top};}
            else {
                var gPos = getPos(j_gallery[0]);
                var gLeft = gPos.left;
                var gTop = gPos.top;
                return {'left':left-gLeft,'top':top-gTop};
            }
        };
        function enableFrameClicking() {
            j_frames.each(function(i){
                if($('a',this).length==0) {
                    $(this).mousemove(function() {
                        if (i != j) {
                            if(i>j) {
                                iterator++;
                            }
                            else if (i<j) {
                                iterator--;
                            }
                            j=i;
                            slide_method = 'pointer';
                            showItem(i);
                            iterator = i;
                            j_frames.unbind('mousemove');
                        }
                    })
                    .click(function() {
                        slide_method = 'pointer';
                        showItem(i);
                        iterator = i;
                    });
                }
            });
        };

        function buildPanels() {
// parametry wyswietlanego obrazka
            j_panels.css({
                'width':'770px',
                'position':'absolute',
                'top':opts.frame_height + 2*opts.gallery_margin+'px',
                'left':'0px',
                'overflow':'hidden',
                'display':'none',
                'padding':opts.gallery_margin+'px 0',
                'border-top':'1px solid #DDDCE1'
            });
            $('.panel iframe',j_panels).css({
                'width':opts.panel_width+'px',
                'height':(opts.panel_height-opts.overlay_height)+'px',
                'border':'0'
            });

            $('img',j_panels).css({
                'height':opts.panel_height+'px'
            });
        };

        function buildFilmstrip() {
            //Add wrapper to filmstrip to hide extra frames
            j_filmstrip.wrap('<div class="strip_wrapper"></div>');
            if(slide_method=='strip') {
                j_frames = $('li',j_filmstrip);
            }

// parametry wewnetrzna czesc filmstripu
            j_filmstrip.css({
                'listStyle':'none',
                'margin':'0',
                'padding':'0',
                'width':strip_width - opts.strip_left_margin +'px',
                'position':'absolute',
                'zIndex':'900',
                'top':'0',
                'left':'0',
                'height':(opts.frame_height)+'px'

            });
            j_frames.css({
                'float':'left',
                'position':'relative',
                'height':opts.frame_height+'px',
                'zIndex':'901',
                'marginTop':opts.gallery_margin+'px',
                'marginBottom':opts.gallery_margin+'px',
                'marginRight':frame_margin+'px',
                'padding':'0',
                'cursor':'pointer'
            });
            $('img',j_frames).css({
                'border':'none'
            });

            // parametry zakrywacza
            $('.strip_wrapper',j_gallery).css({
                'position':'absolute',
                'margin':'0 0 0 3px',
                'top':(opts.filmstrip_position=='top'?'0px':opts.panel_height+'px'),
                'left': opts.strip_left_margin + 'px',
'marginLeft':opts.frame_margin + 'px',
                'width':((opts.strip_size*opts.frame_width) + (opts.frame_margin*(opts.strip_size-1))) + 'px',
                'height':(opts.gallery_margin*2+(opts.frame_height))+'px',
                'overflow':'hidden'

            });

            var pointer = $('<div></div>');
            if ( $.browser.msie ) {
                pointer.attr('id','pointer').appendTo(j_gallery).css({
                    'position':'absolute',
                    'zIndex':'1000',
                    'cursor':'pointer',
                    'top':getPos(j_frames[pointer_position]).top-(pointer_width/2)-1+'px',
                    'left':getPos(j_frames[pointer_position]).left-(pointer_width/2)-1+'px',
                    'height':(opts.frame_height-pointer_width+4)+'px',
                    'width':(opts.frame_width-pointer_width+4)+'px',
                    'border':'2px solid #0080C0'
                });
            }
            else {
                pointer.attr('id','pointer').appendTo(j_gallery).css({
                    'position':'absolute',
                    'zIndex':'1000',
                    'cursor':'pointer',
                    'top':getPos(j_frames[pointer_position]).top-(pointer_width/2)-1+'px',
                    'left':getPos(j_frames[pointer_position]).left-(pointer_width/2)-1+'px',
                    'height':opts.frame_height-pointer_width+'px',
                    'width':opts.frame_width-pointer_width+'px',
                    'border':'2px solid #0080C0'
                });
            }
            j_pointer = $('#pointer',j_gallery);
            if(slide_method=='strip') {

            }

            var next_button_height = parseInt((opts.frame_height+(2*opts.gallery_margin))/1.5);
            var next_button_width = parseInt(next_button_height/2);
            var forward_button_height = parseInt((opts.frame_height+(2*opts.gallery_margin))/2)-1;
            var forward_button_width = parseInt(forward_button_height/2);
            var begin_end_button_height = forward_button_height;
            var begin_end_button_width = forward_button_width;
            $('<img />').addClass('nav-next').attr('src',img_path+opts.nav_theme+'/next.gif').appendTo(j_gallery).css({
                'position':'absolute',
                'cursor':'pointer',
                'height':next_button_height + 'px',
                'width':next_button_width + 'px',
                'top':opts.gallery_height/2 + 'px',
                'right':'0px'
            }).click(showNextItem);
            $('<img />').addClass('nav-prev').attr('src',img_path+opts.nav_theme+'/prev.gif').appendTo(j_gallery).css({
                'position':'absolute',
                'cursor':'pointer',
                'height':next_button_height + 'px',
                'width':next_button_width + 'px',
                'top':opts.gallery_height/2 + 'px',
                'left':'0px'
            }).click(showPrevItem);
            $('<img />').addClass('nav-next-page').attr('src',img_path+opts.nav_theme+'/next_page.gif').appendTo(j_gallery).css({
                'position':'absolute',
                'cursor':'pointer',
                'height':forward_button_height + 'px',
                'width':forward_button_width + 'px',
                'top':begin_end_button_height + 1 +'px',
                'right':'0px'
            }).click(showNextPage);
            $('<img />').addClass('nav-prev-page').attr('src',img_path+opts.nav_theme+'/prev_page.gif').appendTo(j_gallery).css({
                'position':'absolute',
                'cursor':'pointer',
                'height':forward_button_height + 'px',
                'width':forward_button_width + 'px',
                'top': begin_end_button_height + 'px',
                'left':'0px'
            }).click(showPrevPage);
            $('<img />').addClass('nav-first-page').attr('src',img_path+opts.nav_theme+'/begina.gif').appendTo(j_gallery).css({
                'position':'absolute',
                'cursor':'pointer',
                'height':begin_end_button_height + 'px',
                'width':begin_end_button_width + 'px',
                'top':'0px',
                'left':'0px'
            }).click(showFirstPage);
            $('<img />').addClass('nav-last-page').attr('src',img_path+opts.nav_theme+'/enda.gif').appendTo(j_gallery).css({
                'position':'absolute',
                'cursor':'pointer',
                'height':begin_end_button_height + 'px',
                'width':begin_end_button_width + 'px',
                'top':'0px',
                'right':'0px'
            }).click(showLastPage);
        };

/************************************************/
/*  Main Plugin Code                            */
/************************************************/
        return this.each(function() {
            j_gallery = $(this);
            $('script').each(function(i){
                var s = $(this);
                if(s.attr('src') && s.attr('src').match(/jquery\.galleryview/)){
                    img_path = s.attr('src').split('jquery.galleryview')[0]+'themes/';
                }
            });
            j_gallery.css('visibility','hidden');
            j_filmstrip = $('.filmstrip',j_gallery);
            j_frames = $('li',j_filmstrip);
            j_panels = $('.panel',j_gallery);

            id = j_gallery.attr('id');
            has_panels = j_panels.length > 0;
            has_filmstrip = j_frames.length > 0;

            //item_count = has_panels?j_panels.length:j_frames.length;
            item_count = opts.img_count;
            $('#numer_strony').html("<span>1" + "</span>/" + (item_count));


        $('#galeria_gora span').css({
            'font-size': opts.frame_height/2.7 + 'px'
        });
            strip_size = opts.strip_size;

            /************************************************/
            /*  Determine transition method for filmstrip   */
            /************************************************/
                    //If more items than strip size, slide filmstrip
                    //Otherwise, slide pointer
                    if(strip_size >= item_count) {
                        slide_method = 'pointer';
                        strip_size = item_count;
                    }
                    else {slide_method = 'strip';}

            /************************************************/
            /*  Determine dimensions of various elements    */
            /************************************************/

                    gallery_width = has_panels?opts.panel_width:(strip_size*(opts.frame_width+frame_margin))-frame_margin+64;
                    if(slide_method == 'pointer') {strip_width = (opts.frame_width*(item_count+1))+(frame_margin*(item_count+1));}
                    else {strip_width = (opts.frame_width*(item_count+1))+(frame_margin*(item_count+1));}
                    wrapper_width = ((strip_size*opts.frame_width)+((strip_size-1)*frame_margin));

            /************************************************/
            /*  Apply CSS Styles                            */
            /************************************************/
                    // parametry galerii
                    j_gallery.css({
                        'position':'relative',
                        'margin':'0',
                        'width':gallery_width+'px',
                        'height':opts.gallery_height+'px',
                        'border':'1px solid #DDDCE1',
                        'background':'#FFFFFF'
                    });

            /************************************************/
            /*  Build filmstrip and/or panels               */
            /************************************************/
                    if(has_filmstrip) {
                        buildFilmstrip();
                    }
                    if(has_panels) {
                        buildPanels();
                    }

            /************************************************/
            /*  Add events to various elements              */
            /************************************************/
                    if(has_filmstrip) enableFrameClicking();
                    $('#of_foto_u').mouseover(function() {
                        $('img.nav-next').fadeIn();
                        $('img.nav-prev').fadeIn();
                        $('img.nav-next-page').fadeIn();
                        $('img.nav-prev-page').fadeIn();
                        $('img.nav-first-page').fadeIn();
                        $('img.nav-last-page').fadeIn();
                    });

                    $('#of_foto_u').mouseleave(function() {
                        $('img.nav-next').fadeOut();
                        $('img.nav-prev').fadeOut();
                        $('img.nav-next-page').fadeOut();
                        $('img.nav-prev-page').fadeOut();
                        $('img.nav-first-page').fadeOut();
                        $('img.nav-last-page').fadeOut();
                    });

            /************************************************/
            /*  Initiate Automated Animation                */
            /************************************************/

            j_panels.eq(0).show();
            j_gallery.css('visibility','visible');
        });
    };
    $.fn.galleryView.defaults = {
        panel_width: 400,
        panel_height: 300,
        frame_width: 80,
        frame_height: 80,
        filmstrip_size: 3,
        overlay_height: 70,
        overlay_font_size: '1em',
        transition_speed: 600,
        transition_interval: 600,
        overlay_opacity: 0.6,
        overlay_color: 'black',
        overlay_text_color: 'white',
        caption_text_color: 'white',
        border: '1px solid black',
        nav_theme: 'light',
        easing: 'swing',
        filmstrip_position: 'bottom',
        overlay_position: 'bottom',
        show_captions: false,
        fade_panels: true,
        pause_on_hover: false
    };
})(jQuery);
