(function ($) {
    $.fn.extend({
        infiniteCarousel: function (options) {
            var defaults = {
                transitionSpeed: 800,
                displayTime: 6000,
                textholderHeight: .25,
                displayProgressBar: true,
                displayThumbnails: true,
                displayThumbnailNumbers: true,
                displayThumbnailBackground: true,
                thumbnailWidth: '20px',
                thumbnailHeight: '20px',
                thumbnailFontSize: '.7em',
                easeLeft: 'linear',
                easeRight: 'linear',
                imagePath: '/Style Library/ntelos/images/large-carousel/',
                inView: 1,
                padding: '0px',
                advance: 1,
                showControls: true,
                autoHideControls: false,
                autoHideCaptions: false,
                autoStart: true,
                prevNextInternal: true,
                enableKeyboardNav: true,
                onSlideStart: function () {},
                onSlideEnd: function () {},
                onPauseClick: function () {},
                borderHilight: '#FFFFFF',
                borderDefault: '#005495'
            };
            var options = $.extend(defaults, options);
            return this.each(function () {
                var randID = Math.round(Math.random() * 100000000);
                var o = options;
                var obj = $(this);	// References #main_carousel
                var autopilot = o.autoStart;
                var numImages = $('img', obj).length;
                var imgHeight = $('img:first', obj).height();
                var imgWidth = $('img:first', obj).width();
                if (o.inView > numImages - 1) o.inView = numImages - 1;
                $('p', obj).hide();
                $(obj).css({
                    'position': 'relative',
                    'overflow': 'hidden'
                });//DMoxin: Commenting out width setting js.  Let CSS define; .width((imgWidth * o.inView) + (o.inView * parseInt(o.padding) * 2)).height(imgHeight + (parseInt(o.padding) * 2));
                $('ul', obj).css({
                    'list-style': 'none',
                    'margin': '0',
                    'padding': '0',
                    'position': 'relative'
                }).width(imgWidth * numImages);
                $('li', obj).css({
                    'display': 'inline',
                    'float': 'left',
                    'padding': o.padding
                });
                $('li:last', obj).prependTo($('ul', obj));
                $('ul', obj).css('left', -imgWidth - (parseInt(o.padding) * 2) + 'px').width(9999);
                if (o.displayProgressBar) {
                    $(obj).append('<div id="progress' + randID + '" class="ic-progress-bar" style="position:absolute;bottom:0;background:#bbb;left:0;z-index:1"></div>');
                    $('#progress' + randID).width('100%').height(5).css('opacity', '.6')
                }
                function startProgressBar(barTime) {
                    barTime = (barTime == null) ? o.displayTime : barTime;
                    $('#progress' + randID).width('100%').height(5);
                    $('#progress' + randID).animate({
                        'width': 0
                    }, barTime)
                }
                var containerBorder = parseInt($(obj).css('border-bottom-width')) + parseInt($(obj).css('border-top-width'));
                if (isNaN(containerBorder)) containerBorder = 0;
                var containerPaddingLeft = parseInt($(obj).css('padding-left'));
                for (i = 1; i <= o.inView; i++) {
                    $(obj).append('<div id="textholder' + randID + '_' + i + '" class="textholder" style="position:absolute;width:' + imgWidth + 'px;bottom:0px;margin-bottom:' + -(imgHeight * o.textholderHeight + containerBorder) + 'px;"><span></span></div>');
                    $('#textholder' + randID + '_' + i).css({
                        'left': (i - 1) * (imgWidth + parseInt(o.padding) * 2),
                        'margin-left': parseInt(o.padding) + containerPaddingLeft,
                        'margin-right': o.padding
                    });
                    $('#textholder' + randID + '_' + i).height(imgHeight * o.textholderHeight).css({
                        'backgroundColor': '#FFF',
                        'opacity': '0.5'
                    });
                    html = '<div class="minmax" id="minmax' + randID + '_' + i + '" style="width:8px;height:8px;position:absolute;top:1px;right:10px;cursor:pointer;background:url(' + o.imagePath + 'caption.gif) no-repeat 0 -8px"></div>';
                    html += '<div class="close" id="close' + randID + '_' + i + '" style="width:8px;height:8px;position:absolute;top:1px;right:1px;cursor:pointer;background:url(' + o.imagePath + 'caption.gif) no-repeat 0 0"></div>';
                    $('#textholder' + randID + '_' + i).append(html);
                    $('#minmax' + randID + '_' + i).hide();
                    $('#close' + randID + '_' + i).hide();
                    if (!o.autoHideCaptions) showtext($('li:eq(' + i + ') p', obj).html(), i)
                }
                var textholderPadding = parseInt($('#textholder' + randID + '_1').css('padding-left')) + parseInt($('#textholder' + randID + '_1').css('padding-right'));
                if (textholderPadding > 0) $('.textholder', obj).width(imgWidth - textholderPadding);
                $('.close', obj).each(function (i) {
                    $(this).click(function () {
                        $('#textholder' + randID + '_' + (i + 1)).animate({
                            marginBottom: (-imgHeight * o.textholderHeight) - containerBorder - 1 + 'px'
                        }, 500)
                    })
                });
                $('.minmax', obj).each(function (i) {
                    $(this).click(function () {
                        if (parseInt($('#textholder' + randID + '_' + (i + 1)).css('margin-bottom')) == 0) {
                            $('#textholder' + randID + '_' + (i + 1)).animate({
                                marginBottom: ((-imgHeight * o.textholderHeight) - containerBorder + 12) + 'px'
                            }, 500, function () {
                                $('#minmax' + randID + '_' + (i + 1)).css('background-position', '0 -16px')
                            })
                        } else {
                            $('#textholder' + randID + '_' + (i + 1)).animate({
                                marginBottom: '0px'
                            }, 500, function () {
                                $('#minmax' + randID + '_' + (i + 1)).css('background-position', '0 -8px')
                            })
                        }
                    })
                });

                function showtext(t, i) {
                    if (autopilot) {
                        $('#minmax' + randID + '_' + i).hide();
                        $('#close' + randID + '_' + i).hide()
                    }
                    if (t != null) {
                        $('#textholder' + randID + '_' + i + ' span').html(t);
                        $('#textholder' + randID + '_' + i).stop().animate({
                            marginBottom: '0px'
                        }, 500);
                        $('#minmax' + randID + '_' + i).css('background-position', '0 -8px');
                        showminmax()
                    }
                }
                function showminmax() {
                    if (!autopilot) {
                        $('.minmax', obj).fadeIn(250);
                        $('.close', obj).fadeIn(250)
                    }
                }
                function hideCaption() {
                    $('.textholder', obj).stop().animate({
                        marginBottom: (-imgHeight * o.textholderHeight - containerBorder - 1) + 'px'
                    }, o.transitionSpeed)
                }
                if (o.displayThumbnails) {
                    $(obj).wrapAll('<div class="largeCarouselContainer"></div>');
                    function thumbclick(event) {
                        target_num = this.id.split('_');
                        if (viewable[0] != target_num[1]) {
                            status = 'pause';
                            $('#progress' + randID).stop().fadeOut();
                            clearTimeout(clearInt);
                            $('#thumbs' + randID + ' div').css({
                                'cursor': 'default'
                            }).unbind('click');
                            autopilot = 0;
                            setTimeout(function () {
                                $('#play_pause_btn' + randID).css('background-position', '0 -16px')
                            }, o.transitionSpeed);
                            $('#play_pause_btn' + randID).unbind('click').bind('click', function () {
                                forceStart()
                            })
                        }
                        if (target_num[1] > viewable[0]) {
                            diff = target_num[1] - viewable[0];
                            moveLeft(diff)
                        }
                        if (target_num[1] < viewable[0]) {
                            diff = viewable[0] - target_num[1];
                            moveRight(diff)
                        }
                    }
                    var viewable = [];
                    var unviewable = [];
                    $(obj).after('<div id="thumbs' + randID + '" class="thumblist"></div>');
                    for (i = 0; i <= numImages - 1; i++) {
                        thumb = $('img:eq(' + (i + 1) + ')', obj).attr('src');
                        if (thumb) {
                            thumb_parts = thumb.split('/');
                            file_name = thumb_parts.pop();
                            thumb = thumb_parts.join('/') + '/thumbs/' + file_name
                        }
                        $('#thumbs' + randID).append('<div class="thumb" id="thumb' + randID + '_' + (i + 1) + '" style="cursor:pointer;background-image:url(' + thumb + ');display:inline;float:left;width:' + o.thumbnailWidth + ';height:' + o.thumbnailHeight + ';line-height:' + o.thumbnailHeight + ';padding:0;overflow:hidden;text-align:center;border:2px solid ' + o.borderDefault + ';margin:0 4px 1px 0;font-size:' + o.thumbnailFontSize + ';font-family:Arial;color:#000;text-shadow:0 0 3px #fff">' + (i + 1) + '</div>');
                        if (i <= o.inView) $('#thumb' + randID + '_' + i).css({
                            'border-color': o.borderHilight
                        });
                        unviewable.push(i + 1)
                    }
                    for (i = 1; i <= o.inView; i++) viewable.push(unviewable.shift());
                    thumb = $('img:first', obj).attr('src');
                    if (thumb) {
                        thumb_parts = thumb.split('/');
                        file_name = thumb_parts.pop();
                        thumb = thumb_parts.join('/') + '/thumbs/' + file_name
                    }
                    $('#thumb' + randID + '_' + numImages).css({
                        'background-image': 'url(' + thumb + ')'
                    });
                    $('#thumbs' + randID + ' div.thumb:not(:first)').css({
                        opacity: .65
                    });
                    $('#thumbs' + randID + ' div.thumb').hover(function () {
                        $(this).animate({
                            'opacity': 1
                        }, 150)
                    }, function () {
                        if (viewable[0] != this.id.split('_')[1]) $(this).animate({
                            'opacity': .65
                        }, 250)
                    });
                    $('#thumbs' + randID + ' div').bind('click', thumbclick);
                    if (!o.displayThumbnailNumbers) $('#thumbs' + randID + ' div').text('');
                    if (!o.displayThumbnailBackground) $('#thumbs' + randID + ' div').css({
                        'background-image': 'none'
                    })
                }
                if (o.showControls) {
                    html = '<div id="play_pause_btn' + randID + '" style="cursor:pointer;position:absolute;top:3px;right:3px;border:none;width:16px;height:16px;background:url(' + o.imagePath + 'large-carousel/playpause.gif) no-repeat 0 0"></div>';
                    $(obj).append(html);
                    var status = 'play';
                    $('#play_pause_btn' + randID).css('opacity', .5).hover(function () {
                        $(this).animate({
                            opacity: '1'
                        }, 250)
                    }, function () {
                        $(this).animate({
                            opacity: '.5'
                        }, 250)
                    });
                    $('#play_pause_btn' + randID).click(function () {
                        status = (status == 'play') ? 'pause' : 'play';
                        (status == 'play') ? forceStart() : forcePause()
                    });
                    if (!o.prevNextInternal) {
                        wrapID = $(obj).attr('id') + 'Wrapper';
                        $(obj).wrap('<div id="' + wrapID + '"></div>').css('margin', '0 auto');
                        $('#' + wrapID).css('position', 'relative').width(($(obj).width() + 40 + parseInt($(obj).css('padding-left')) + parseInt($(obj).css('padding-right'))))
                    }
                    arrowsTop = ((imgHeight / 2) - 15) + parseInt(o.padding);
                    html = '<div id="btn_rt' + randID + '" style="position:absolute;right:2px;top:' + arrowsTop + 'px;cursor:pointer;border:none;width:13px;height:30px;background:url(' + o.imagePath + 'large-carousel/large_carousel_left_right.png) no-repeat 0 0"></div>';
                    html += '<div id="btn_lt' + randID + '" style="position:absolute;left:2px;top:' + arrowsTop + 'px;cursor:pointer;border:none;width:13px;height:30px;background:url(' + o.imagePath + 'large-carousel/large_carousel_left_right.png) no-repeat -13px 0"></div>';
                    (o.prevNextInternal) ? $(obj).append(html) : $('#' + wrapID).append(html);
                    $('#btn_rt' + randID).css('opacity', .5).click(function () {
                        forcePrevNext('next')
                    }).hover(function () {
                        $(this).animate({
                            opacity: '1'
                        }, 250)
                    }, function () {
                        $(this).animate({
                            opacity: '.5'
                        }, 250)
                    });
                    $('#btn_lt' + randID).css('opacity', .5).click(function () {
                        forcePrevNext('prev')
                    }).hover(function () {
                        $(this).animate({
                            opacity: '1'
                        }, 250)
                    }, function () {
                        $(this).animate({
                            opacity: '.5'
                        }, 250)
                    });
                    if (o.autoHideControls && o.prevNextInternal) {
                        function showcontrols() {
                            $('#play_pause_btn' + randID).stop().animate({
                                top: '3px',
                                right: '3px'
                            }, 250);
                            $('#btn_rt' + randID).stop().animate({
                                top: arrowsTop + 'px',
                                right: '2px'
                            }, 250);
                            $('#btn_lt' + randID).stop().animate({
                                top: arrowsTop + 'px',
                                left: '2px'
                            }, 250)
                        }
                        function hidecontrols() {
                            $('#play_pause_btn' + randID).stop().animate({
                                top: -16 - containerBorder + 'px',
                                right: -16 - containerBorder + 'px'
                            }, 250);
                            $('#btn_rt' + randID).stop().animate({
                                right: '-16px'
                            }, 250);
                            $('#btn_lt' + randID).stop().animate({
                                left: '-16px'
                            }, 250)
                        }
                        $(obj).hover(showcontrols, hidecontrols);
                        hidecontrols()
                    }
                    if (o.autoHideCaptions) {
                        var isHover;

                        function autoShowCap() {
                            isHover = true;
                            for (i = 1; i <= o.inView; i++) showtext($('li:eq(' + i + ') p', obj).html(), i)
                        }
                        function autoHideCap() {
                            isHover = false;
                            hideCaption()
                        }
                        $(obj).hover(autoShowCap, autoHideCap);
                        hideCaption()
                    }
                }
                function keyBind() {
                    if (o.enableKeyboardNav) {
                        $(document).keydown(function (event) {
                            if (event.keyCode == 39) {
                                forcePrevNext('next');
                                $(document).unbind('keydown')
                            }
                            if (event.keyCode == 37) {
                                forcePrevNext('prev');
                                $(document).unbind('keydown')
                            }
                            if (event.keyCode == 80 || event.keyCode == 111) forcePause();
                            if (event.keyCode == 83 || event.keyCode == 115) {
                                forceStart();
                                $(document).unbind('keydown')
                            }
                        })
                    }
                }
                function forcePrevNext(dir) {
                    o.onPauseClick.call(this);
                    $('#btn_rt' + randID).unbind('click');
                    $('#btn_lt' + randID).unbind('click');
                    setTimeout(function () {
                        $('#play_pause_btn' + randID).css('background-position', '0 -16px')
                    }, o.transitionSpeed - 1);
                    autopilot = 0;
                    $('#progress' + randID).stop().fadeOut();
                    status = 'pause';
                    clearTimeout(clearInt);
                    (dir == 'prev') ? moveRight() : moveLeft();
                    $('#play_pause_btn' + randID).unbind('click');
                    setTimeout(function () {
                        $('#play_pause_btn' + randID).bind('click', function () {
                            forceStart()
                        });
                        $('#btn_rt' + randID).bind('click', function () {
                            forcePrevNext('next')
                        });
                        $('#btn_lt' + randID).bind('click', function () {
                            forcePrevNext('prev')
                        })
                    }, o.transitionSpeed)
                }
                function forcePause() {
                    $('#play_pause_btn' + randID).unbind('click');
                    if (autopilot) {
                        o.onPauseClick.call(this);
                        $('#play_pause_btn' + randID).fadeTo(250, 0, function () {
                            $(this).css({
                                'background-position': '0 -16px',
                                'opacity': '.5'
                            })
                        }).animate({
                            opacity: .5
                        }, 250);
                        autopilot = 0;
                        showminmax();
                        $('#progress' + randID).stop().fadeOut();
                        clearTimeout(clearInt);
                        setTimeout(function () {
                            $('#play_pause_btn' + randID).bind('click', function () {
                                forceStart()
                            })
                        }, o.transitionSpeed)
                    }
                }
                function forceStart() {
                    $('#play_pause_btn' + randID).unbind('click');
                    if (!autopilot) {
                        setTimeout(function () {
                            $('#play_pause_btn' + randID).css('background-position', '0 0')
                        }, o.transitionSpeed - 1);
                        autopilot = 1;
                        moveLeft();
                        clearInt = setInterval(function () {
                            moveLeft()
                        }, o.displayTime + o.transitionSpeed);
                        setTimeout(function () {
                            $('#play_pause_btn' + randID).bind('click', function () {
                                forcePause()
                            })
                        }, o.transitionSpeed)
                    }
                }
                function preMove() {
                    hideCaption();
                    if (o.showControls && o.prevNextInternal) {
                        $('#play_pause_btn' + randID).fadeOut(200);
                        $('#btn_lt' + randID).fadeOut(200);
                        $('#btn_rt' + randID).fadeOut(200)
                    }
                    if (o.displayThumbnails) for (i = 1; i <= numImages; i++) $('#thumb' + randID + '_' + i).css({
                        'border-color': o.borderDefault
                    }).animate({
                        'opacity': .65
                    }, 500)
                }
                function postMove() {
                    if (o.showControls && o.prevNextInternal) {
                        $('#play_pause_btn' + randID).fadeIn(200);
                        $('#btn_lt' + randID).fadeIn(200);
                        $('#btn_rt' + randID).fadeIn(200)
                    }
                    keyBind();
                    if (o.autoHideCaptions && isHover) autoShowCap();
                    if (o.displayThumbnails) for (i = 0; i < viewable.length; i++) $('#thumb' + randID + '_' + viewable[i]).css({
                        'border-color': o.borderHilight
                    }).animate({
                        'opacity': 1
                    }, 500);
                    if (!o.autoHideCaptions) for (i = 1; i <= o.inView; i++) showtext($('li:eq(' + i + ') p', obj).html(), i);
                    if (o.displayThumbnails) $('#thumbs' + randID + ' div').unbind('click').bind('click', thumbclick).css({
                        'cursor': 'pointer'
                    });
                    ary = [];
                    for (x = 1; x <= o.inView; x++) {
                        ary.push($('img:eq(' + x + ')', obj).attr('src'))
                    }
                    o.onSlideEnd.call(this, ary)
                }
                function moveLeft(dist) {
                    if (dist == null) dist = o.advance;
                    preMove();
                    if (o.displayThumbnails) {
                        for (i = 1; i <= dist; i++) {
                            viewable.push(unviewable.shift());
                            unviewable.push(viewable.shift())
                        }
                    }
                    if (o.displayTime == 0) {
                        clearInterval(clearInt)
                    }
                    $('li:lt(' + dist + ')', obj).clone(true).insertAfter($('li:last', obj));
                    o.onSlideStart.call(this, viewable, 'left');
                    $('ul', obj).animate({
                        left: -imgWidth * (dist + 1) - (parseInt(o.padding) * (dist + 1)) * 2
                    }, o.transitionSpeed, o.easeLeft, function () {
                        $('li:lt(' + dist + ')', obj).remove();
                        $(this).css({
                            'left': -imgWidth - parseInt(o.padding) * 2
                        });
                        if (o.displayProgressBar && autopilot) startProgressBar();
                        postMove();
                        if (o.displayTime == 0) {
                            moveLeft()
                        }
                    })
                }
                function moveRight(dist) {
                    if (dist == null) dist = o.advance;
                    preMove();
                    if (o.displayThumbnails) {
                        for (i = 1; i <= dist; i++) {
                            viewable.unshift(unviewable.pop());
                            unviewable.unshift(viewable.pop())
                        }
                    }
                    $('li:gt(' + (numImages - (dist + 1)) + ')', obj).clone(true).insertBefore($('li:first', obj));
                    o.onSlideStart.call(this, viewable, 'right');
                    $('ul', obj).css('left', -(imgWidth * (dist + 1)) - (parseInt(o.padding) * ((dist + 1) * 2))).animate({
                        left: -imgWidth - (parseInt(o.padding) * 2)
                    }, o.transitionSpeed, o.easeRight, function () {
                        $('li:gt(' + (numImages - 1) + ')', obj).remove();
                        postMove()
                    })
                }
                if (autopilot) {
                    var clearInt = setInterval(function () {
                        moveLeft()
                    }, o.displayTime + o.transitionSpeed);
                    if (o.displayProgressBar) startProgressBar(o.displayTime + o.transitionSpeed)
                } else {
                    status = 'pause';
                    $('#play_pause_btn' + randID).css({
                        'background-position': '0 -16px'
                    })
                }
                keyBind()
            })
        }
    })
})(jQuery);
