/*
* jquery edslider plugin v.1.4
* @author eduardo moreno
* code under mit license
*/
(function($){
$.fn.edslider = function(settings){
var defaults = {
width : 960,
height : 400,
position : 1,
interval : 5000,
duration : 500,
animation : true,
paginator : true,
navigator : true,
progress : true,
loadimgsrc: 'images/load.gif',
skin : 'edslider'
};
var options = $.extend({}, defaults, settings);
this.each(function(){
//building (wrapping, validating, setting up)
var slider = $(this),
sliderli = slider.find('li'),
sliderbgimg = sliderli.css('background-image');
sliderli.length == 0 && console.error('error: empty slider!');
var sliderimg = slider.find('img'),
wrapper = slider
.wrap('
')
.parent()
.css({
'width' : options.width,
'background-color' : 'transparent',
'background-repeat' : 'no-repeat',
'background-position': 'center'
}),
startposition = options.position;
if(options.position == 0 || options.position > sliderli.length){
console.error('error: start position value must be between 1 and ' + sliderli.length + '!');
startposition = 1;
}
slider
.on('mouseenter', function(){
$(this).addclass('hover');
hovercontrol();
})
.on('mouseleave', function(){
$(this).removeclass('hover');
hovercontrol();
})
.add(sliderli)
.css('height', options.height);
sliderli
.css('width', options.width)
.filter(':nth-child(' + startposition + ')')
.addclass('current');
//controls (navigation, pagination and progress bar)
var position, controls, paginator, paginatorli, progress, progresswidth, progresselapsed, interact = false;
if((options.navigator || options.paginator) && sliderli.length > 1){
controls = wrapper
.on('selectstart', false)
.append('')
.find('.controls');
if(options.paginator){
paginator = controls
.prepend('')
.find('.paginator')
.hide();
sliderli.each(function(){
paginator.append(' ');
});
paginatorli = paginator
.find('li')
.on('click', function(){
if(interact){
position = $(this).index();
if((index - 1) != position){
sliderli
.removeclass('current')
.filter(':nth-child(' + ++position + ')')
.addclass('current');
play();
}
}
})
}
if(options.navigator){
controls
.append('')
.find('.navigator')
.hide()
.on('click', function(){
var btn = $(this);
btn.hasclass('next') && interact && next();
btn.hasclass('prev') && interact && prev();
});
}
}
progress = wrapper
.prepend('')
.find('.progress').width(0);
!options.progress && progress.height(0);
//functions (init, play, next, prev, pause, resume)
var timeleft = options.interval, current, index, paused;
function init(){
progressresize();
sliderli.length > 1 ? play() : sliderli.fadein(options.duration);
}
function play(){
progressreset();
interact = false;
current = sliderli
.filter('.current')
.siblings()
.fadeout(options.animation && options.duration || 0)
.end()
.fadein(options.animation && options.duration || 0, function(){
interval();
});
$('.navigator')
.add('.paginator')
.fadein(options.animation && options.duration || 0);
index = sliderli.index(current) + 1;
if(options.paginator){
paginatorli
.removeclass('current')
.filter(':nth-child(' + index + ')')
.addclass('current');
}
}
function next(){
sliderli.removeclass('current');
if(++index <= sliderli.length){
current
.next()
.addclass('current')
} else {
sliderli
.filter(':first-child')
.addclass('current');
}
play();
}
function prev(){
sliderli.removeclass('current');
if(--index >= 1){
current
.prev()
.addclass('current')
} else {
sliderli
.filter(':last-child')
.addclass('current');
}
play();
}
function pause(){
paused = true;
progresselapsed = progress
.stop()
.width();
timeleft = (progresswidth - progresselapsed) * (options.interval / progresswidth);
}
function interval(){
paused = false;
interact = true;
progress
.stop()
.show()
.animate({
width: '+=' + (progresswidth - progresselapsed)
}, timeleft, 'linear', function(){
progressreset();
next();
});
hovercontrol();
}
function progressreset(){
progress.stop().width(0);
progresselapsed = 0;
timeleft = options.interval;
}
function progressresize(){
$(window)
.resize(function(){
progresswidth = slider.width();
pause(); interval();
}).resize();
}
function hovercontrol(){
if(interact){
if(slider.hasclass('hover')){
pause();
} else if(paused){
interval();
}
}
}
//preloading images and init
var totalimgsurl = [],
preloadedimgs = 0;
sliderli.each(function(){
sliderbgimg = $(this).css('background-image').replace(/.*\s?url\([\'\"]?/, '').replace(/[\'\"]?\).*/, '');
sliderbgimg != 'none' && totalimgsurl.push(sliderbgimg);
});
sliderimg.each(function(){
totalimgsurl.push(this.src);
});
if(totalimgsurl){
$.each(totalimgsurl, function(value){
$('')
.hide()
.attr('src', totalimgsurl[value])
.on('load', function(){
if(++preloadedimgs == totalimgsurl.length){
slider.css('background-image', 'none');
init();
} else {
slider.css({
'background-image' : 'url("' + options.loadimgsrc + '")',
'background-repeat' : 'no-repeat',
'background-position': 'center'
});
}
});
});
} else {
init();
}
});
}
})(jquery);