/**
 * jQuery bxSlider v3.0
 * http://bxslider.com
 *
 * Copyright 2010, Steven Wanderski
 * http://stevenwanderski.com
 *
 * Free to use and abuse under the MIT license.
 * http://www.opensource.org/licenses/mit-license.php
 *
 */


(function($){
  
  $.fn.bxSlider = function(options){    
        
    var defaults = {
      pageType:'',
      idArray:'',
      storyArray:[],
      idListLength:0,
      URL: '',
      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
      easing: 'swing',                    // used with jquery.easing.1.3.js - see http://gsgd.co.uk/sandbox/jquery/easing/ for available options
      pager: false,                        // 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
      autoDelay: 0,                       // integer - in ms, the amount of time before starting the auto show
      pause: 3000,                        // 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: 'bx-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://bxslider.com/custom-pager
      onAfterSlide: function(){if(Body ==null) Body = $(document.body);
      if(_slider!=null){ 
Setup.init();   
Content.render();
                }},          // function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://bxslider.com/custom-pager
      onLastSlide: function(){},          // function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://bxslider.com/custom-pager
      onFirstSlide: function(){},          // function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://bxslider.com/custom-pager
      onNextSlide: function(){},          // function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://bxslider.com/custom-pager
      onPrevSlide: function(){},          // function(currentSlideNumber, totalSlideQty, currentSlideHtmlObject) - advanced use only! see the tutorial here: http://bxslider.com/custom-pager
      buildPager: null                    // function(slideIndex, slideHtmlObject){ return string; } - advanced use only! see the tutorial here: http://bxslider.com/custom-pager
    }
    
    var options = $.extend(defaults, options);
    // cache the base element
    var base = this;
    // initialize (and localize) all variables
    var $parent = '';
    var $origElement = '';
    var $children = '';
    var $outerWrapper = '';
    var $firstChild = '';
    var childrenWidth = '';
    var childrenOuterWidth = '';
    var wrapperWidth = '';
    var wrapperHeight = '';
    var $pager = '';  
    var interval = '';
    var $autoControls = '';
    var $stopHtml = '';
    var $startContent = '';
    var $stopContent = '';
    var autoPlaying = true;
    var loaded = false;
    var childrenMaxWidth = 0;
    var childrenMaxHeight = 0;
    var currentSlide = 0;  
    var origLeft = 0;
    var origTop = 0;
    var origShowWidth = 0;
    var origShowHeight = 0;
    var tickerLeft = 0;
    var tickerTop = 0;
    var isWorking = false;
    
    var firstSlide = 0;
    var lastSlide = $children.length - 1;
    
            
    // PUBLIC FUNCTIONS
            
    /**
     * Go to specified slide
     */    
    this.goToSlide = function(number, stopAuto){
      StopVideo();//stop the video
      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);
          }
        }      
        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, options.easing, 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, options.easing, 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();
        // accomodate multi slides
        if(options.moveSlideQty > 1){
          number = Math.floor(number / options.moveSlideQty);
        }
        // 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){
            checkEndControls();
            // next slide callback
            options.onNextSlide(currentSlide, $children.length, $children.eq(currentSlide));
            // move to appropriate slide
            base.goToSlide(currentSlide);            
          }else{
            currentSlide -= options.moveSlideQty;
          }
        } // 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, options.easing, 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, options.easing, 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
          if(options.moveSlideQty > 1){
            makeSlideActive(Math.ceil(currentSlide / options.moveSlideQty));
          }else{
            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){
              $('.bx-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, options.easing, 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, options.easing, 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
          if(options.moveSlideQty > 1){
            makeSlideActive(Math.ceil(currentSlide / options.moveSlideQty));
          }else{
            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(){
      
      // reinitialize all variables
      // base = this;
      $parent = $(this);
      $origElement = $parent.clone();
      $children = $parent.children();
      $outerWrapper = '';
      $firstChild = $parent.children(':first');
      childrenWidth = $firstChild.width();
      childrenMaxWidth = 0;
      childrenOuterWidth = $firstChild.outerWidth();
      childrenMaxHeight = 0;
      wrapperWidth = getWrapperWidth();
      wrapperHeight = getWrapperHeight();
      isWorking = false;
      $pager = '';  
      currentSlide = 0;  
      origLeft = 0;
      origTop = 0;
      interval = '';
      $autoControls = '';
      $stopHtml = '';
      $startContent = '';
      $stopContent = '';
      autoPlaying = true;
      loaded = false;
      origShowWidth = 0;
      origShowHeight = 0;
      tickerLeft = 0;
      tickerTop = 0;
      
      firstSlide = 0;
      lastSlide = $children.length - 1;
            
      // 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);
      }
            
      // 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){
          // check if autostart should delay
          setTimeout(function(){
            base.startShow(true);
          }, options.autoDelay);
        }else{
          base.stopShow(true);
        }
        // check if show should pause on hover
        if(options.autoHover && !options.ticker){
          setAutoHover();
        }
      }            
      // make the starting slide active
      if(options.moveSlideQty > 1){
        makeSlideActive(Math.ceil(currentSlide / options.moveSlideQty));
      }else{      
        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));
    }
    
    /**
     * Destroy the current slideshow
     */    
    this.destroyShow = function(){      
      // stop the auto show
      clearInterval(interval);
      // remove any controls / pagers that have been appended
      $('.bx-next, .bx-prev, .bx-pager, .bx-auto', $outerWrapper).remove();
      // unwrap all bx-wrappers
      $parent.unwrap().unwrap().removeAttr('style');
      // remove any styles that were appended
      $parent.children().removeAttr('style').not('.pager').remove();
      // remove any childrent that were appended
      $children.removeClass('pager');
      
    }
    
    /**
     * Reload the current slideshow
     */    
    this.reloadShow = function(){
      base.destroyShow();
      base.initShow();
    }
    
    // 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;margin:0 auto;"></div>')
        //.wrap('<div class="bx-window" style="position:relative; overflow:hidden; width:'+wrapperWidth+'px;"></div>')
        .css({
          width: '999999px',
          position: 'relative',
          left: '-'+(origLeft)+'px',
          overflow:'hidden'
        });
        //("<div class=\"clearer\"></div>").insertAfter("#slider1");
        $("<div/>").attr("class","clearer").insertAfter("#slider1");
        $parent.parent().css({
            position:'relative',
            overflow:'hidden',
            width: wrapperWidth+'px'
        });
         $parent.parent().parent().css({
            width:wrapperWidth+'px',
            position:'relative',
            margin:'0 auto'
        });
        $parent.parent().parent().addClass(options.wrapperClass);

        $parent.children().css({
          //width: childrenWidth,
          width:wrapperWidth,
          '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="bx-window" style="width:'+childrenMaxWidth+'px; height:'+wrapperHeight+'px; position:relative; overflow:hidden;"></div>')
        .css({
          height: '999999px',
          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="bx-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.append('<div class="bx-captions"></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');
        
        if(options.infiniteLoop){
          // 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 *= 10;
                        
        // get the total width of the original show
        $('.pager', $outerWrapper).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('.bx-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(false);
        }
      }, function() {
        if(autoPlaying){
          base.startTicker(false);
        }
      });
    }    
      
    
    /**
     * 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;
        // ie fade fix
        if(jQuery.browser.msie){
          $children.eq(currentSlide).get(0).style.removeAttribute('filter');
        }
        // 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){
        $('.bx-pager-current', $pager).html(currentSlide+1);
      }
    }
        
    function getContent(isPrev){
        var _list=options.idArray;
        var _arrWorks = [];
        var _workId = 0;
        if(_list){
          _arrWorks = _list.split('-');
        }   
      
        var currentWorkId=_arrWorks[currentSlide];
        // content id to get
        if(isPrev)
            _workId = _arrWorks[currentSlide - 1];
        else 
            _workId = _arrWorks[currentSlide + 1];

        // content loaded before?
        var _li ="#WK"+_workId;
        // do animation/transition
        // ajax to get      
        if($(_li).length > 0 && $.trim($(_li).text()).length == 0 && $.trim($(_li).html()).length == 0)
        {
            GetAWorkXml(_li,options.URL,_workId,isPrev,"work");
        }
        else
        {
            //if had viewed the page,then get work data from array
            workBackScroll(_li,_workId);
            
            //hide current work anchor button,show the viewing work anchor button
            ShowAnchor("#WK"+_workId);
          
            //page title
            if(options.URL == "/getawork.aspx")
            {
              document.title=$("#workTitle"+_workId).text();
              changeUrl(_workId,"work");
            }
            else if(options.URL == "/getaperson.aspx")
            {
              document.title=$("#peopleTitle"+_workId).text();
              changeUrl(_workId,"people");
            }
            else{}
            
            if(isPrev)
            {              
              base.goToPreviousSlide();
              StopVideo(true);
            }
            else 
            {       
              base.goToNextSlide();
              StopVideo(false);
            }
          
            //calculate the realated work width 
            //related work
            if($("#iddContentRelatedWork"+_workId).length > 0)
            {
                ScrollbarCommon(_workId,"iddContentRelatedWork","scrollWorkContent","iddSliderRelatedWork","iddBarRelatedWork");
            }
        }    
    }   

    function getStoryContent(isPrev)
    {
        var _arrStory = [];
        _arrStory=options.storyArray;
        var idListLength=options.idListLength;
        var _storyId = 0;
        var _id="";
        var _url="";
        var currentWorkId=_arrStory[currentSlide];

        // content id to get
        if(currentSlide >= 0 && currentSlide < idListLength)
        {
            if(isPrev)
                _storyId = currentSlide - 1;
            else
                _storyId = currentSlide + 1;
            
            //get work content by id
            _id =_arrStory[_storyId];

        }
        else if(currentSlide >= idListLength && currentSlide <= _arrStory.length-1)
        {
          //get content by url
            if(isPrev)
            {
                _storyId = currentSlide - 1;
            }
            else
                _storyId = currentSlide + 1;
          
            _url=_arrStory[_storyId];
        }
        else{
            
        }

        if($("#WK"+_storyId).length > 0 && $.trim($("#WK"+_storyId).text()).length == 0 && $.trim($("#WK"+_storyId).html()).length == 0)
        {
           if(_id != "")
           {                                       
             GetAWorkXml("#WK"+_storyId,"/getawork.aspx",_id,isPrev,"story"); 
           }
           else if(_url != "")
           {
             var isHistory="0";
             if(_url.indexOf('^') != -1)
             {
               _url=_url.substring(0,_url.indexOf('^'));
               isHistory="1";
             }
             $("#loadingPage").show();
              $.ajax({
              type: "GET",
              dataType: 'html',
              data:{"ajax":1},
              url: _url.toString(),
              cache: false,
              success: function(html){
                  $("#loadingPage").hide();
                  $("#mainBody").hide();
                  $("#WK"+_storyId).html(html);
                  $(".worklink").hide();
                  
                  if(isHistory == "1")
                  {
                     HistoryAnimateShow();
                  }
                
                  if(isPrev)
                  {                    
                    base.goToPreviousSlide();
                    StopVideo(true);
                  }
                  else 
                  {                      
                     base.goToNextSlide();
                    StopVideo(false);
                     if(currentSlide == lastSlide)
                     {
                        initMap();
                     }
                  }
               }
             });
           }
          else
          {
          
          }
        }
        else
        {
            //if the page is a work,anchor is show.
            if(isNumeric(_arrStory[_storyId])== false)
            {
              //the page isn't a work
              $(".worklink").hide();//var h = document.documentElement.clientHeight;
            }
            else
            {
              //
              //work page 
              //
              $("#WK"+_storyId+" .worklink").show();
              
              //if had viewed the page,then get work data from array
              workBackScroll("#WK"+_storyId,_arrStory[_storyId]);
              
              //hide current work anchor button,show the viewing work anchor button
              ShowAnchor("#WK"+_storyId);
              
              document.title=$("#workTitle"+_arrStory[_storyId]).text();
              
              //related work
               if($("#iddContentRelatedWork"+_arrStory[_storyId]).length > 0)
               {
                 ScrollbarCommon(_arrStory[_storyId],"iddContentRelatedWork","scrollWorkContent","iddSliderRelatedWork","iddBarRelatedWork");
               }
              
               changeUrl(_storyId,"story");

            }
          
            if(isPrev)
            {
               base.goToPreviousSlide();
               StopVideo(true);
            }
            else 
            {
               base.goToNextSlide();
               StopVideo(false);
            }

            if(currentSlide == firstSlide)
            {
                if($("#pa #slider1").length > 0)
                {
                  var height=document.documentElement.clientHeight;
                  var width=document.documentElement.clientWidth;
            
                  $("#pa #slider1").height(height);
                  $("#WK0").width(width);
                }
              
                if(tempFirstLiContent)
                {
                  $("#slider1 #WK0").html(tempFirstLiContent);
                }
              
                
                var tempUrl=window.location.href;
                if(tempUrl.indexOf('#')!=-1)
                {
                  tempUrl=tempUrl.substring(0,tempUrl.indexOf('#')+1);
                  window.location.href=tempUrl;
                }
                
              
 
            }
          
            //if the page is google map,show the contactlist button or hidden it
            if(currentSlide == lastSlide)
            {
              $("#openContactList").show();
            }
            else
            {
              $("#openContactList").hide();
            }
        }
        
    }
    
    function HistoryAnimateShow()
    {
      setTimeout(
        function(){
          window.location.href="#historyIntro";
        },5000
      );  
    }

    function GetAWorkXml(_li,_url,_id,isPrev,flag)
    {
      $("#loadingPage").show();
        $.ajax({          
        type: "GET",
        dataType: 'html',
        url: _url,
        data:{"id":_id.toString(),"ajax":1},
        cache: false,
        success: function(html){
          /*$(".akdaksd").css({
          "top":"50%",
            "left":"50%",
            "margin-top":-(height/2),
            "margin-left":-(width/2)
        })*/
            $(_li).html(html);
            
            $(_li+" .middleContent").each(function()
            {
                var _width=$(this).width();
                var _height=$(this).height()-56;
              
                $(this).css({
                  "top":"50%",
                  "left":"50%",
                  "margin-top":-(_height/2),
                  "margin-left":-(_width/2)
                });
            });
          
            //first background img in work page
             var imgObj = $(_li+" .pageBg img").get(0);
            //get people img in people page
              if(!imgObj )
              {
                  imgObj = $(_li+" .peopleIntro img").get(0);
              }
              var oldIndex = currentSlide;
              //go to other slide after the img loading complete
              if(isPrev)
              {
                  //fix the position when go to previous slide
                  $parent.css('left','-' + getSlidePosition(currentSlide ,"left")+'px');
                  $(imgObj).load(function(){
                        base.goToPreviousSlide();
                        StopVideo(true);
                         $("#mainBody").hide();
                        $("#loadingPage").hide();
                     });
              }
              else
              {
                $(imgObj).load(function(){
                       base.goToNextSlide();
                        StopVideo(false);
                        $("#mainBody").hide();
                        $("#loadingPage").hide();
                     });
              }
               
            $("<scri"+"pt>"+"").attr({src:'/scripts/footerControl.js',type:'text/javascript',id:'footer'}).appendTo($('head'));
            $(".worklink").show();
            
          
            if(_url == "/getawork.aspx")
            {
               document.title=$("#workTitle"+_id).text();
               setTwitterAndFacebook(_id);
               //work page
               //related people
               
               //if($("#iddWorkRelatedPeople"+_id).length > 0) 
               //ScrollbarCommon(workId,"iddWorkRelatedPeople","scrollPeopleContent","iddSliderRelatedPeople","iddBarRelatedPeople");
              
               //related work
               if($("#iddContentRelatedWork"+_id).length > 0)
               {
                 ScrollbarCommon(_id,"iddContentRelatedWork","scrollWorkContent","iddSliderRelatedWork","iddBarRelatedWork");
               }

               //window scroll
               workScroll(_li,_id);
              
               if(flag == "story")
               {
                 ShowAnchor("#WK"+_li.substring(3));
                 if(isPrev)
                 {
                   changeUrl(oldIndex-1,"story");
                 }
                 else
                 {
                   changeUrl(oldIndex+1,"story");
                 }
               }
               else if(flag == "work")
               {
                 ShowAnchor("#WK"+_id);
                 changeUrl(_id,"work");
               }
              else
              {
                
              }        
              
             
            }
            else if(_url == "/getaperson.aspx") 
            {
              SetLIWidth(_li);
              if($("#iddContentRelatedWork"+_id).length > 0)
              {
                ScrollbarCommon(_id,"iddContentRelatedWork","scrollWorkContent","iddSliderRelatedWork","iddBarRelatedWork");
              }
              workScroll(_li,_id);
              ShowAnchor("#WK"+_id);
              changeUrl(_id,"people");
              document.title=$("#peopleTitle"+_id).text();
            }
            else
            {}

       }
      });
    }

    this.getStoryContentByIndex= function(storyIndex)
    {
        var _arrStory = [];
        _arrStory=options.storyArray;
        var idListLength=options.idListLength;
        var _storyId = 0;
        var _id="";
        var _url="";
        var currentWorkId=_arrStory[currentSlide];

        // content id to get
        if(currentSlide >= 0 && currentSlide < idListLength)
        {
            
            _storyId = storyIndex;
            
            //get work content by id
            _id =_arrStory[_storyId];

        }
        else if(currentSlide >= idListLength && currentSlide <= _arrStory.length-1)
        {
          //get content by url
            _storyId = storyIndex;
          
            _url=_arrStory[_storyId];
        }
        else{
            
        }

        if($("#WK"+_storyId).length > 0 && $.trim($("#WK"+_storyId).text()).length == 0 && $.trim($("#WK"+_storyId).html()).length == 0)
        {
           if(_id != "")
           {                                       
             GetAWorkXmlByIndex("#WK"+_storyId,"/getawork.aspx",_id,storyIndex,"story");
           }
           else if(_url != "")
           {
             var isHistory="0";
             if(_url.indexOf('^') != -1)
             {
               _url=_url.substring(0,_url.indexOf('^'));
               isHistory="1";
             }
             $("#loadingPage").show();
              $.ajax({
              type: "GET",
              dataType: 'html',
              data:{"ajax":1},
              url: _url.toString(),
              cache: false,
              success: function(html){
                  $("#loadingPage").hide();
                  $("#mainBody").hide();
                  $("#WK"+_storyId).html(html);
                  $(".worklink").hide();
                  
                  if(isHistory == "1")
                  {
                     HistoryAnimateShow();
                  }
                
          StopVideo();                      
          base.goToSlide(_storyId);
          if(currentSlide == lastSlide)
          {
           initMap();
          }
               }
             });
           }
          else
          {
          
          }
        }
        else
        {
            //if the page is a work,anchor is show.
            if(isNumeric(_arrStory[_storyId])== false)
            {
              //the page isn't a work
              $(".worklink").hide();//var h = document.documentElement.clientHeight;
            }
            else
            {
              //
              //work page
              //
              $("#WK"+_storyId+" .worklink").show();
              
              //if had viewed the page,then get work data from array
              workBackScroll("#WK"+_storyId,_arrStory[_storyId]);
              
              //hide current work anchor button,show the viewing work anchor button
              ShowAnchor("#WK"+_storyId);
              
              document.title=$("#workTitle"+_arrStory[_storyId]).text();
              
              //related work
               if($("#iddContentRelatedWork"+_arrStory[_storyId]).length > 0)
               {
                 ScrollbarCommon(_arrStory[_storyId],"iddContentRelatedWork","scrollWorkContent","iddSliderRelatedWork","iddBarRelatedWork");
               }
              
               changeUrl(_storyId,"story");

            }
      
            StopVideo();
            base.goToSlide(_storyId);

            if(currentSlide == firstSlide)
            {
                if($("#pa #slider1").length > 0)
                {
                  var height=document.documentElement.clientHeight;
                  var width=document.documentElement.clientWidth;
            
                  $("#pa #slider1").height(height);
                  $("#WK0").width(width);
                }
                if(tempFirstLiContent)
                {
                  $("#slider1 #WK0").html(tempFirstLiContent);
                }
                var tempUrl=window.location.href;
                if(tempUrl.indexOf('#')!=-1)
                {
                  tempUrl=tempUrl.substring(0,tempUrl.indexOf('#')+1);
                  window.location.href=tempUrl;
                }
            }
          
            //if the page is google map,show the contactlist button or hidden it
            if(currentSlide == lastSlide)
            {
              $("#openContactList").show();
            }
            else
            {
              $("#openContactList").hide();
            }
        }
        
    }
  
  function GetAWorkXmlByIndex(_li,_url,_id,index,flag)
    {
      $("#loadingPage").show();
        $.ajax({          
        type: "GET",
        dataType: 'html',
        url: _url,
        data:{"id":_id.toString(),"ajax":1},
        cache: false,
        success: function(html){
          /*$(".akdaksd").css({
          "top":"50%",
            "left":"50%",
            "margin-top":-(height/2),
            "margin-left":-(width/2)
        })*/
            $(_li).html(html);
            
            $(_li+" .middleContent").each(function()
            {
                var _width=$(this).width();
                var _height=$(this).height();
              
                $(this).css({
                  "top":"50%",
                  "left":"50%",
                  "margin-top":-(_height/2),
                  "margin-left":-(_width/2)
                });
            });
          
            //first background img in work page
             var imgObj = $(_li+" .pageBg img").get(0);
            //get people img in people page
              if(!imgObj )
              {
                  imgObj = $(_li+" .peopleIntro img").get(0);
              }
              //go to other slide after the img loading complete
              if(index < currentSlide)
              {
                  //fix the position when go to previous slide
                  $parent.css('left','-' + getSlidePosition(currentSlide ,"left")+'px');
              }
        $(imgObj).load(function(){
          StopVideo();
          base.goToSlide(index);
          $("#mainBody").hide();
          $("#loadingPage").hide();
         });
            $("<scri"+"pt>"+"").attr({src:'/scripts/footerControl.js',type:'text/javascript',id:'footer'}).appendTo($('head'));
            $(".worklink").show();
          
            if(_url == "/getawork.aspx")
            {
               document.title=$("#workTitle"+_id).text();
               setTwitterAndFacebook(_id);
               //work page
               //related people
               
               //if($("#iddWorkRelatedPeople"+_id).length > 0)
               //ScrollbarCommon(workId,"iddWorkRelatedPeople","scrollPeopleContent","iddSliderRelatedPeople","iddBarRelatedPeople");
              
               //related work
               if($("#iddContentRelatedWork"+_id).length > 0)
               {
                 ScrollbarCommon(_id,"iddContentRelatedWork","scrollWorkContent","iddSliderRelatedWork","iddBarRelatedWork");
               }

               //window scroll
               workScroll(_li,_id);
              
               if(flag == "story")
               {
                 ShowAnchor("#WK"+_li.substring(3));
                 //changeUrl(index,"story");
               }
               else if(flag == "work")
               {
                 ShowAnchor("#WK"+_id);
                 changeUrl(_id,"work");
               }
              else
              {
                
              }        
              
              
            }
            else if(_url == "/getaperson.aspx")
            {
              SetLIWidth(_li);
              changeUrl(_id,"people");
              document.title=$("#peopleTitle"+_id).text();
            }
            else
            {}

       }
      });
    }
    
        
    /**
     * 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 = $('<div class="bx-next"></div>');
      var $prevHtml = $('<div class="bx-prev"></div>');
      */

      var $nextHtml = $('<a href="javascript:void(0);" class="bx-next">next</a>');
      var $prevHtml = $('<a href="javascript:void(0);" class="bx-prev">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() {
          if(options.pageType !='storyList')
          {
            getContent(false);
            scroll(0,0);
          }
          else
          {
            getStoryContent(false);
            scroll(0,0);
          }
          return false;
        }
      );
      // click prev control
      $prevHtml.click(function(){  
          if(options.pageType !='storyList')
          {
            getContent(true); 
            scroll(0,0);
          }
          else
          {
            getStoryContent(true);
            scroll(0,0);
          }
       
          return false;
      });
    }
    
    /**
     * Displays the pager
     *
     * @param string type 'full', 'short'
     */    
    function showPager(type){
      // sets up logic for finite multi slide shows
      var pagerQty = $children.length;
      // if we are moving more than one at a time and we have a finite loop
      if(options.moveSlideQty > 1){
        // if slides create an odd number of pages
        if($children.length % options.moveSlideQty != 0){
          // pagerQty = $children.length / options.moveSlideQty + 1;
          pagerQty = Math.ceil($children.length / options.moveSlideQty);
        // if slides create an even number of pages
        }else{
          pagerQty = $children.length / options.moveSlideQty;
        }
      }
      var pagerString = '';
      // check if custom build function was supplied
      if(options.buildPager){
        for(var i=0; i<pagerQty; i++){
          pagerString += options.buildPager(i, $children.eq(i * options.moveSlideQty));
        }
        
      // if not, use default pager
      }else if(type == 'full'){
        // build the full pager
        for(var i=1; i<=pagerQty; i++){
          pagerString += '<a href="" class="pager-link pager-'+i+'">'+i+'</a>';
        }
      }else if(type == 'short') {
        // build the short pager
        pagerString = '<span class="bx-pager-current">'+(options.startingSlide+1)+'</span> '+options.pagerShortSeparator+' <span class="bx-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="bx-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 = $('.bx-pager', $outerWrapper);
      }
      $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);
          // accomodate moving more than one slide
          if(options.moveSlideQty > 1){
            slideIndex *= options.moveSlideQty;
          }
          base.goToSlide(slideIndex);
        }
        return false;
      });
    }
        
    /**
     * Displays captions
     */    
    function showCaptions(){
      // get the title from each image
      var caption = $('img', $children.eq(currentSlide)).attr('title');
      // if the caption exists
      if(caption != ''){
        // if user supplied a selector
        if(options.captionsSelector){
          $(options.captionsSelector).html(caption);
        }else{
          $('.bx-captions', $outerWrapper).html(caption);
        }
      }else{
        // if user supplied a selector
        if(options.captionsSelector){
          $(options.captionsSelector).html('&nbsp;');
        }else{
          $('.bx-captions', $outerWrapper).html('&nbsp;');
        }        
      }
    }
    
    /**
     * 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.autoControlsSelector){
        $(options.autoControlsSelector).append($autoControls);
      }else{
        $outerWrapper.append('<div class="bx-auto"></div>');
        $('.bx-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){
          $('.bx-prev', $outerWrapper).hide();        
        }else{
          $('.bx-prev', $outerWrapper).show();
        }
        // check next
        if(currentSlide == lastSlide){
          $('.bx-next', $outerWrapper).hide();
        }else{
          $('.bx-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);
      //var wrapperWidth = $(document).width();
      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.fx.prototype.cur = function(){
    if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
      return this.elem[ this.prop ];
    }

    var r = parseFloat( jQuery.css( this.elem, this.prop ) );
    // return r && r > -10000 ? r : 0;
    return r;
  }

    
})(jQuery);



