Monday, November 2, 2009

[jQuery] jquery glider inside tabs

Hi, I'm trying to create a 3 tabbed panel with a slideshow in each
tab. The information will be dynamically generated by my CMS. The
problem I'm running into is that the plugin I'm using allows for only
one initialized id. So I am initializing <ul id = "theSlides"> and it
works in the first tab, but doesn't work in any of the other two. I
think this is due to the duplication of ids but I don't know how to
get around that. Any ideas? here is my code below:
<script>

//Featured Content Glider: By http://www.dynamicdrive.com
//Created: Dec 22nd, 07'
//Updated (Jan 29th, 08): Added four possible slide directions:
"updown", "downup", "leftright", or "rightleft"
//Updated (Feb 1st, 08): Changed glide behavior to reverse direction
when previous button is clicked
//Updated (Feb 12th, 08): Added ability to retrieve gliding contents
from an external file using Ajax ("remotecontent" variable added to
configuration)

var featuredcontentglider={
csszindex: 100,
ajaxloadingmsg: '<b>Fetching Content. Please wait...</b>',
glide:function(config, showpage, isprev){
var selected=parseInt(showpage)
if (selected>=config.$contentdivs.length){ //if no content exists at
this index position
//alert("No content exists at page "+(selected+1)+"! Loading 1st
page instead.")
selected=0
}
var $target=config.$contentdivs.eq(selected)
//Test for toggler not being initialized yet, or user clicks on the
currently selected page):
if (config.$togglerdiv.attr('lastselected')==null || parseInt(config.
$togglerdiv.attr('lastselected'))!=selected){
var $selectedlink=config.$toc.eq(selected)
config.$next.attr('loadpage', (selected<config.
$contentdivs.length-1)? selected+1+'pg' : 0+'pg')
config.$prev.attr('loadpage', (selected==0)? config.
$contentdivs.length-1+'pg' : selected-1+'pg')
var startpoint=(isprev=="previous")? -config.startpoint :
config.startpoint
$target.css(config.leftortop, startpoint).css("zIndex",
this.csszindex++) //hide content so it's just out of view before
animating it
var endpoint=(config.leftortop=="left")? {left:0} : {top:0} //
animate it into view
$target.animate(endpoint, config.speed)
config.$toc.removeClass('selected')
$selectedlink.addClass('selected')
config.$togglerdiv.attr('lastselected', selected+'pg')
}
},

getremotecontent:function(config){
config.$glider.html(this.ajaxloadingmsg)
$.ajax({
url: config.remotecontent,
error:function(ajaxrequest){
config.$glider.html('Error fetching content.<br />Server Response:
'+ajaxrequest.responseText)
},
success:function(content){
config.$glider.html(content)
featuredcontentglider.setuptoggler(config)
}
})
},

aligncontents:function(config){
config.$contentdivs=$("#"+config.gliderid+" ."+config.contentclass)
config.$contentdivs.css(config.leftortop, config.startpoint).css
({height: config.$glider.height(), visibility: 'visible'}) //position
content divs so they're out of view:
},

setuptoggler:function(config){
this.aligncontents(config)
config.$togglerdiv.hide()
config.$toc.each(function(index){
$(this).attr('pagenumber', index+'pg')
if (index > (config.$contentdivs.length-1))
$(this).css({display: 'none'}) //hide redundant "toc" links
})
var $nextandprev=$("#"+config.togglerid+" .next, #"+config.togglerid
+" .prev")
$nextandprev.click(function(event){ //Assign click behavior to
'next' and 'prev' links
featuredcontentglider.glide(config, this.getAttribute('loadpage'),
this.getAttribute('buttontype'))
event.preventDefault() //cancel default link action
})
config.$toc.click(function(event){ //Assign click behavior to 'toc'
links
featuredcontentglider.glide(config, this.getAttribute
('pagenumber'))
event.preventDefault()
})
config.$togglerdiv.fadeIn(1000, function(){
featuredcontentglider.glide(config, config.selected)
if (config.autorotate==true){ //auto rotate contents?
config.stepcount=0 //set steps taken
config.totalsteps=config.
$contentdivs.length*config.autorotateconfig[1] //Total steps limit:
num of contents x num of user specified cycles)
featuredcontentglider.autorotate(config)
}
})
config.$togglerdiv.click(function(){
featuredcontentglider.cancelautorotate(config.togglerid)
})
},

autorotate:function(config){
var rotatespeed=config.speed+config.autorotateconfig[0]
window[config.togglerid+"timer"]=setInterval(function(){
if (config.totalsteps>0 && config.stepcount>=config.totalsteps){
clearInterval(window[config.togglerid+"timer"])
}
else{
config.$next.click()
config.stepcount++
}
}, rotatespeed)
},

cancelautorotate:function(togglerid){
if (window[togglerid+"timer"])
clearInterval(window[togglerid+"timer"])
},

getCookie:function(Name){
var re=new RegExp(Name+"=[^;]+", "i") //construct RE to search for
target name/value pair
if (document.cookie.match(re)) //if cookie found
return document.cookie.match(re)[0].split("=")[1] //return its
value
return null
},

setCookie:function(name, value){
document.cookie = name+"="+value
},

init:function(config){
$(document).ready(function(){
config.$glider=$("#"+config.gliderid)
config.$togglerdiv=$("#"+config.togglerid)
config.$toc=config.$togglerdiv.find('.toc')
config.$next=config.$togglerdiv.find('.next')
config.$prev=config.$togglerdiv.find('.prev')
config.$prev.attr('buttontype', 'previous')
var selected=(config.persiststate)? featuredcontentglider.getCookie
(config.gliderid) : config.selected
config.selected=(isNaN(parseInt(selected))) ? config.selected :
selected //test for cookie value containing null (1st page load) or
"undefined" string
config.leftortop=(/up/i.test(config.direction))? "top" : "left" //
set which CSS property to manipulate based on "direction"
config.heightorwidth=(/up/i.test(config.direction))? config.
$glider.height() : config.$glider.width() //Get glider height or width
based on "direction"
config.startpoint=(/^(left|up)/i.test(config.direction))? -
config.heightorwidth : config.heightorwidth //set initial position of
contents based on "direction"
if (typeof config.remotecontent!="undefined" &&
config.remotecontent.length>0)
featuredcontentglider.getremotecontent(config)
else
featuredcontentglider.setuptoggler(config)
$(window).bind('unload', function(){ //clean up and persist
config.$togglerdiv.unbind('click')
config.$toc.unbind('click')
config.$next.unbind('click')
config.$prev.unbind('click')
if (config.persiststate)
featuredcontentglider.setCookie(config.gliderid, config.
$togglerdiv.attr('lastselected'))
config=null

})
})
}
}

/* Settings for slideshow */
featuredcontentglider.init({
gliderid: "theSlides", //ID of main glider container
gliderid1: "theSlides1", //ID of main glider container
gliderid2: "theSlides2", //ID of main glider container
gliderclass:"theSlidesClass", //Class of main glider container
contentclass: "slidePanel", //Shared CSS class name of each glider
content
togglerid: "jqsNav", //ID of toggler container
remotecontent: "", //Get gliding contents from external file
on server? "filename" or "" to disable
selected: 0, //Default selected content index (0=1st)
persiststate: false, //Remember last content shown within
browser session (true/false)?
speed: 300, //Glide animation duration (in
milliseconds)
direction: "leftright", //set direction of glide: "updown",
"downup", "leftright", or "rightleft"
autorotate: false, //Auto rotate contents (true/false)?
autorotateconfig: [3000, 2] //if auto rotate enabled, set
[milliseconds_btw_rotations, cycles_before_stopping]
})


</script>


<div id="tabs" class="tablicious">
<ul>
<c:forEach var="headLineTab" items="${headlines}">
<li><a href='#tabs-<c:out value="${headLineTab.key}"/
>'><c:out value="${headLineTab.key}"/></a></li>
</c:forEach>
</ul>
<c:forEach var="headLineTab" items="${headlines}">
<div id='tabs-<c:out value="${headLineTab.key}"/>'>
<div id="jqSlideshow">
<ul id="theSlides" class="theSlidesClass">
<c:forEach var="headLine" items="${headLineTab.value}">
<c:set var="image">
<bn:metadata propertyName="image" resultName="headLine" />
</c:set>
<li class="slidePanel">
<div class="jqsImg" style="float:left;">
<c:choose>
<c:when test="${image != ''}">
<img border="0" src='/CMSPortalWeb/fetch/<c:out value="$
{image}"/>' width="173" height="228" alt="Headline Image">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
</div>
<div class="caption">
<div class="content">
<h3>
<bn:metadata propertyName="title" resultName="headLine" />
</h3>
<p>
<bn:metadata propertyName="text" resultName="headLine" />
</p>
</div>
</div>
</li>

</c:forEach>
</ul>
<ul id="jqsNav">
<li class="mover prev"><a href="#">Prev</a></li>
<c:forEach begin="0" varStatus="index" items="$
{headLineTab.value}" >
<li class="toc"><a href="#"><c:out value="${index.count}" /></
a></li>
</c:forEach>
<li class="mover next"><a href="#">Next</a></li>
</ul>


</div>
</div>
</c:forEach>
</div>

No comments: