[jQuery] jcarousellite: problem finding current position when visibility is a fraction

[jQuery] jcarousellite: problem finding current position when visibility is a fraction


i'm modified jcarousellite to have indicators that are updated based on
position of the element. it works as desired when i set visibility to 1 but
when i use fractions (2.75) it perform the function correctly.
can anyone help point me to the problem with my code? thanks
this is the function to update indicators:
            function update_navigation(curr){
                var    kids = $(o.panel);
                var cloneVal = (o.circular) ? 2 : 0;
                var pos = (kids.size()-cloneVal <= curr) ? (curr > kids.size()-cloneVal)
? 2 : kids.size()-cloneVal : curr;
                pos = (pos == 0) ? kids.size()-cloneVal : pos;
                var    indicatorImages =    $(o.btnIndicator);
                var sectionLinks = $("#sectionlinks a");
                for(k =    0; k < indicatorImages.size(); k++){
                    if(pos == k+1){
                        $(indicatorImages[k]).attr("class", 'on');
                    } else {
                        $(indicatorImages[k]).attr("class", 'off');
                    }
                }
                
                for(k =    0; k < sectionLinks.size(); k++){
                    if(pos == k+1){
                        $(sectionLinks[k]).attr("class", 'selected');
                    } else {
                        $(sectionLinks[k]).attr("class", 'off');
                    }
                }
            };
this is the full js file:
(function($) { // Compliant with jquery.noConflict()
$.fn.jCarouselLite = function(o) {
o = $.extend({
btnPrev: null,
btnNext: null,
                        btnRegExp: null,
                        btnNavTarget: null,
btnGo: null,
                        btnIndicator: "ul.nav-carousel li",
mouseWheel: false,
auto: true,
                        pauseOnHover: true,
            
                        disableClass: "disabled",
speed: 3000,
easing: null,
vertical: false,
circular: true,
visible: 2.75,
start: 0,
scroll: 1,
                        autoTimer: true,
rows: 1, //ADDED: Property to allow multiple rows
beforeStart: null,
afterEnd: null,
                        carousel: "div.content-body div.carousel",
                        panel: "div.cell-wrapper",
                        labels: false,
        
                        createNav: false,
                        btnNavContainer: '<ul class="nav-carousel"></ul>',
                        btnNavTarget: 'ul.nav-carousel',
                        btnPrevHtml: '<li class="prev"> # previous </li>',
                        btnNextHtml: '<li class="next"> # next </li>'
}, o || {});
return this.each(function() { // Returns the element collection.
Chainable.
var running = false, animCss = o.vertical ? "top" : "left",
sizeCss = o.vertical ? "height" : "width";
var div = $(this), ol = $(o.carousel), tLi = $(o.panel,
o.carousel), tl = tLi.size(), v = o.visible;
var rowCss = o.vertical ? "width" : "height"; //ADDED: rowCss is
used to set the height/width of the viewport based on how many rows are
showing
            var isMouseOver = false;
            // added: only perform if li > 1
if(o.circular && tl > 1) {
                ol.prepend(tLi.slice(tl-v-1+1).clone()).append(tLi.slice(0,v).clone());
                o.start    += v;
            }
    
            if(o.createNav){
                create_navigation();
            }
            update_navigation(1);
var li = $(o.panel, o.carousel), itemLength = li.size(), curr =
o.start;
div.css("visibility", "visible");
            
            if(tl > 1){
                hideAndShowFlashContent(li, 1);
            }
            
li.css({ overflow: "hidden", float: o.vertical ? "none" : "left"
});
ol.css({ margin: "0", padding: "0", position: "relative",
"list-style-type": "none", "z-index": "1" });
div.css({ overflow: "hidden", position: "relative", "z-index":
"2", left: "0px" });
var liSize = o.vertical ? height(li) : width(li); // Full li
size(incl margin)-Used for animation
var liRowSize = o.vertical ? width(li) : height(li); //ADDED:
size of the li's row
var olSize = ((liSize * itemLength) / o.rows) + (liSize / 1.5);
// size of full ul(total length, not just for the visible items)
var divSize = liSize * v; // size of entire div(total length for
just the visible items)
var rowSize = liRowSize * o.rows; //ADDED: gets the size in
pixels of the height/width of the viewport
li.css({ width: li.width(), height: li.height() });
ol.css(sizeCss, olSize + "px").css(animCss, -(curr * liSize));
            /*div.css(sizeCss, divSize + "px");*/ // Width of the DIV. length of
visible images
            ol.css(rowCss, rowSize + "px"); //ADDED: Height of the DIV; MODIFIED:
height of ol instead of div
            li.mouseover(function(){ isMouseOver = true; });
    li.mouseout(function(){ isMouseOver = false; });
            //ADDED: special consideration for vertical carousels with multiple
rows
            if (o.vertical && o.rows > 1) {
                ol.children().filter(function(index) {
                    return ((index + 1) % o.rows > 0);
                }).css({ float: "left", width: "" });
            }
            if(o.btnPrev){
                $(o.btnPrev).mouseover(function(){ isMouseOver = true; });
                $(o.btnPrev).mouseout(function(){ isMouseOver = false; });
                $(o.btnPrev).livequery("click",function() {
                    return go(curr-o.scroll);
                });
            }
            if(o.btnNext){
                $(o.btnNext).mouseover(function(){ isMouseOver = true; });
                $(o.btnNext).mouseout(function(){ isMouseOver = false; });
                $(o.btnNext).livequery("click",function() {
                    return go(curr+o.scroll);
                });
            }
            
            if(o.btnGo) {
                $.each(o.btnGo, function(i, val) {
                    $(val).click(function() {
                        return go(o.circular ? o.visible+i : i+1);
                    });
                });
            }
            if (o.mouseWheel && div.mousewheel) {
                div.mousewheel(function(e, d) {
                    return d > 0 ? go(curr - o.scroll) : go(curr + o.scroll);
                });
            }
            if(o.auto){
                setInterval(function() {
                    if(o.pauseOnHover && isMouseOver) return;
                    go(curr+o.scroll);
                }, o.auto+o.speed);
            }
function vis() {
return li.slice(curr).slice(0, v);
};
function go(to) {
if (!running) {
if (o.beforeStart)
o.beforeStart.call(this, vis());
if (o.circular) { // If circular we are in first or
last, then goto the other end
                        // console.debug(to,curr);
if (to <= o.start - v - 1) { // If first, then goto
last
ol.css(animCss, -((itemLength - (v * 2)) *
liSize) + "px");
                            // If "scroll" > 1, then the "to" might not be equal to the
condition; it can be lesser depending on the number of elements.
                            curr = to == o.start - v - 1 ? itemLength - (v * 2) - 1 : itemLength
- (v * 2) - o.scroll;
} else if (to >= itemLength - v + 1) { // If last,
then goto first
ol.css(animCss, -((v) * liSize) + "px");
// If "scroll" > 1, then the "to" might not be
equal to the condition; it can be greater depending on the number of
elements.
curr = to == itemLength - v + 1 ? v + 1 : v +
o.scroll;
} else curr = to;
} else {
                        // If non-circular and to points to first or last, we just return.
//ADDED: This determines when to stop scrolling when
more than 1 row is viewable
if (to < 0 || to > ((itemLength - v) / o.rows))
return;
else curr = to;
} // If neither overrides it, the curr will still be
"to" and we can proceed.
running = true;
ol.animate(
animCss == "left" ? { left: -(curr * liSize)} : { top:
-(curr * liSize) }, o.speed, o.easing,
function() {
if (o.afterEnd)
o.afterEnd.call(this, vis());
running = false;
}
);
                hideAndShowFlashContent(li, curr);
                update_navigation((o.circular) ? 0+curr : 1+curr);
                if(o.labels){
                    update_lables(curr);
                }
// Disable buttons when the carousel reaches the last/first,
and enable when not
if (!o.circular) {
    $(o.btnPrev + "," + o.btnNext).removeClass("disabled");
//ADDED: This determines when to add the disabled class
to the link when more than 1 row is viewable
                    $( (curr - o.scroll < 0 && o.btnPrev) || (curr + o.scroll >
((itemLength - v) / o.rows) && o.btnNext) || [] ).addClass(o.disableClass);
    }
}
return false;
};
            function hideAndShowFlashContent(liElements,curr){
                $(liElements).each(function(i){
                    if(i != curr){
                        $(this).children().children("object").each(function(){
                            $(this).css({
                                visibility: "hidden",
                                 position: "relative",
                                 zIndex: 0
                            });
                        });
                        if($(this).children().children("object").size() > 0){
                            var videoPlayer = $(this).children().children("object");
                            //videoPlayer.runCommand(["Video Player 1", "togglePlay", false,
'off']);
                        }
                    } else {
                        $(this).children().children("object").each(function(){
                            $(this).css({ visibility: "visible" });    
                            $(this).children("embed").css({
                                position: "relative",
                                zIndex: 0
                            });
                        });
                    }
                });
            }
            
            function update_lables(curr){
                var    kids = $(o.carousel).children();
                var nextPos = curr+1;
                var prevPos = curr;
                
                var nextREPLACE =
$(kids[nextPos]).children().children("caption").html();
                var prevREPLACE =
$(kids[prevPos]).children().children("caption").html();
                var re = new RegExp(o.btnRegExp, "g");
                    
                var btnNextHtmlNew = $(o.btnNext).parent().html().replace(re,
nextREPLACE);
                var btnPrevHtmlNew = $(o.btnPrev).parent().html().replace(re,
prevREPLACE);
                $(o.btnNext).parent().html(btnNextHtmlNew);
                $(o.btnPrev).parent().html(btnPrevHtmlNew);
            }
            
            
            function create_navigation(){
                if ($(o.carousel).size() > 0) {
                    // build links
                    $(o.carousel).each(function(i){
                        if($(this).children().size() > 1) {
                            $(this).parent().append(o.btnNavContainer);
                            var carouselNavDiv = $(this).parent().children(o.btnNavTarget);         
                            $(carouselNavDiv).append(o.btnPrevHtml);
                            $(this).children().each(function(j){
                                panelNum = j;
                                linkNum = (j+1);
            $(carouselNavDiv).append('<li class="indicator"> # '+linkNum+'
</li>');
                            });        
                            $(carouselNavDiv).append(o.btnNextHtml);
                        }
                    });
                }
            }
            
            
            // Clean up and abstract this code. @todo
            function update_navigation(curr){
                var    kids = $(o.panel);
                var cloneVal = (o.circular) ? 2 : 0;
                var pos = (kids.size()-cloneVal <= curr) ? (curr > kids.size()-cloneVal)
? 2 : kids.size()-cloneVal : curr;
                pos = (pos == 0) ? kids.size()-cloneVal : pos;
                var    indicatorImages =    $(o.btnIndicator);
                var sectionLinks = $("#sectionlinks a");
                for(k =    0; k < indicatorImages.size(); k++){
                    if(pos == k+1){
                        $(indicatorImages[k]).attr("class", 'on');
                    } else {
                        $(indicatorImages[k]).attr("class", 'off');
                    }
                }
                
                for(k =    0; k < sectionLinks.size(); k++){
                    if(pos == k+1){
                        $(sectionLinks[k]).attr("class", 'selected');
                    } else {
                        $(sectionLinks[k]).attr("class", 'off');
                    }
                }
            };
});
};
    function css(el, prop) {
        return parseInt($.css(el[0], prop))    || 0;
    };
    
    function width(el) {
        return    el[0].offsetWidth +    css(el,    'marginLeft') +    css(el,    'marginRight');
    };
    
    function height(el)    {
        return el[0].offsetHeight +    css(el,    'marginTop') + css(el,
'marginBottom');
    };
})(jQuery);
--
View this message in context: http://www.nabble.com/jcarousellite%3A-problem-finding-current-position-when-visibility-is-a-fraction-tp22218028s27240p22218028.html
Sent from the jQuery General Discussion mailing list archive at Nabble.com.