$.fn.gmGallery = function(options) {
    var defaults = {
        imageWidth: 618,
        imageHeight: 400,
        cycle:true,
        controls: true
    }
        
    options = $.extend(defaults, options);  
    return this.each(function() {
        Obj = $(this);
        Obj.addClass('gm-gallery')
        $(this).prepend("<div class='slide-div'></div>");
        slideDiv = $(this).children('.slide-div');
        
        
        $(this).append("<div class='arrow-left'></div>");
        $(this).append("<div class='arrow-next'></div>");
        
        main2prev = $(this).find('.arrow-left');
        main2next = $(this).find('.arrow-next');
        
        main2next.click(function(){
            Obj.find('a.active').next().click();
        });
        
        main2prev.click(function(){
            Obj.find('a.active').prev().click();
        });
        
        if(!$.browser.msie){main2prev.fadeTo(0,0.3);}
        
        
        wrapper = slideDiv.wrap("<div class='wrapper'></div>")
        $(this).find('.wrapper').css({
                        'width': options.imageWidth+'px',
                        'height': options.imageHeight+'px',
                        'overflow':'hidden'
                    });
        slideDiv.css('width',2*options.imageWidth+'px');
        $(this).find('a').each(function(){
            src = this.href;
            uid = giveUnusedID();
            slideDiv.append("<div id='"+uid+"' style='width:"+options.imageWidth+"px; height:"+options.imageHeight+"px;' class='item'><table width='100%' height='100%' cellpadding='0' cellspacing='0'><tr><td valign='middle' align='center'><img style='max-width:"+options.imageWidth+"px; max-height:"+options.imageHeight+"px;' src='"+src+"' alt='' /></td></tr></table></div>");        
            
            
            this.uid = uid;
            $(this).click(function(){
                                
                if($(this).index()*85 - 6*85 + parseInt(Obj.find('.slideRow').css('left')) == 0){
                    Obj.slide2Next();
                }
                
                
                if(($(this).index())*85 + parseInt(Obj.find('.slideRow').css('left')) == 0){
                    Obj.slide2Prev();
                }
                
                Obj.slide2Div(document.getElementById(this.uid));
                Obj.find('a').removeClass('active');
                $(this).addClass('active');
                return false;
            })
        })
        
        $(this).find('a:first').addClass('active');
        
        $(this).find('a').wrapAll("<div class='slideRow'></div>");
        Obj.find('.slideRow').wrap("<div class='thumbsWrapper'></div>");
        Obj.find('.thumbsWrapper').wrap("<div class='thumbs'></div>")
        Obj.find('.thumbs').prepend("<div class='prev'></div>");
        Obj.find('.thumbs').append("<div class='next'></div>");
        alength = $(this).find('a').length;
        maxmargleft = ($(this).find('a').length*85 - 6*85)*-1;
        Obj.find('.slideRow').css('left',0)

        Obj.find('.next').mouseover(function(){
        if(parseInt(Obj.find('.slideRow').css('left')) > maxmargleft && isInt(parseInt(Obj.find('.slideRow').css('left'))/85)){
            $(this).addClass('hover');
        }   
        });
        
        Obj.find('.next').mouseout(function(){$(this).removeClass('hover');});
        
        Obj.find('.prev').mouseover(function(){
        if(parseInt(Obj.find('.slideRow').css('left')) < 0 && isInt(parseInt(Obj.find('.slideRow').css('left'))/85)){
            $(this).addClass('hover');
        }
        });
        
        Obj.find('.prev').mouseout(function(){
            $(this).removeClass('hover');
        });

        Obj.find('.next').click(function(){Obj.slide2Next(6)});
        
        Obj.find('.prev').click(function(){Obj.slide2Prev(6)});
    
        
        
        if(Obj.find('div.item').length == 1){
            if(!$.browser.msie){main2prev.fadeTo(0,0.3);}
            if(!$.browser.msie){main2next.fadeTo(0,0.3);}
        }
    
        Obj.slide2Next = function(times){
        if(!times){times = 1};
            if(parseInt(Obj.find('.slideRow').css('left')) > maxmargleft && isInt(parseInt(Obj.find('.slideRow').css('left'))/85)){
            if(parseInt(Obj.find('.slideRow').css('left'))- times*85 < maxmargleft){
                Obj.find('.slideRow').animate({'left':'-'+85*(alength-6)+'px'},100);
            }else{
                            if(maxmargleft+85+'px' == Obj.find('.slideRow').css('left')){
                Obj.find('.slideRow').animate({'left':'-'+85*(alength-6)+'px'},100);
                            }else{
            Obj.find('.slideRow').animate({'left':'-='+85*times},100);
                            }
            }
            }
        }
        
        Obj.slide2Prev = function(times){
        if(!times){times = 1};
            if(parseInt(Obj.find('.slideRow').css('left')) < 0 && isInt(parseInt(Obj.find('.slideRow').css('left'))/85)){
            if(parseInt(Obj.find('.slideRow').css('left'))+ times*85 > 0){
                        Obj.find('.slideRow').animate({'left':'0'},100);

            }else{
                        Obj.find('.slideRow').animate({'left':'+='+85*times},100);
            
            }
        }
        }
        
        
        Obj.find('.thumbsWrapper').css({
                        'width': (options.imageWidth-60)+'px',
                        'overflow':'hidden'
        })
        thelength = $(this).find('a').length*(75+10);
        Obj.find('.slideRow').css({
                        'width':thelength+'px'
        })
        Obj.slide2Div = function(div){
            Obj.find('div.item').hide();
            $(div).show();
            if($(div).index() == 0){
                if(!$.browser.msie){main2prev.fadeTo(0,0.3);}
            }
            else{
                if(!$.browser.msie){main2prev.fadeTo(0,1);}
            }
            if($(div).index() == Obj.find('div.item').length-1){
                if(!$.browser.msie){main2next.fadeTo(0,0.3);}
            }
            else{
                if(!$.browser.msie){main2next.fadeTo(0,1);}
            }
        }
        
    });
}

function isInt(x) { 
   var y=parseInt(x); 
   if (isNaN(y)) return false; 
   return x==y && x.toString()==y.toString(); 
 } 

