(function($) {
    $.fn.carouselGallery = function(options) {
        return this.each(function() {   
            $.carouselGallery(this, options);
        });
    };
    
    $.carouselGallery = function(container, options)
    {
        var settings = {
            container:   'carouselGallery',
            wrap:        'carouse',
            inner:       'carouselInner',
            column:      'carouselColumn',
            btnPrev:     'carouselPrev',
            btnPrevText: 'Prev',
            btnNext:     'carouselNext',
            btnNextText: 'Next',
            tableWidth:  160,
            tableHeight: 400,
            tableRows:    3
        };
        if (options) $.extend(settings, options);
        
        settings.cellHeight = Math.floor(settings.tableHeight / settings.tableRows);
        
        if ($(container).attr('class') != settings.container) {
            $.carouselGallery.createInit(container, settings);
        }
        
        if (settings.feed) {
            $.carouselGallery.createFromFeed(container, settings);
        }
        
        $cgInner = $('.'+settings.inner, container);
        $cgColumns = $('.'+settings.inner + ' ' + '.'+settings.column, container);
        $cgBtnPrev = $('.'+settings.btnPrev, container);
        $cgBtnNext = $('.'+settings.btnNext, container);
        
        //init
        $cgInner.css('height', settings.tableHeight * $cgColumns.size() + 'px');
        
        //only one page
        if ($cgColumns.size() > 1) {
            $('.'+settings.column+':last', $cgInner).prependTo($cgInner);
            $cgInner.css("margin-top","-"+settings.tableHeight+"px");
        } else {
            $cgBtnPrev.hide();
            $cgBtnNext.hide();
        }
        
        //prev
        $cgBtnPrev.click(function(){
            var thisContainer = $(this).parent('.carouselGallery');
            $cgInner = $('.'+settings.inner, thisContainer);
            $cgColumns = $('.'+settings.inner + ' ' + '.'+settings.column, thisContainer);
            $cgBtnPrev = $('.'+settings.btnPrev, thisContainer);
            $cgBtnNext = $('.'+settings.btnNext, thisContainer);
            
            $cgBtnPrev.hide();
            $cgBtnNext.hide();
            $cgInner.animate({
                marginTop : parseInt($cgInner.css('margin-top')) + settings.tableHeight + 'px'
            }, 'slow', 'swing',
            function(){
                $cgInner.css('margin-top','-'+settings.tableHeight+'px');
                $('.'+settings.column+':last', $cgInner).prependTo($cgInner);
                $cgBtnPrev.show();
                $cgBtnNext.show();
            });
        })
        //next
        $cgBtnNext.click(function(){
            var thisContainer = $(this).parent('.carouselGallery');
            $cgInner = $('.'+settings.inner, thisContainer);
            $cgColumns = $('.'+settings.inner + ' ' + '.'+settings.column, thisContainer);
            $cgBtnPrev = $('.'+settings.btnPrev, thisContainer);
            $cgBtnNext = $('.'+settings.btnNext, thisContainer);
            $cgBtnPrev.hide();
            $cgBtnNext.hide();
            $cgInner.animate({
                marginTop : parseInt($cgInner.css('margin-top')) - settings.tableHeight + 'px'
            }, 'slow', 'swing',
            function(){
                $cgInner.css('margin-top','-'+settings.tableHeight+'px')
                $('.'+settings.column+':first', $cgInner).appendTo($cgInner);
                $cgBtnPrev.show();
                $cgBtnNext.show();
            });
        })
        
        
//        $('table img', container).load(function() {
//            var ratio = 1;
//            if ($(this).height() > $(this).width()) {
////                $(this).css('height', Math.floor($(this).height() * 0.7));
////                $(this).height(settings.cellHeight - 8);
////                ratio = $(this).height() / (settings.cellHeight - 8);
////                $(this).width($(this).width() * ratio);
//            } else {
////                $(this).css('width', Math.floor($(this).width() * 0.7));
////                $(this).width(settings.tableWidth - 8);
////                ratio = $(this).width() / (settings.tableWidth - 8);
////                $(this).height($(this).height() * ratio);
//            }
//            $(this).show();
//            $(this).parents('td').css('background-image', 'none');
//        });
        
    };

    $.carouselGallery.createFromFeed = function(container, settings)
    {
        var inner = $('.'+settings.inner, $(container));
        var f = settings.feed;
        var imgStr;
        var pics = new Array();
        
        $pics = $();
        
        var imageCnt = 0;
        var imgSrc = '';
        for(var i in f.entries) { (function(e) {
            $imgObj = $(e.content).filter('img');
            if ($imgObj.length) {
                $pics[imageCnt] = $('<a/>').attr({href: e.link, title: e.title, target: '_blank'}).append($imgObj[0]);
                imageCnt++;
            }
        })(f.entries[i]);}
        var rowNum = Math.ceil(imageCnt / settings.tableCols);
        var columnTb, columnTbRow;
        for (i = 0; i < settings.tableCols * rowNum; i++) {
            if (!(i % settings.tableCols)) {
                columnTb = $('<table/>').attr('class', settings.column).css('height', settings.tableHeight);
                columnTbRow = $('<tr/>').appendTo(columnTb);
            }
            if (i < imageCnt) {
                $('<td/>').css('width', settings.cellWidth)
                          .html($pics[i])
                          .appendTo(columnTbRow);
            } else {
                $('<td/>').addClass('emptyCell')
                          .css('width', settings.cellWidth).html('&nbsp;')
                          .appendTo(columnTbRow);
            }
            if (i % settings.tableCols == settings.tableCols - 1) {
                $(columnTb).appendTo(inner);
            }
        }
        $('table img', container).hide();
    };

    $.carouselGallery.createInit = function(container, settings)
    {
        $(container).attr('class', settings.container).css('height', settings.tableHeight);
        
        $('<p/>').attr('class', settings.btnPrev).text(settings.btnPrevText).appendTo(container);
        $('<p/>').attr('class', settings.btnNext).text(settings.btnNextText).appendTo(container);
        var wrap = $('<div/>').attr('class', settings.wrap).css('width', settings.tableWidth);
        var inner = $('<div/>').attr('class', settings.inner).css('width', settings.tableWidth);
        inner.appendTo(wrap);
        wrap.appendTo(container);
    };



})(jQuery);



