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.