/***** Feature X Contect Slider [FXCS] © MSXPS  *****/
(function($){
    $.fn.fxcs = function(options){
                
    var defaults = {
        mode: 'horizontal',  				// 'horizontal', 'vertical', 'fade'
        infiniteLoop: true,             	// true, false - display first slide after last
        hideControlOnEnd: false,        	// true, false - if true, will hide 'next' control on last slide and 'prev' control on first
        controls: true,                 	// true, false - previous and next controls
        speed: 500,                     	// integer - in ms, duration of time slide transitions will occupy
        pager: true,   	                	// true / false - display a pager
        pagerSelector: null,            	// jQuery selector - element to contain the pager. ex: '#pager'
        pagerType: 'full',              	// 'full', 'short' - if 'full' pager displays 1,2,3... if 'short' pager displays 1 / 4
        pagerLocation: 'bottom',        	// 'bottom', 'top' - location of pager
        pagerShortSeparator: '/',       	// string - ex: 'of' pager would display 1 of 4
        pagerActiveClass: 'pager-active',   // string - classname attached to the active pager link
        nextText: 'next',                   // string - text displayed for 'next' control
        nextImage: '',                      // string - filepath of image used for 'next' control. ex: 'images/next.jpg'
        nextSelector: null,                 // jQuery selector - element to contain the next control. ex: '#next'
        prevText: 'prev',                   // string - text displayed for 'previous' control
        prevImage: '',                      // string - filepath of image used for 'previous' control. ex: 'images/prev.jpg'
        prevSelector: null,                 // jQuery selector - element to contain the previous control. ex: '#next'
        captions: false,                    // true, false - display image captions (reads the image 'title' tag)
        captionsSelector: null,             // jQuery selector - element to contain the captions. ex: '#captions'
        auto: false,                        // true, false - make slideshow change automatically
        autoDirection: 'next',              // 'next', 'prev' - direction in which auto show will traverse
        autoControls: false,                // true, false - show 'start' and 'stop' controls for auto show
        autoControlsSelector: null,         // jQuery selector - element to contain the auto controls. ex: '#auto-controls'
        autoStart: true,                    // true, false - if false show will wait for 'start' control to activate
        autoHover: false,                   // true, false - if true show will pause on mouseover
        pause: 7000,                        // integer - in ms, the duration between each slide transition
        startText: 'start',                 // string - text displayed for 'start' control
        startImage: '',                     // string - filepath of image used for 'start' control. ex: 'images/start.jpg'
        stopText: 'stop',                   // string - text displayed for 'stop' control
        stopImage: '',                      // string - filepath of image used for 'stop' control. ex: 'images/stop.jpg'
        ticker: false,                      // true, false - continuous motion ticker mode (think news ticker)
                                            // note: autoControls, autoControlsSelector, and autoHover apply to ticker!
        tickerSpeed: 5000,                  // float - use value between 1 and 5000 to determine ticker speed - the smaller the value the faster the ticker speed
        tickerDirection: 'next',            // 'next', 'prev' - direction in which ticker show will traverse
        tickerHover: false,                 // true, false - if true ticker will pause on mouseover
        wrapperClass: 'fxcs-wrapper',       // string - classname attached to the slider wraper
        startingSlide: 0,                   // integer - show will start on specified slide. note: slides are zero based!
        displaySlideQty: 1,                 // integer - number of slides to display at once
        moveSlideQty: 1,                    // integer - number of slides to move at once
        randomStart: false,                 // true, false - if true show will start on a random slide
        onBeforeSlide: function(){},        // function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://fxcs.com/custom-pager
        onAfterSlide: function(){},         // function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://fxcs.com/custom-pager
        onLastSlide: function(){},          // function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://fxcs.com/custom-pager
        onFirstSlide: function(){},         // function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://fxcs.com/custom-pager
        onNextSlide: function(){},          // function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://fxcs.com/custom-pager
        onPrevSlide: function(){},          // function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://fxcs.com/custom-pager
        buildPager: null                    // function(slideIndex, slideHtmlObject){ return string; } - advanced use only! see the tutorial here: http://fxcs.com/custom-pager
    }
        
        var options = $.extend(defaults, options);
        
        // global vars
        var base = this;
        var $parent = $(this);
        var $children = $parent.children();
        var $outerWrapper = '';
        var $firstChild = $parent.children(':first');
        var childrenWidth = $firstChild.width();
        var childrenMaxWidth = 0;
        var childrenOuterWidth = $firstChild.outerWidth();
        var childrenMaxHeight = 0;
        var wrapperWidth = getWrapperWidth();
        var wrapperHeight = getWrapperHeight();
        var isWorking = false;
        var $pager = '';    
        var currentSlide = 0;   
        var origLeft = 0;
        var origTop = 0;
        var interval = '';
        var $autoControls = '';
        var $stopHtml = '';
        var $startContent = '';
        var $stopContent = '';
        var autoPlaying = true;
        var loaded = false;
        var origShowWidth = 0;
        var origShowHeight = 0;
        var tickerLeft = 0;
        var tickerTop = 0;
        
        // get the largest child's height and width
        $children.each(function(index) {
          if($(this).outerHeight() > childrenMaxHeight){
                childrenMaxHeight = $(this).outerHeight();
            }
            if($(this).outerWidth() > childrenMaxWidth){
                childrenMaxWidth = $(this).outerWidth();
            }
        });
                
        // get random slide number
        if(options.randomStart){
            var randomNumber = Math.floor(Math.random() * $children.length);
            currentSlide = randomNumber;
            origLeft = childrenOuterWidth * (options.moveSlideQty + randomNumber);
            origTop = childrenMaxHeight * (options.moveSlideQty + randomNumber);
        // start show at specific slide
        }else{
            currentSlide = options.startingSlide;
            origLeft = childrenOuterWidth * (options.moveSlideQty + options.startingSlide);
            origTop = childrenMaxHeight * (options.moveSlideQty + options.startingSlide);
        }
        var firstSlide = 0;
        var lastSlide = $children.length - 1;       
                        
        // PUBLIC FUNCTIONS
                        
        /**
         * Go to specified slide
         */     
        this.goToSlide = function(number, stopAuto){
            if(!isWorking){
                isWorking = true;
                // set current slide to argument
                currentSlide = number;
                options.onBeforeSlide(currentSlide, $children.length, $children.eq(currentSlide));
                // check if stopAuto argument is supplied
                if(typeof(stopAuto) == 'undefined'){
                    var stopAuto = true;
                }
                if(stopAuto){
                    // if show is auto playing, stop it
                    if(options.auto){
                        base.stopShow(true);
                    }
                }           
                // accomodate multiple displayed slides
                if(!options.infiniteLoop){
                    // if one of the last slides
                    if(currentSlide > lastSlide - options.displaySlideQty){
                        slide = (lastSlide - options.displaySlideQty) + 1;
                    }else{
                        slide = number;
                    }
                }else{
                    slide = number;
                }
                // check for first slide callback
                if(slide == firstSlide){
                    options.onFirstSlide(currentSlide, $children.length, $children.eq(currentSlide));
                }
                // check for last slide callback
                if(slide == lastSlide){
                    options.onLastSlide(currentSlide, $children.length, $children.eq(currentSlide));
                }
                // horizontal
                if(options.mode == 'horizontal'){
                    $parent.animate({'left': '-'+getSlidePosition(slide, 'left')+'px'}, options.speed, function(){
                        isWorking = false;
                        // perform the callback function
                        options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));
                    });
                // vertical
                }else if(options.mode == 'vertical'){
                    $parent.animate({'top': '-'+getSlidePosition(slide, 'top')+'px'}, options.speed, function(){
                        isWorking = false;
                        // perform the callback function
                        options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));
                    });         
                // fade 
                }else if(options.mode == 'fade'){
                    setChildrenFade();
                }
                // check to remove controls on last/first slide
                checkEndControls();
                // make the current slide active
                makeSlideActive(number);
                // display the caption
                showCaptions();
            }
        }
        
        /**
         * Go to next slide
         */     
        this.goToNextSlide = function(stopAuto){
            // check if stopAuto argument is supplied
            if(typeof(stopAuto) == 'undefined'){
                var stopAuto = true;
            }
            if(stopAuto){
                // if show is auto playing, stop it
                if(options.auto){
                    base.stopShow(true);
                }
            }           
            // makes slideshow finite
            if(!options.infiniteLoop){
                if(!isWorking){
                    var slideLoop = false;
                    // make current slide the old value plus moveSlideQty
                    currentSlide = (currentSlide + (options.moveSlideQty));
                    // if current slide has looped on itself
                    if(currentSlide >= lastSlide){
                        currentSlide = lastSlide;
                    }
                    checkEndControls();
                    // next slide callback
                    options.onNextSlide(currentSlide, $children.length, $children.eq(currentSlide));
                    // move to appropriate slide
                    base.goToSlide(currentSlide);
                } // end if(!isWorking)     
            }else{ 
                if(!isWorking){
                    isWorking = true;                   
                    var slideLoop = false;
                    // make current slide the old value plus moveSlideQty
                    currentSlide = (currentSlide + options.moveSlideQty);
                    // if current slide has looped on itself
                    if(currentSlide > lastSlide){
                        currentSlide = currentSlide % $children.length;
                        slideLoop = true;
                    }
                    // next slide callback
                    options.onNextSlide(currentSlide, $children.length, $children.eq(currentSlide));
                    // slide before callback
                    options.onBeforeSlide(currentSlide, $children.length, $children.eq(currentSlide));
                    if(options.mode == 'horizontal'){
                        // get the new 'left' property for $parent
                        var parentLeft = (options.moveSlideQty * childrenOuterWidth);
                        // animate to the new 'left'
                        $parent.animate({'left': '-='+parentLeft+'px'}, options.speed, function(){
                            isWorking = false;
                            // if its time to loop, reset the $parent
                            if(slideLoop){
                                $parent.css('left', '-'+getSlidePosition(currentSlide, 'left')+'px');
                            }
                            // perform the callback function
                            options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));
                        });
                    }else if(options.mode == 'vertical'){
                        // get the new 'left' property for $parent
                        var parentTop = (options.moveSlideQty * childrenMaxHeight);
                        // animate to the new 'left'
                        $parent.animate({'top': '-='+parentTop+'px'}, options.speed, function(){
                            isWorking = false;
                            // if its time to loop, reset the $parent
                            if(slideLoop){
                                $parent.css('top', '-'+getSlidePosition(currentSlide, 'top')+'px');
                            }
                            // perform the callback function
                            options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));
                        });
                    }else if(options.mode == 'fade'){
                        setChildrenFade();
                    }                   
                    // make the current slide active
                    makeSlideActive(currentSlide);
                    // display the caption
                    showCaptions();
                } // end if(!isWorking)
                
            }   
        } // end function
        
        /**
         * Go to previous slide
         */     
        this.goToPreviousSlide = function(stopAuto){
            // check if stopAuto argument is supplied
            if(typeof(stopAuto) == 'undefined'){
                var stopAuto = true;
            }
            if(stopAuto){
                // if show is auto playing, stop it
                if(options.auto){
                    base.stopShow(true);
                }
            }           
            // makes slideshow finite
            if(!options.infiniteLoop){  
                if(!isWorking){
                    var slideLoop = false;
                    // make current slide the old value plus moveSlideQty
                    currentSlide = currentSlide - options.moveSlideQty;
                    // if current slide has looped on itself
                    if(currentSlide < 0){
                        currentSlide = 0;
                        // if specified, hide the control on the last slide
                        if(options.hideControlOnEnd){
                            $('.fxcs-prev', $outerWrapper).hide();
                        }
                    }
                    checkEndControls();
                    // next slide callback
                    options.onPrevSlide(currentSlide, $children.length, $children.eq(currentSlide));
                    // move to appropriate slide
                    base.goToSlide(currentSlide);
                }                           
            }else{
                if(!isWorking){
                    isWorking = true;           
                    var slideLoop = false;
                    // make current slide the old value plus moveSlideQty
                    currentSlide = (currentSlide - (options.moveSlideQty));
                    // if current slide has looped on itself
                    if(currentSlide < 0){
                        negativeOffset = (currentSlide % $children.length);
                        if(negativeOffset == 0){
                            currentSlide = 0;
                        }else{
                            currentSlide = ($children.length) + negativeOffset; 
                        }
                        slideLoop = true;
                    }
                    // next slide callback
                    options.onPrevSlide(currentSlide, $children.length, $children.eq(currentSlide));
                    // slide before callback
                    options.onBeforeSlide(currentSlide, $children.length, $children.eq(currentSlide));
                    if(options.mode == 'horizontal'){
                        // get the new 'left' property for $parent
                        var parentLeft = (options.moveSlideQty * childrenOuterWidth);
                        // animate to the new 'left'
                        $parent.animate({'left': '+='+parentLeft+'px'}, options.speed, function(){
                            isWorking = false;
                            // if its time to loop, reset the $parent
                            if(slideLoop){
                                $parent.css('left', '-'+getSlidePosition(currentSlide, 'left')+'px');
                            }
                            // perform the callback function
                            options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));
                        });
                    }else if(options.mode == 'vertical'){
                        // get the new 'left' property for $parent
                        var parentTop = (options.moveSlideQty * childrenMaxHeight);
                        // animate to the new 'left'
                        $parent.animate({'top': '+='+parentTop+'px'}, options.speed, function(){
                            isWorking = false;
                            // if its time to loop, reset the $parent
                            if(slideLoop){
                                $parent.css('top', '-'+getSlidePosition(currentSlide, 'top')+'px');
                            }
                            // perform the callback function
                            options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));
                        });
                    }else if(options.mode == 'fade'){
                        setChildrenFade();
                    }                   
                    // make the current slide active
                    makeSlideActive(currentSlide);
                    // display the caption
                    showCaptions();
                } // end if(!isWorking)             
            }
        } // end function
        
        /**
         * Go to first slide
         */     
        this.goToFirstSlide = function(stopAuto){
            // check if stopAuto argument is supplied
            if(typeof(stopAuto) == 'undefined'){
                var stopAuto = true;
            }
            base.goToSlide(firstSlide, stopAuto);
        }
        
        /**
         * Go to last slide
         */     
        this.goToLastSlide = function(){
            // check if stopAuto argument is supplied
            if(typeof(stopAuto) == 'undefined'){
                var stopAuto = true;
            }
            base.goToSlide(lastSlide, stopAuto);
        }
        
        /**
         * Get the current slide
         */     
        this.getCurrentSlide = function(){
            return currentSlide;
        }
        
        /**
         * Get the total slide count
         */     
        this.getSlideCount = function(){
            return $children.length;
        }
        
        /**
         * Stop the slideshow
         */     
        this.stopShow = function(changeText){
            clearInterval(interval);
            // check if changeText argument is supplied
            if(typeof(changeText) == 'undefined'){
                var changeText = true;
            }
            if(changeText && options.autoControls){
                $autoControls.html($startContent).removeClass('stop').addClass('start');
                autoPlaying = false;
            }
        }
        
        /**
         * Start the slideshow
         */     
        this.startShow = function(changeText){
            // check if changeText argument is supplied
            if(typeof(changeText) == 'undefined'){
                var changeText = true;
            }
            setAutoInterval();
            if(changeText && options.autoControls){
                $autoControls.html($stopContent).removeClass('start').addClass('stop');
                autoPlaying = true;
            }
        }
        
        /**
         * Stops the ticker
         */     
        this.stopTicker = function(changeText){
            $parent.stop();
            // check if changeText argument is supplied
            if(typeof(changeText) == 'undefined'){
                var changeText = true;
            }
            if(changeText && options.ticker){
                $autoControls.html($startContent).removeClass('stop').addClass('start');
                autoPlaying = false;
            }           
        }
        
        /**
         * Starts the ticker
         */     
        this.startTicker = function(changeText){
            if(options.mode == 'horizontal'){
                if(options.tickerDirection == 'next'){
                    // get the 'left' property where the ticker stopped
                    var stoppedLeft = parseInt($parent.css('left'));
                    // calculate the remaining distance the show must travel until the loop
                    var remainingDistance = (origShowWidth + stoppedLeft) + $children.eq(0).width();            
                }else if(options.tickerDirection == 'prev'){
                    // get the 'left' property where the ticker stopped
                    var stoppedLeft = -parseInt($parent.css('left'));
                    // calculate the remaining distance the show must travel until the loop
                    var remainingDistance = (stoppedLeft) - $children.eq(0).width();
                }
                // calculate the speed ratio to seamlessly finish the loop
                var finishingSpeed = (remainingDistance * options.tickerSpeed) / origShowWidth;
                // call the show
                moveTheShow(tickerLeft, remainingDistance, finishingSpeed);                 
            }else if(options.mode == 'vertical'){
                if(options.tickerDirection == 'next'){
                    // get the 'top' property where the ticker stopped
                    var stoppedTop = parseInt($parent.css('top'));
                    // calculate the remaining distance the show must travel until the loop
                    var remainingDistance = (origShowHeight + stoppedTop) + $children.eq(0).height();           
                }else if(options.tickerDirection == 'prev'){
                    // get the 'left' property where the ticker stopped
                    var stoppedTop = -parseInt($parent.css('top'));
                    // calculate the remaining distance the show must travel until the loop
                    var remainingDistance = (stoppedTop) - $children.eq(0).height();
                }
                // calculate the speed ratio to seamlessly finish the loop
                var finishingSpeed = (remainingDistance * options.tickerSpeed) / origShowHeight;
                // call the show
                moveTheShow(tickerTop, remainingDistance, finishingSpeed);
                // check if changeText argument is supplied
                if(typeof(changeText) == 'undefined'){
                    var changeText = true;
                }
                if(changeText && options.ticker){
                    $autoControls.html($stopContent).removeClass('start').addClass('stop');
                    autoPlaying = true;
                }                       
            }
        }       
        
        /**
         * Initialize a new slideshow
         */     
        this.initShow = function(){
            // set initial css
            initCss();
            
            // check to show pager
            if(options.pager && !options.ticker){
                if(options.pagerType == 'full'){
                    showPager('full');
                }else if(options.pagerType == 'short'){
                    showPager('short');
                }
				
            }
                        
            // check to show controls
            if(options.controls && !options.ticker){
                setControlsVars();
            }
                        
            // check if auto
            if(options.auto || options.ticker){
                // check if auto controls are displayed
                if(options.autoControls){
                    setAutoControlsVars();
                }
                // check if show should auto start
                if(options.autoStart){
                    base.startShow(true);
                }else{
                    base.stopShow(true);
                }
                // check if show should pause on hover
                if(options.autoHover){
                    setAutoHover();
                }
            }                       
            // make the starting slide active
            makeSlideActive(currentSlide);          
            // check for finite show and if controls should be hidden
            checkEndControls();
            // show captions
            if(options.captions){
                showCaptions();
            }
            // perform the callback function
            options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));
        }
        
        // PRIVATE FUNCTIONS
        
        /**
         * Creates all neccessary styling for the slideshow
         */     
        function initCss(){
            // layout the children
            setChildrenLayout(options.startingSlide);
            // CSS for horizontal mode
            if(options.mode == 'horizontal'){
                // wrap the <ul> in div that acts as a window and make the <ul> uber wide
                $parent
                .wrap('<div class="'+options.wrapperClass+'" style="width:'+wrapperWidth+'px; position:relative;"></div>')
                .wrap('<div class="fxcs-window" style="position:relative; overflow:hidden;"></div>')
                .css({
                  width: '99999px',
                  position: 'relative',
                    left: '-'+(origLeft)+'px'
                });
                $parent.children().css({
                    width: childrenWidth,
                  float: 'left',
                  listStyle: 'none'
                });                 
                $outerWrapper = $parent.parent().parent();
                $children.addClass('pager');
            // CSS for vertical mode
            }else if(options.mode == 'vertical'){
                // wrap the <ul> in div that acts as a window and make the <ul> uber tall
                $parent
                .wrap('<div class="'+options.wrapperClass+'" style="width:'+childrenMaxWidth+'px; position:relative;"></div>')
                .wrap('<div class="fxcs-window" style="width:'+childrenMaxWidth+'px; height:'+childrenMaxHeight+'px; position:relative; overflow:hidden;"></div>')
                .css({
                  height: '99999px',
                  position: 'relative',
                    top: '-'+(origTop)+'px'
                });
                $parent.children().css({
                  listStyle: 'none',
                    height: childrenMaxHeight
                });                 
                $outerWrapper = $parent.parent().parent();
                $children.addClass('pager');
            // CSS for fade mode
            }else if(options.mode == 'fade'){
                // wrap the <ul> in div that acts as a window
                $parent
                .wrap('<div class="'+options.wrapperClass+'" style="width:'+childrenMaxWidth+'px; position:relative;"></div>')
                .wrap('<div class="fxcs-window" style="height:'+childrenMaxHeight+'px; width:'+childrenMaxWidth+'px; position:relative; overflow:hidden;"></div>');
                $parent.children().css({
                  listStyle: 'none',
                  position: 'absolute',
                    top: 0,
                    left: 0,
                    zIndex: 98
                });                 
                $outerWrapper = $parent.parent().parent();
                $children.not(':eq('+currentSlide+')').fadeTo(0, 0);
                $children.eq(currentSlide).css('zIndex', 99);
            }
            // if captions = true setup a div placeholder
            if(options.captions && options.captionsSelector == null){
                $outerWrapper.prepend('<div class="fxcs-captions"><div class="title"></div></div>');
            }           
        }
        
        /**
         * Depending on mode, lays out children in the proper setup
         */     
        function setChildrenLayout(){           
            // lays out children for horizontal or vertical modes
            if(options.mode == 'horizontal' || options.mode == 'vertical'){
                                
                // get the children behind
                var $prependedChildren = getArraySample($children, 0, options.moveSlideQty, 'backward');
                
                // add each prepended child to the back of the original element
                $.each($prependedChildren, function(index) {
                    $parent.prepend($(this));
                });         
                
                // total number of slides to be hidden after the window
                var totalNumberAfterWindow = ($children.length + options.moveSlideQty) - 1;
                // number of original slides hidden after the window
                var pagerExcess = $children.length - options.displaySlideQty;
                // number of slides to append to the original hidden slides
                var numberToAppend = totalNumberAfterWindow - pagerExcess;
                // get the sample of extra slides to append
                var $appendedChildren = getArraySample($children, 0, numberToAppend, 'forward');
                
                // add each appended child to the front of the original element
                $.each($appendedChildren, function(index) {
                    $parent.append($(this));
                });                 
            }
        }
        
        /**
         * Sets all variables associated with the controls
         */     
        function setControlsVars(){
            // check if text or images should be used for controls
            // check "next"
            if(options.nextImage != ''){
                nextContent = options.nextImage;
                nextType = 'image';
            }else{
                nextContent = options.nextText;
                nextType = 'text';
            }
            // check "prev"
            if(options.prevImage != ''){
                prevContent = options.prevImage;
                prevType = 'image';
            }else{
                prevContent = options.prevText;
                prevType = 'text';
            }
            // show the controls
            showControls(nextType, nextContent, prevType, prevContent);
        }           
        
        /**
         * Puts slideshow into auto mode
         *
         * @param int pause number of ms the slideshow will wait between slides 
         * @param string direction 'forward', 'backward' sets the direction of the slideshow (forward/backward)
         * @param bool controls determines if start/stop controls will be displayed
         */     
        function setAutoInterval(){
            if(options.auto){
                // finite loop
                if(!options.infiniteLoop){
                    if(options.autoDirection == 'next'){
                        interval = setInterval(function(){
                            currentSlide += options.moveSlideQty;
                            // if currentSlide has exceeded total number
                            if(currentSlide > lastSlide){
                                currentSlide = currentSlide % $children.length;
                            }
                            base.goToSlide(currentSlide, false);
                        }, options.pause);
                    }else if(options.autoDirection == 'prev'){
                        interval = setInterval(function(){
                            currentSlide -= options.moveSlideQty;
                            // if currentSlide is smaller than zero
                            if(currentSlide < 0){
                                negativeOffset = (currentSlide % $children.length);
                                if(negativeOffset == 0){
                                    currentSlide = 0;
                                }else{
                                    currentSlide = ($children.length) + negativeOffset; 
                                }
                            }
                            base.goToSlide(currentSlide, false);
                        }, options.pause);
                    }
                // infinite loop
                }else{
                    if(options.autoDirection == 'next'){
                        interval = setInterval(function(){
                            base.goToNextSlide(false);
                        }, options.pause);
                    }else if(options.autoDirection == 'prev'){
                        interval = setInterval(function(){
                            base.goToPreviousSlide(false);
                        }, options.pause);
                    }
                }
            
            }else if(options.ticker){
                
                options.tickerSpeed *= 100;
                                                
                // get the total width of the original show
                $('.pager',$parent).each(function(index) {
                    origShowWidth += $(this).width();
                    origShowHeight += $(this).height();
                });
                
                // if prev start the show from the last slide
                if(options.tickerDirection == 'prev' && options.mode == 'horizontal'){
                    $parent.css('left', '-'+(origShowWidth+origLeft)+'px');
                }else if(options.tickerDirection == 'prev' && options.mode == 'vertical'){
                    $parent.css('top', '-'+(origShowHeight+origTop)+'px');
                }
                
                if(options.mode == 'horizontal'){
                    // get the starting left position
                    tickerLeft = parseInt($parent.css('left'));
                    // start the ticker
                    moveTheShow(tickerLeft, origShowWidth, options.tickerSpeed);
                }else if(options.mode == 'vertical'){
                    // get the starting top position
                    tickerTop = parseInt($parent.css('top'));
                    // start the ticker
                    moveTheShow(tickerTop, origShowHeight, options.tickerSpeed);
                }                                               
                
                // check it tickerHover applies
                if(options.tickerHover){
                    setTickerHover();
                }                   
            }           
        }
        
        function moveTheShow(leftCss, distance, speed){
            // if horizontal
            if(options.mode == 'horizontal'){
                // if next
                if(options.tickerDirection == 'next'){
                    $parent.animate({'left': '-='+distance+'px'}, speed, 'linear', function(){
                        $parent.css('left', leftCss);
                        moveTheShow(leftCss, origShowWidth, options.tickerSpeed);
                    });
                // if prev
                }else if(options.tickerDirection == 'prev'){
                    $parent.animate({'left': '+='+distance+'px'}, speed, 'linear', function(){
                        $parent.css('left', leftCss);
                        moveTheShow(leftCss, origShowWidth, options.tickerSpeed);
                    });
                }
            // if vertical      
            }else if(options.mode == 'vertical'){
                // if next
                if(options.tickerDirection == 'next'){
                    $parent.animate({'top': '-='+distance+'px'}, speed, 'linear', function(){
                        $parent.css('top', leftCss);
                        moveTheShow(leftCss, origShowHeight, options.tickerSpeed);
                    });
                // if prev
                }else if(options.tickerDirection == 'prev'){
                    $parent.animate({'top': '+='+distance+'px'}, speed, 'linear', function(){
                        $parent.css('top', leftCss);
                        moveTheShow(leftCss, origShowHeight, options.tickerSpeed);
                    });
                }
            }
        }       
        
        /**
         * Sets all variables associated with the controls
         */     
        function setAutoControlsVars(){
            // check if text or images should be used for controls
            // check "start"
            if(options.startImage != ''){
                startContent = options.startImage;
                startType = 'image';
            }else{
                startContent = options.startText;
                startType = 'text';
            }
            // check "stop"
            if(options.stopImage != ''){
                stopContent = options.stopImage;
                stopType = 'image';
            }else{
                stopContent = options.stopText;
                stopType = 'text';
            }
            // show the controls
            showAutoControls(startType, startContent, stopType, stopContent);
        }
        
        /**
         * Handles hover events for auto shows
         */     
        function setAutoHover(){
            // hover over the slider window
            $outerWrapper.find('.fxcs-window').hover(function() {
                if(autoPlaying){
                    base.stopShow(false);
                }
            }, function() {
                if(autoPlaying){
                    base.startShow(false);
                }
            });
        }
        
        /**
         * Handles hover events for ticker mode
         */     
        function setTickerHover(){
            // on hover stop the animation
            $parent.hover(function() {
                if(autoPlaying){
                    base.stopTicker(true);
                }
            }, function() {
                if(autoPlaying){
                    base.startTicker(true);
                }
            });
        }       
        
        /**
         * Handles fade animation
         */     
        function setChildrenFade(){
            // fade out any other child besides the current
            $children.not(':eq('+currentSlide+')').fadeTo(options.speed, 0).css('zIndex', 98);
            // fade in the current slide
            $children.eq(currentSlide).css('zIndex', 99).fadeTo(options.speed, 1, function(){
                isWorking = false;
                // perform the callback function
                options.onAfterSlide(currentSlide, $children.length, $children.eq(currentSlide));
            });
        };
                
        /**
         * Makes slide active
         */     
        function makeSlideActive(number){
            if(options.pagerType == 'full' && options.pager){
                // remove all active classes
                $('a', $pager).removeClass(options.pagerActiveClass);
                // assign active class to appropriate slide
                $('a', $pager).eq(number).addClass(options.pagerActiveClass);
            }else if(options.pagerType == 'short' && options.pager){
                $('.fxcs-pager-current', $pager).html(currentSlide+1);
            }
        }
                
        /**
         * Displays next/prev controls
         *
         * @param string nextType 'image', 'text'
         * @param string nextContent if type='image', specify a filepath to the image. if type='text', specify text.
         * @param string prevType 'image', 'text'
         * @param string prevContent if type='image', specify a filepath to the image. if type='text', specify text.
         */     
        function showControls(nextType, nextContent, prevType, prevContent){
            // create pager html elements

            var $nextHtml = $('<a href=""  class="fxcs-next"></a>');
            var $prevHtml = $('<a href=""  class="fxcs-prev"></a>');
            // check if next is 'text' or 'image'
            if(nextType == 'text'){
                $nextHtml.html(nextContent);
            }else{
                $nextHtml.html('<img src="'+nextContent+'" />');
            }
            // check if prev is 'text' or 'image'
            if(prevType == 'text'){
                $prevHtml.html(prevContent);
            }else{
                $prevHtml.html('<img src="'+prevContent+'" />');
            }
            // check if user supplied a selector to populate next control
            if(options.prevSelector){
                $(options.prevSelector).append($prevHtml);
            }else{
                $outerWrapper.append($prevHtml);
            }
            // check if user supplied a selector to populate next control
            if(options.nextSelector){
                $(options.nextSelector).append($nextHtml);
            }else{
                $outerWrapper.append($nextHtml);
            }
            // click next control
            $nextHtml.click(function() {
                base.goToNextSlide();
                return false;
            });
            // click prev control
            $prevHtml.click(function() {
                base.goToPreviousSlide();
                return false;
            });
        }
        
        /**
         * Displays the pager
         *
         * @param string type 'full', 'short'
         */     
        function showPager(type){
            var pagerString = '';
            // check if custom build function was supplied
            if(options.buildPager){
                $children.each(function(index, value) {
                  pagerString += options.buildPager(index, value);
                });
            // if not, use default pager
            }else if(type == 'full'){
                // build the full pager
                $children.each(function(index) {
                  pagerString += '<a href="" class="pager-link pager-'+(index+1)+'">'+(index+1)+'</a>';
                });
            }else if(type == 'short') {
                // build the short pager
                pagerString = '<span class="fxcs-pager-current">'+(options.startingSlide+1)+'</span> '+options.pagerShortSeparator+' <span class="fxcs-pager-total">'+$children.length+'<span>';
            }   
            // check if user supplied a pager selector
            if(options.pagerSelector){
                $(options.pagerSelector).append(pagerString);
                $pager = $(options.pagerSelector);
            }else{
                var $pagerContainer = $('<div class="fxcs-pager"></div>');
                $pagerContainer.append(pagerString);
                // attach the pager to the DOM
                if(options.pagerLocation == 'top'){
                    $outerWrapper.prepend($pagerContainer);
                }else if(options.pagerLocation == 'bottom'){
                    $outerWrapper.append($pagerContainer);
                }
                // cache the pager element
                $pager = $('.fxcs-pager', $outerWrapper);
            }
            // pager link click
            $pager.children().click(function() {
                // only if pager is full mode
                if(options.pagerType == 'full'){
                    // get the index from the link
                    var slideIndex = $pager.children().index(this);
                    base.goToSlide(slideIndex);
                }
                return false;
            });
        }
        
        /**
         * Displays captions
         */     
        function showCaptions(){
            // get the title from each image
          var caption = $('img', $children.eq(currentSlide)).attr('alt');
            // if the caption exists
            if(caption != ''){
                // if user supplied a selector
                if(options.captionsSelector){
                    $(options.captionsSelector).html(caption);
                }else{
                    $('.fxcs-captions div.title', $outerWrapper).html(caption);
                }
            }else{
                // if user supplied a selector
                if(options.captionsSelector){
                    $(options.captionsSelector).html('');
                }else{
                    $('.fxcs-captions div.title', $outerWrapper).html(caption);
                }               
            }
        }
        
        /**
         * Displays start/stop controls for auto and ticker mode
         *
         * @param string type 'image', 'text'
         * @param string next [optional] if type='image', specify a filepath to the image. if type='text', specify text.
         * @param string prev [optional] if type='image', specify a filepath to the image. if type='text', specify text.
         */
        function showAutoControls(startType, startContent, stopType, stopContent){
            // create pager html elements
            $autoControls = $('<a href="" class="bx-start"></a>');
            // check if start is 'text' or 'image'
            if(startType == 'text'){
                $startContent = startContent;
            }else{
                $startContent = '<img src="'+startContent+'" />';
            }
            // check if stop is 'text' or 'image'
            if(stopType == 'text'){
                $stopContent = stopContent;
            }else{
                $stopContent = '<img src="'+stopContent+'" />';
            }
            // check if user supplied a selector to populate next control
            if(options.startSelector){
                $(options.startSelector).append($autoControls);
            }else{
                $outerWrapper.append('<div class="fxcs-auto"></div>');
                $('.fxcs-auto', $outerWrapper).html($autoControls);
            }
                        
            // click start control
            $autoControls.click(function() {
                if(options.ticker){
                    if($(this).hasClass('stop')){
                        base.stopTicker();
                    }else if($(this).hasClass('start')){
                        base.startTicker();
                    }
                }else{
                    if($(this).hasClass('stop')){
                        base.stopShow(true);
                    }else if($(this).hasClass('start')){
                        base.startShow(true);
                    }
                }
                return false;
            });
            
        }
        
        /**
         * Checks if show is in finite mode, and if slide is either first or last, then hides the respective control
         */     
        function checkEndControls(){
            if(!options.infiniteLoop && options.hideControlOnEnd){
                // check previous
                if(currentSlide == firstSlide){
                    $('.fxcs-prev', $outerWrapper).hide();                
                }else{
                    $('.fxcs-prev', $outerWrapper).show();
                }
                // check next
                if(currentSlide == lastSlide){
                    $('.fxcs-next', $outerWrapper).hide();
                }else{
                    $('.fxcs-next', $outerWrapper).show();
                }
            }
        }
        
        /**
         * Returns the left offset of the slide from the parent container
         */     
        function getSlidePosition(number, side){
            if(side == 'left'){
                var position = $('.pager', $outerWrapper).eq(number).position().left;
            }else if(side == 'top'){
                var position = $('.pager', $outerWrapper).eq(number).position().top;
            }
            return position;
        }
        
        /**
         * Returns the width of the wrapper
         */     
        function getWrapperWidth(){
            var wrapperWidth = $firstChild.outerWidth() * options.displaySlideQty;
            return wrapperWidth;
        }
        
        /**
         * Returns the height of the wrapper
         */     
        function getWrapperHeight(){
            // if displaying multiple slides, multiple wrapper width by number of slides to display
            var wrapperHeight = $firstChild.outerHeight() * options.displaySlideQty;
            return wrapperHeight;
        }
        
        /**
         * Returns a sample of an arry and loops back on itself if the end of the array is reached
         *
         * @param array array original array the sample is derived from
         * @param int start array index sample will start
         * @param int length number of items in the sample
         * @param string direction 'forward', 'backward' direction the loop should travel in the array
         */     
        function getArraySample(array, start, length, direction){
            // initialize empty array
            var sample = [];
            // clone the length argument
            var loopLength = length;
            // determines when the empty array should start being populated
            var startPopulatingArray = false;
            // reverse the array if direction = 'backward'
            if(direction == 'backward'){
                array = $.makeArray(array);
                array.reverse();
            }
            // loop through original array until the length argument is met
            while(loopLength > 0){              
                // loop through original array
                $.each(array, function(index, val) {
                    // check if length has been met
                    if(loopLength > 0){
                        // don't do anything unless first index has been reached
                      if(!startPopulatingArray){
                            // start populating empty array
                            if(index == start){
                                startPopulatingArray = true;
                                // add element to array
                                sample.push($(this).clone());
                                // decrease the length clone variable
                                loopLength--;
                            }
                        }else{
                            // add element to array
                            sample.push($(this).clone());
                            // decrease the length clone variable
                            loopLength--;
                        }
                    // if length has been met, break loose
                    }else{
                        return false;
                    }           
                });             
            }
            return sample;
        }
                                                
        this.each(function(){           
            base.initShow();
        });
                
        return this;                        
    }       
        
})(jQuery);		


// Slide hover { hide prev and next arrows on mouse out}
/*$(document).ready(function() {
	$("#slide").hover(
	  function () {
		
		$("a.fxcs-prev, a.fxcs-next").show();
		
	  }, 
	  function () {
		$("a.fxcs-prev, a.fxcs-next").hide();
	  }
	);
});*/

// Slider custom controls
$(document).ready(function(){
	if (!$('#slider').hasClass('one_image'))
	{


		$('#slider').fxcs({
			mode: 'horizontal',
			autoHover: true,
			infiniteLoop: true,
			auto: true,
			pager: false
		});
			
	 } else {

//		$('#next_slide').removeClass('fxcs-next');
//		$('#prev_slide').removeClass('fxcs-prev');


	 }

	
});




