// remap jQuery to $
(function($){
  
  
  /*!
  * jQuery Cycle Plugin (with Transition Definitions)
  * Examples and documentation at: http://jquery.malsup.com/cycle/
  * Copyright (c) 2007-2009 M. Alsup
  * Version: 2.63 (17-MAR-2009)
  * Dual licensed under the MIT and GPL licenses:
  * http://www.opensource.org/licenses/mit-license.php
  * http://www.gnu.org/licenses/gpl.html
  * Requires: jQuery v1.2.6 or later
  *
  * Originally based on the work of:
  *  1) Matt Oakes
  *  2) Torsten Baldes (http://medienfreunde.com/lab/innerfade/)
  *  3) Benjamin Sterling (http://www.benjaminsterling.com/experiments/jqShuffle/)
  */
  ;(function($) {
    
    var ver = '2.63';
    
    // if $.support is not defined (pre jQuery 1.3) add what I need
    if ($.support == undefined) {
      $.support = {
        opacity: !($.browser.msie)
      };
    }
    
    function log() {
      if (window.console && window.console.log)
        window.console.log('[cycle] ' + Array.prototype.join.call(arguments,' '));
      //$('body').append('<div>'+Array.prototype.join.call(arguments,' ')+'</div>');
    };
    
    // the options arg can be...
    //   a number  - indicates an immediate transition should occur to the given slide index
    //   a string  - 'stop', 'pause', 'resume', or the name of a transition effect (ie, 'fade', 'zoom', etc)
    //   an object - properties to control the slideshow
    //
    // the arg2 arg can be...
    //   the name of an fx (only used in conjunction with a numeric value for 'options')
    //   the value true (only used in conjunction with a options == 'resume') and indicates
    //     that the resume should occur immediately (not wait for next timeout)
    
    $.fn.cycle = function(options, arg2) {
      var o = { s: this.selector, c: this.context };
      
      // in 1.3+ we can fix mistakes with the ready state
      if (this.length == 0 && options != 'stop') {
        if (!$.isReady && o.s) {
          log('DOM not ready, queuing slideshow')
            $(function() {
              $(o.s,o.c).cycle(options,arg2);
            });
          return this;
        }
        // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
        log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
        return this;
      }
      
      // iterate the matched nodeset
      return this.each(function() {
        options = handleArguments(this, options, arg2);
        if (options === false)
          return;
            
            // stop existing slideshow for this container (if there is one)
            if (this.cycleTimeout)
              clearTimeout(this.cycleTimeout);
        this.cycleTimeout = this.cyclePause = 0;
        
        var $cont = $(this);
        var $slides = options.slideExpr ? $(options.slideExpr, this) : $cont.children();
        var els = $slides.get();
        if (els.length < 2) {
          log('terminating; too few slides: ' + els.length);
          return;
            }
        
        var opts = buildOptions($cont, $slides, els, options, o);
        if (opts === false)
          return;
            
            // if it's an auto slideshow, kick it off
            if (opts.timeout || opts.continuous)
              this.cycleTimeout = setTimeout(function(){go(els,opts,0,!opts.rev)},
                                             opts.continuous ? 10 : opts.timeout + (opts.delay||0));
      });
    };
    
    // process the args that were passed to the plugin fn
    function handleArguments(cont, options, arg2) {
      if (cont.cycleStop == undefined)
        cont.cycleStop = 0;
      if (options === undefined || options === null)
        options = {};
      if (options.constructor == String) {
        switch(options) {
          case 'stop':
            cont.cycleStop++; // callbacks look for change
            if (cont.cycleTimeout)
              clearTimeout(cont.cycleTimeout);
            cont.cycleTimeout = 0;
            $(cont).removeData('cycle.opts');
            return false;
          case 'pause':
            cont.cyclePause = 1;
            return false;
          case 'resume':
            cont.cyclePause = 0;
            if (arg2 === true) { // resume now!
              options = $(cont).data('cycle.opts');
              if (!options) {
                log('options not found, can not resume');
                return false;
              }
              if (cont.cycleTimeout) {
                clearTimeout(cont.cycleTimeout);
                cont.cycleTimeout = 0;
              }
              go(options.elements, options, 1, 1);
            }
            return false;
          default:
            options = { fx: options };
        };
      }
      else if (options.constructor == Number) {
        // go to the requested slide
        var num = options;
        options = $(cont).data('cycle.opts');
        if (!options) {
          log('options not found, can not advance slide');
          return false;
        }
        if (num < 0 || num >= options.elements.length) {
          log('invalid slide index: ' + num);
          return false;
        }
        options.nextSlide = num;
        if (cont.cycleTimeout) {
          clearTimeout(this.cycleTimeout);
          cont.cycleTimeout = 0;
        }
        if (typeof arg2 == 'string')
          options.oneTimeFx = arg2;
        go(options.elements, options, 1, num >= options.currSlide);
        return false;
      }
      return options;
    };
    
    function removeFilter(el, opts) {
      if (!$.support.opacity && opts.cleartype && el.style.filter) {
        try { el.style.removeAttribute('filter'); }
        catch(smother) {} // handle old opera versions
      }
    };
    
    // one-time initialization
    function buildOptions($cont, $slides, els, options, o) {
      // support metadata plugin (v1.0 and v2.0)
      var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
      if (opts.autostop)
        opts.countdown = opts.autostopCount || els.length;
      
      var cont = $cont[0];
      $cont.data('cycle.opts', opts);
      opts.$cont = $cont;
      opts.stopCount = cont.cycleStop;
      opts.elements = els;
      opts.before = opts.before ? [opts.before] : [];
      opts.after = opts.after ? [opts.after] : [];
      opts.after.unshift(function(){ opts.busy=0; });
      
      // push some after callbacks
      if (!$.support.opacity && opts.cleartype)
        opts.after.push(function() { removeFilter(this, opts); });
      if (opts.continuous)
        opts.after.push(function() { go(els,opts,0,!opts.rev); });
      
      saveOriginalOpts(opts);
      
      // clearType corrections
      if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
        clearTypeFix($slides);
      
      // container requires non-static position so that slides can be position within
      if ($cont.css('position') == 'static')
        $cont.css('position', 'relative');
      if (opts.width)
        $cont.width(opts.width);
      if (opts.height && opts.height != 'auto')
        $cont.height(opts.height);
      
      if (opts.startingSlide)
        opts.startingSlide = parseInt(opts.startingSlide);
      
      // if random, mix up the slide array
      if (opts.random) {
        opts.randomMap = [];
        for (var i = 0; i < els.length; i++)
          opts.randomMap.push(i);
        opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
        opts.randomIndex = 0;
        opts.startingSlide = opts.randomMap[0];
      }
      else if (opts.startingSlide >= els.length)
        opts.startingSlide = 0; // catch bogus input
      opts.currSlide = opts.startingSlide = opts.startingSlide || 0;
      var first = opts.startingSlide;
      
      // set position and zIndex on all the slides
      $slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) {
        var z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i;
        $(this).css('z-index', z)
          });
      
      // make sure first slide is visible
      $(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case
      removeFilter(els[first], opts);
      
      // stretch slides
      if (opts.fit && opts.width)
        $slides.width(opts.width);
      if (opts.fit && opts.height && opts.height != 'auto')
        $slides.height(opts.height);
      
      // stretch container
      var reshape = opts.containerResize && !$cont.innerHeight();
      if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
        var maxw = 0, maxh = 0;
        for(var i=0; i < els.length; i++) {
          var $e = $(els[i]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight();
          if (!w) w = e.offsetWidth;
          if (!h) h = e.offsetHeight;
          maxw = w > maxw ? w : maxw;
          maxh = h > maxh ? h : maxh;
        }
        if (maxw > 0 && maxh > 0)
          $cont.css({width:maxw+'px',height:maxh+'px'});
      }
      
      if (opts.pause)
        $cont.hover(function(){this.cyclePause++;},function(){this.cyclePause--;});
      
      if (supportMultiTransitions(opts) === false)
        return false;
      
      // run transition init fn
      if (!opts.multiFx) {
        var init = $.fn.cycle.transitions[opts.fx];
        if ($.isFunction(init))
          init($cont, $slides, opts);
        else if (opts.fx != 'custom' && !opts.multiFx) {
          log('unknown transition: ' + opts.fx,'; slideshow terminating');
          return false;
        }
      }
      
      // apparently a lot of people use image slideshows without height/width attributes on the images.
      // Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
      var requeue = false;
      options.requeueAttempts = options.requeueAttempts || 0;
      $slides.each(function() {
        // try to get height/width of each slide
        var $el = $(this);
        this.cycleH = (opts.fit && opts.height) ? opts.height : $el.height();
        this.cycleW = (opts.fit && opts.width) ? opts.width : $el.width();
        
        if ( $el.is('img') ) {
          // sigh..  sniffing, hacking, shrugging...
          var loadingIE    = ($.browser.msie  && this.cycleW == 28 && this.cycleH == 30 && !this.complete);
          var loadingOp    = ($.browser.opera && this.cycleW == 42 && this.cycleH == 19 && !this.complete);
          var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete);
          
          // don't requeue for images that are still loading but have a valid size
          if (loadingIE || loadingOp || loadingOther) {
            if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
              log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
              setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout);
              requeue = true;
              return false; // break each loop
            }
            else {
              log('could not determine size of image: '+this.src, this.cycleW, this.cycleH);
            }
          }
        }
        return true;
      });
      
      if (requeue)
        return false;
      
      opts.cssBefore = opts.cssBefore || {};
      opts.animIn = opts.animIn || {};
      opts.animOut = opts.animOut || {};
      
      $slides.not(':eq('+first+')').css(opts.cssBefore);
      if (opts.cssFirst)
        $($slides[first]).css(opts.cssFirst);
      
      if (opts.timeout) {
        opts.timeout = parseInt(opts.timeout);
        // ensure that timeout and speed settings are sane
        if (opts.speed.constructor == String)
          opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed);
        if (!opts.sync)
          opts.speed = opts.speed / 2;
        while((opts.timeout - opts.speed) < 250) // sanitize timeout
          opts.timeout += opts.speed;
      }
      if (opts.easing)
        opts.easeIn = opts.easeOut = opts.easing;
      if (!opts.speedIn)
        opts.speedIn = opts.speed;
      if (!opts.speedOut)
        opts.speedOut = opts.speed;
      
      opts.slideCount = els.length;
      opts.currSlide = opts.lastSlide = first;
      if (opts.random) {
        opts.nextSlide = opts.currSlide;
        if (++opts.randomIndex == els.length)
          opts.randomIndex = 0;
        opts.nextSlide = opts.randomMap[opts.randomIndex];
      }
      else
        opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1;
      
      // fire artificial events
      var e0 = $slides[first];
      if (opts.before.length)
        opts.before[0].apply(e0, [e0, e0, opts, true]);
      if (opts.after.length > 1)
        opts.after[1].apply(e0, [e0, e0, opts, true]);
      
      if (opts.next)
        $(opts.next).click(function(){return advance(opts,opts.rev?-1:1)});
      if (opts.prev)
        $(opts.prev).click(function(){return advance(opts,opts.rev?1:-1)});
      if (opts.pager)
        buildPager(els,opts);
      
      exposeAddSlide(opts, els);
      
      return opts;
    };
    
    // save off original opts so we can restore after clearing state
    function saveOriginalOpts(opts) {
      opts.original = { before: [], after: [] };
      opts.original.cssBefore = $.extend({}, opts.cssBefore);
      opts.original.cssAfter  = $.extend({}, opts.cssAfter);
      opts.original.animIn    = $.extend({}, opts.animIn);
      opts.original.animOut   = $.extend({}, opts.animOut);
      $.each(opts.before, function() { opts.original.before.push(this); });
      $.each(opts.after,  function() { opts.original.after.push(this); });
    };
    
    function supportMultiTransitions(opts) {
      var txs = $.fn.cycle.transitions;
      // look for multiple effects
      if (opts.fx.indexOf(',') > 0) {
        opts.multiFx = true;
        opts.fxs = opts.fx.replace(/\s*/g,'').split(',');
        // discard any bogus effect names
        for (var i=0; i < opts.fxs.length; i++) {
          var fx = opts.fxs[i];
          var tx = txs[fx];
          if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
            log('discarding unknown transition: ',fx);
            opts.fxs.splice(i,1);
            i--;
          }
        }
        // if we have an empty list then we threw everything away!
        if (!opts.fxs.length) {
          log('No valid transitions named; slideshow terminating.');
          return false;
        }
      }
      else if (opts.fx == 'all') {  // auto-gen the list of transitions
        opts.multiFx = true;
        opts.fxs = [];
        for (p in txs) {
          var tx = txs[p];
          if (txs.hasOwnProperty(p) && $.isFunction(tx))
            opts.fxs.push(p);
        }
      }
      if (opts.multiFx && opts.randomizeEffects) {
        // munge the fxs array to make effect selection random
        var r1 = Math.floor(Math.random() * 20) + 30;
        for (var i = 0; i < r1; i++) {
          var r2 = Math.floor(Math.random() * opts.fxs.length);
          opts.fxs.push(opts.fxs.splice(r2,1)[0]);
        }
        log('randomized fx sequence: ',opts.fxs);
      }
      return true;
    };
    
    // provide a mechanism for adding slides after the slideshow has started
    function exposeAddSlide(opts, els) {
      opts.addSlide = function(newSlide, prepend) {
        var $s = $(newSlide), s = $s[0];
        if (!opts.autostopCount)
          opts.countdown++;
        els[prepend?'unshift':'push'](s);
        if (opts.els)
          opts.els[prepend?'unshift':'push'](s); // shuffle needs this
        opts.slideCount = els.length;
        
        $s.css('position','absolute');
        $s[prepend?'prependTo':'appendTo'](opts.$cont);
        
        if (prepend) {
          opts.currSlide++;
          opts.nextSlide++;
        }
        
        if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
          clearTypeFix($s);
        
        if (opts.fit && opts.width)
          $s.width(opts.width);
        if (opts.fit && opts.height && opts.height != 'auto')
          $slides.height(opts.height);
        s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
        s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();
        
        $s.css(opts.cssBefore);
        
        if (opts.pager)
          $.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts);
        
        if ($.isFunction(opts.onAddSlide))
          opts.onAddSlide($s);
        else
          $s.hide(); // default behavior
      };
    }
    
    // reset internal state; we do this on every pass in order to support multiple effects
    $.fn.cycle.resetState = function(opts, fx) {
      fx = fx || opts.fx;
      opts.before = []; opts.after = [];
      opts.cssBefore = $.extend({}, opts.original.cssBefore);
      opts.cssAfter  = $.extend({}, opts.original.cssAfter);
      opts.animIn    = $.extend({}, opts.original.animIn);
      opts.animOut   = $.extend({}, opts.original.animOut);
      opts.fxFn = null;
      $.each(opts.original.before, function() { opts.before.push(this); });
      $.each(opts.original.after,  function() { opts.after.push(this); });
      
      // re-init
      var init = $.fn.cycle.transitions[fx];
      if ($.isFunction(init))
        init(opts.$cont, $(opts.elements), opts);
    };
    
    // this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
    function go(els, opts, manual, fwd) {
      // opts.busy is true if we're in the middle of an animation
      if (manual && opts.busy && opts.manualTrump) {
        // let manual transitions requests trump active ones
        $(els).stop(true,true);
        opts.busy = false;
      }
      // don't begin another timeout-based transition if there is one active
      if (opts.busy)
        return;
          
          var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide];
      
      // stop cycling if we have an outstanding stop request
      if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual)
        return;
          
          // check to see if we should stop cycling based on autostop options
          if (!manual && !p.cyclePause &&
              ((opts.autostop && (--opts.countdown <= 0)) ||
               (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
            if (opts.end)
              opts.end(opts);
            return;
              }
      
      // if slideshow is paused, only transition on a manual trigger
      if (manual || !p.cyclePause) {
        var fx = opts.fx;
        // keep trying to get the slide size if we don't have it yet
        curr.cycleH = curr.cycleH || $(curr).height();
        curr.cycleW = curr.cycleW || $(curr).width();
        next.cycleH = next.cycleH || $(next).height();
        next.cycleW = next.cycleW || $(next).width();
        
        // support multiple transition types
        if (opts.multiFx) {
          if (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length)
            opts.lastFx = 0;
          fx = opts.fxs[opts.lastFx];
          opts.currFx = fx;
        }
        
        // one-time fx overrides apply to:  $('div').cycle(3,'zoom');
        if (opts.oneTimeFx) {
          fx = opts.oneTimeFx;
          opts.oneTimeFx = null;
        }
        
        $.fn.cycle.resetState(opts, fx);
        
        // run the before callbacks
        if (opts.before.length)
          $.each(opts.before, function(i,o) {
            if (p.cycleStop != opts.stopCount) return;
              o.apply(next, [curr, next, opts, fwd]);
          });
        
        // stage the after callacks
        var after = function() {
          $.each(opts.after, function(i,o) {
            if (p.cycleStop != opts.stopCount) return;
              o.apply(next, [curr, next, opts, fwd]);
          });
        };
        
        if (opts.nextSlide != opts.currSlide) {
          // get ready to perform the transition
          opts.busy = 1;
          if (opts.fxFn) // fx function provided?
            opts.fxFn(curr, next, opts, after, fwd);
          else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
            $.fn.cycle[opts.fx](curr, next, opts, after);
          else
            $.fn.cycle.custom(curr, next, opts, after, manual && opts.fastOnEvent);
        }
        
        // calculate the next slide
        opts.lastSlide = opts.currSlide;
        if (opts.random) {
          opts.currSlide = opts.nextSlide;
          if (++opts.randomIndex == els.length)
            opts.randomIndex = 0;
          opts.nextSlide = opts.randomMap[opts.randomIndex];
        }
        else { // sequence
          var roll = (opts.nextSlide + 1) == els.length;
          opts.nextSlide = roll ? 0 : opts.nextSlide+1;
          opts.currSlide = roll ? els.length-1 : opts.nextSlide-1;
        }
        
        if (opts.pager)
          $.fn.cycle.updateActivePagerLink(opts.pager, opts.currSlide);
      }
      
      // stage the next transtion
      var ms = 0;
      if (opts.timeout && !opts.continuous)
        ms = getTimeout(curr, next, opts, fwd);
      else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
        ms = 10;
      if (ms > 0)
        p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.rev) }, ms);
    };
    
    // invoked after transition
    $.fn.cycle.updateActivePagerLink = function(pager, currSlide) {
      $(pager).find('a').removeClass('activeSlide').filter('a:eq('+currSlide+')').addClass('activeSlide');
    };
    
    // calculate timeout value for current transition
    function getTimeout(curr, next, opts, fwd) {
      if (opts.timeoutFn) {
        // call user provided calc fn
        var t = opts.timeoutFn(curr,next,opts,fwd);
        if (t !== false)
          return t;
      }
      return opts.timeout;
    };
    
    // expose next/prev function, caller must pass in state
    $.fn.cycle.next = function(opts) { advance(opts, opts.rev?-1:1); };
    $.fn.cycle.prev = function(opts) { advance(opts, opts.rev?1:-1);};
    
    // advance slide forward or back
    function advance(opts, val) {
      var els = opts.elements;
      var p = opts.$cont[0], timeout = p.cycleTimeout;
      if (timeout) {
        clearTimeout(timeout);
        p.cycleTimeout = 0;
      }
      if (opts.random && val < 0) {
        // move back to the previously display slide
        opts.randomIndex--;
        if (--opts.randomIndex == -2)
          opts.randomIndex = els.length-2;
        else if (opts.randomIndex == -1)
          opts.randomIndex = els.length-1;
        opts.nextSlide = opts.randomMap[opts.randomIndex];
      }
      else if (opts.random) {
        if (++opts.randomIndex == els.length)
          opts.randomIndex = 0;
        opts.nextSlide = opts.randomMap[opts.randomIndex];
      }
      else {
        opts.nextSlide = opts.currSlide + val;
        if (opts.nextSlide < 0) {
          if (opts.nowrap) return false;
          opts.nextSlide = els.length - 1;
        }
        else if (opts.nextSlide >= els.length) {
          if (opts.nowrap) return false;
          opts.nextSlide = 0;
        }
      }
      
      if ($.isFunction(opts.prevNextClick))
        opts.prevNextClick(val > 0, opts.nextSlide, els[opts.nextSlide]);
      go(els, opts, 1, val>=0);
      return false;
    };
    
    function buildPager(els, opts) {
      var $p = $(opts.pager);
      $.each(els, function(i,o) {
        $.fn.cycle.createPagerAnchor(i,o,$p,els,opts);
      });
      $.fn.cycle.updateActivePagerLink(opts.pager, opts.startingSlide);
    };
    
    $.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) {
      var a = ($.isFunction(opts.pagerAnchorBuilder))
          ? opts.pagerAnchorBuilder(i,el)
          : '<a href="#">'+(i+1)+'</a>';
      if (!a)
        return;
          var $a = $(a);
      // don't reparent if anchor is in the dom
      if ($a.parents('body').length == 0)
        $a.appendTo($p);
      
      $a.bind(opts.pagerEvent, function() {
        opts.nextSlide = i;
        var p = opts.$cont[0], timeout = p.cycleTimeout;
        if (timeout) {
          clearTimeout(timeout);
          p.cycleTimeout = 0;
        }
        if ($.isFunction(opts.pagerClick))
          opts.pagerClick(opts.nextSlide, els[opts.nextSlide]);
        go(els,opts,1,opts.currSlide < i); // trigger the trans
        return false;
      });
      if (opts.pauseOnPagerHover)
        $a.hover(function() { opts.$cont[0].cyclePause++; }, function() { opts.$cont[0].cyclePause--; } );
    };
    
    // helper fn to calculate the number of slides between the current and the next
    $.fn.cycle.hopsFromLast = function(opts, fwd) {
      var hops, l = opts.lastSlide, c = opts.currSlide;
      if (fwd)
        hops = c > l ? c - l : opts.slideCount - l;
      else
        hops = c < l ? l - c : l + opts.slideCount - c;
      return hops;
    };
    
    // fix clearType problems in ie6 by setting an explicit bg color
    // (otherwise text slides look horrible during a fade transition)
    function clearTypeFix($slides) {
      function hex(s) {
        s = parseInt(s).toString(16);
        return s.length < 2 ? '0'+s : s;
      };
      function getBg(e) {
        for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
          var v = $.css(e,'background-color');
          if (v.indexOf('rgb') >= 0 ) {
            var rgb = v.match(/\d+/g);
            return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
          }
          if (v && v != 'transparent')
            return v;
        }
        return '#ffffff';
      };
      $slides.each(function() { $(this).css('background-color', getBg(this)); });
    };
    
    // reset common props before the next transition
    $.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) {
      $(opts.elements).not(curr).hide();
      opts.cssBefore.opacity = 1;
      opts.cssBefore.display = 'block';
      if (w !== false && next.cycleW > 0)
        opts.cssBefore.width = next.cycleW;
      if (h !== false && next.cycleH > 0)
        opts.cssBefore.height = next.cycleH;
      opts.cssAfter = opts.cssAfter || {};
      opts.cssAfter.display = 'none';
      //MODIFIED LINE BELOW TO ALTER HEIGHT
      $("#screenshots").css("height",opts.cssBefore.height) ;
      $(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0));
      $(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1));
    };
    
    // the actual fn for effecting a transition
    $.fn.cycle.custom = function(curr, next, opts, cb, speedOverride) {
      var $l = $(curr), $n = $(next);
      
      var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut;
      $n.css(opts.cssBefore);
      if (speedOverride) {
        if (typeof speedOverride == 'number')
          speedIn = speedOut = speedOverride;
        else
          speedIn = speedOut = 1;
        easeIn = easeOut = null;
      }
      var fn = function() {$n.animate(opts.animIn, speedIn, easeIn, cb)};
      $l.animate(opts.animOut, speedOut, easeOut, function() {
        if (opts.cssAfter) $l.css(opts.cssAfter);
        if (!opts.sync) fn();
      });
      if (opts.sync) fn();
    };
    
    // transition definitions - only fade is defined here, transition pack defines the rest
    $.fn.cycle.transitions = {
      fade: function($cont, $slides, opts) {
        $slides.not(':eq('+opts.currSlide+')').css('opacity',0);
        opts.before.push(function(curr,next,opts) {
          $.fn.cycle.commonReset(curr,next,opts);
          opts.cssBefore.opacity = 0;
        });
        opts.animIn     = { opacity: 1 };
        opts.animOut   = { opacity: 0 };
        opts.cssBefore = { top: 0, left: 0 };
      }
    };
    
    $.fn.cycle.ver = function() { return ver; };
    
    // override these globally if you like (they are all optional)
    $.fn.cycle.defaults = {
      fx:        'fade', // name of transition effect (or comma separated names, ex: fade,scrollUp,shuffle)
      timeout:     4000,  // milliseconds between slide transitions (0 to disable auto advance)
      timeoutFn:     null,  // callback for determining per-slide timeout value:  function(currSlideElement, nextSlideElement, options, forwardFlag)
      continuous:     0,    // true to start next transition immediately after current one completes
      speed:       1000,  // speed of the transition (any valid fx speed value)
      speedIn:     null,  // speed of the 'in' transition
      speedOut:     null,  // speed of the 'out' transition
      next:       null,  // selector for element to use as click trigger for next slide
      prev:       null,  // selector for element to use as click trigger for previous slide
      prevNextClick: null,  // callback fn for prev/next clicks:  function(isNext, zeroBasedSlideIndex, slideElement)
      pager:       null,  // selector for element to use as pager container
      pagerClick:     null,  // callback fn for pager clicks:  function(zeroBasedSlideIndex, slideElement)
      pagerEvent:    'click', // name of event which drives the pager navigation
      pagerAnchorBuilder: null, // callback fn for building anchor links:  function(index, DOMelement)
      before:       null,  // transition callback (scope set to element to be shown):     function(currSlideElement, nextSlideElement, options, forwardFlag)
      after:       null,  // transition callback (scope set to element that was shown):  function(currSlideElement, nextSlideElement, options, forwardFlag)
      end:       null,  // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
      easing:       null,  // easing method for both in and out transitions
      easeIn:       null,  // easing for "in" transition
      easeOut:     null,  // easing for "out" transition
      shuffle:     null,  // coords for shuffle animation, ex: { top:15, left: 200 }
      animIn:       null,  // properties that define how the slide animates in
      animOut:     null,  // properties that define how the slide animates out
      cssBefore:     null,  // properties that define the initial state of the slide before transitioning in
      cssAfter:     null,  // properties that defined the state of the slide after transitioning out
      fxFn:       null,  // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
      height:      'auto', // container height
      startingSlide: 0,    // zero-based index of the first slide to be displayed
      sync:       1,    // true if in/out transitions should occur simultaneously
      random:       0,    // true for random, false for sequence (not applicable to shuffle fx)
      fit:       0,    // force slides to fit container
      containerResize: 1,    // resize container to fit largest slide
      pause:       0,    // true to enable "pause on hover"
      pauseOnPagerHover: 0, // true to pause when hovering over pager link
      autostop:     0,    // true to end slideshow after X transitions (where X == slide count)
      autostopCount: 0,    // number of transitions (optionally used with autostop to define X)
      delay:       0,    // additional delay (in ms) for first transition (hint: can be negative)
      slideExpr:     null,  // expression for selecting slides (if something other than all children is required)
      cleartype:     !$.support.opacity,  // true if clearType corrections should be applied (for IE)
      nowrap:       0,    // true to prevent slideshow from wrapping
      fastOnEvent:   0,    // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
      randomizeEffects: 1,  // valid when multiple effects are used; true to make the effect sequence random
      rev:           0,     // causes animations to transition in reverse
      manualTrump:   true,  // causes manual transition to stop an active transition instead of being ignored
      requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded
      requeueTimeout: 250   // ms delay for requeue
    };
    
  })(jQuery);
  
  
  /*!
  * jQuery Cycle Plugin Transition Definitions
  * This script is a plugin for the jQuery Cycle Plugin
  * Examples and documentation at: http://malsup.com/jquery/cycle/
  * Copyright (c) 2007-2008 M. Alsup
  * Version:   2.52
  * Dual licensed under the MIT and GPL licenses:
  * http://www.opensource.org/licenses/mit-license.php
  * http://www.gnu.org/licenses/gpl.html
  */
  (function($) {
    
    //
    // These functions define one-time slide initialization for the named
    // transitions. To save file size feel free to remove any of these that you
    // don't need.
    //
    
    // scrollUp/Down/Left/Right
    $.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) {
      $cont.css('overflow','hidden');
      opts.before.push($.fn.cycle.commonReset);
      var h = $cont.height();
      opts.cssBefore ={ top: h, left: 0 };
      opts.cssFirst = { top: 0 };
      opts.animIn    = { top: 0 };
      opts.animOut  = { top: -h };
    };
    $.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) {
      $cont.css('overflow','hidden');
      opts.before.push($.fn.cycle.commonReset);
      var h = $cont.height();
      opts.cssFirst = { top: 0 };
      opts.cssBefore= { top: -h, left: 0 };
      opts.animIn    = { top: 0 };
      opts.animOut  = { top: h };
    };
    $.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) {
      $cont.css('overflow','hidden');
      opts.before.push($.fn.cycle.commonReset);
      var w = $cont.width();
      opts.cssFirst = { left: 0 };
      opts.cssBefore= { left: w, top: 0 };
      opts.animIn    = { left: 0 };
      opts.animOut  = { left: 0-w };
    };
    $.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) {
      $cont.css('overflow','hidden');
      opts.before.push($.fn.cycle.commonReset);
      var w = $cont.width();
      opts.cssFirst = { left: 0 };
      opts.cssBefore= { left: -w, top: 0 };
      opts.animIn    = { left: 0 };
      opts.animOut  = { left: w };
    };
    $.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) {
      $cont.css('overflow','hidden').width();
      opts.before.push(function(curr, next, opts, fwd) {
        $.fn.cycle.commonReset(curr,next,opts);
        opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW);
        opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW;
      });
      opts.cssFirst = { left: 0 };
      opts.cssBefore= { top: 0 };
      opts.animIn   = { left: 0 };
      opts.animOut  = { top: 0 };
    };
    $.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) {
      $cont.css('overflow','hidden');
      opts.before.push(function(curr, next, opts, fwd) {
        $.fn.cycle.commonReset(curr,next,opts);
        opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1);
        opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH;
      });
      opts.cssFirst = { top: 0 };
      opts.cssBefore= { left: 0 };
      opts.animIn   = { top: 0 };
      opts.animOut  = { left: 0 };
    };
    
    // slideX/slideY
    $.fn.cycle.transitions.slideX = function($cont, $slides, opts) {
      opts.before.push(function(curr, next, opts) {
        $(opts.elements).not(curr).hide();
        $.fn.cycle.commonReset(curr,next,opts,false,true);
        opts.animIn.width = next.cycleW;
      });
      opts.cssBefore = { left: 0, top: 0, width: 0 };
      opts.animIn   = { width: 'show' };
      opts.animOut = { width: 0 };
    };
    $.fn.cycle.transitions.slideY = function($cont, $slides, opts) {
      opts.before.push(function(curr, next, opts) {
        $(opts.elements).not(curr).hide();
        $.fn.cycle.commonReset(curr,next,opts,true,false);
        opts.animIn.height = next.cycleH;
      });
      opts.cssBefore = { left: 0, top: 0, height: 0 };
      opts.animIn   = { height: 'show' };
      opts.animOut = { height: 0 };
    };
    
    // shuffle
    $.fn.cycle.transitions.shuffle = function($cont, $slides, opts) {
      var w = $cont.css('overflow', 'visible').width();
      $slides.css({left: 0, top: 0});
      opts.before.push(function(curr,next,opts) {
        $.fn.cycle.commonReset(curr,next,opts,true,true,true);
      });
      opts.speed = opts.speed / 2; // shuffle has 2 transitions
      opts.random = 0;
      opts.shuffle = opts.shuffle || {left:-w, top:15};
      opts.els = [];
      for (var i=0; i < $slides.length; i++)
        opts.els.push($slides[i]);
      
      for (var i=0; i < opts.currSlide; i++)
        opts.els.push(opts.els.shift());
      
      // custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
      opts.fxFn = function(curr, next, opts, cb, fwd) {
        var $el = fwd ? $(curr) : $(next);
        $(next).css(opts.cssBefore);
        var count = opts.slideCount;
        $el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
          var hops = $.fn.cycle.hopsFromLast(opts, fwd);
          for (var k=0; k < hops; k++)
            fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop());
          if (fwd)
            for (var i=0, len=opts.els.length; i < len; i++)
              $(opts.els[i]).css('z-index', len-i+count);
          else {
            var z = $(curr).css('z-index');
            $el.css('z-index', parseInt(z)+1+count);
          }
          $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
            $(fwd ? this : curr).hide();
            if (cb) cb();
          });
        });
      };
      opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 };
    };
    
    // turnUp/Down/Left/Right
    $.fn.cycle.transitions.turnUp = function($cont, $slides, opts) {
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts,true,false);
        opts.cssBefore.top = next.cycleH;
        opts.animIn.height = next.cycleH;
      });
      opts.cssFirst  = { top: 0 };
      opts.cssBefore = { left: 0, height: 0 };
      opts.animIn     = { top: 0 };
      opts.animOut   = { height: 0 };
    };
    $.fn.cycle.transitions.turnDown = function($cont, $slides, opts) {
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts,true,false);
        opts.animIn.height = next.cycleH;
        opts.animOut.top   = curr.cycleH;
      });
      opts.cssFirst  = { top: 0 };
      opts.cssBefore = { left: 0, top: 0, height: 0 };
      opts.animOut   = { height: 0 };
    };
    $.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) {
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts,false,true);
        opts.cssBefore.left = next.cycleW;
        opts.animIn.width = next.cycleW;
      });
      opts.cssBefore = { top: 0, width: 0  };
      opts.animIn     = { left: 0 };
      opts.animOut   = { width: 0 };
    };
    $.fn.cycle.transitions.turnRight = function($cont, $slides, opts) {
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts,false,true);
        opts.animIn.width = next.cycleW;
        opts.animOut.left = curr.cycleW;
      });
      opts.cssBefore = { top: 0, left: 0, width: 0 };
      opts.animIn     = { left: 0 };
      opts.animOut   = { width: 0 };
    };
    
    // zoom
    $.fn.cycle.transitions.zoom = function($cont, $slides, opts) {
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts,false,false,true);
        opts.cssBefore.top = next.cycleH/2;
        opts.cssBefore.left = next.cycleW/2;
        opts.animIn     = { top: 0, left: 0, width: next.cycleW, height: next.cycleH };
        opts.animOut   = { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 };
      });
      opts.cssFirst = { top:0, left: 0 };
      opts.cssBefore = { width: 0, height: 0 };
    };
    
    // fadeZoom
    $.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) {
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts,false,false);
        opts.cssBefore.left = next.cycleW/2;
        opts.cssBefore.top = next.cycleH/2;
        opts.animIn  = { top: 0, left: 0, width: next.cycleW, height: next.cycleH };
      });
      opts.cssBefore = { width: 0, height: 0 };
      opts.animOut  = { opacity: 0 };
    };
    
    // blindX
    $.fn.cycle.transitions.blindX = function($cont, $slides, opts) {
      var w = $cont.css('overflow','hidden').width();
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts);
        opts.animIn.width = next.cycleW;
        opts.animOut.left   = curr.cycleW;
      });
      opts.cssBefore = { left: w, top: 0 };
      opts.animIn = { left: 0 };
      opts.animOut  = { left: w };
    };
    // blindY
    $.fn.cycle.transitions.blindY = function($cont, $slides, opts) {
      var h = $cont.css('overflow','hidden').height();
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts);
        opts.animIn.height = next.cycleH;
        opts.animOut.top   = curr.cycleH;
      });
      opts.cssBefore = { top: h, left: 0 };
      opts.animIn = { top: 0 };
      opts.animOut  = { top: h };
    };
    // blindZ
    $.fn.cycle.transitions.blindZ = function($cont, $slides, opts) {
      var h = $cont.css('overflow','hidden').height();
      var w = $cont.width();
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts);
        opts.animIn.height = next.cycleH;
        opts.animOut.top   = curr.cycleH;
      });
      opts.cssBefore = { top: h, left: w };
      opts.animIn = { top: 0, left: 0 };
      opts.animOut  = { top: h, left: w };
    };
    
    // growX - grow horizontally from centered 0 width
    $.fn.cycle.transitions.growX = function($cont, $slides, opts) {
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts,false,true);
        opts.cssBefore.left = this.cycleW/2;
        opts.animIn = { left: 0, width: this.cycleW };
        opts.animOut = { left: 0 };
      });
      opts.cssBefore = { width: 0, top: 0 };
    };
    // growY - grow vertically from centered 0 height
    $.fn.cycle.transitions.growY = function($cont, $slides, opts) {
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts,true,false);
        opts.cssBefore.top = this.cycleH/2;
        opts.animIn = { top: 0, height: this.cycleH };
        opts.animOut = { top: 0 };
      });
      opts.cssBefore = { height: 0, left: 0 };
    };
    
    // curtainX - squeeze in both edges horizontally
    $.fn.cycle.transitions.curtainX = function($cont, $slides, opts) {
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts,false,true,true);
        opts.cssBefore.left = next.cycleW/2;
        opts.animIn = { left: 0, width: this.cycleW };
        opts.animOut = { left: curr.cycleW/2, width: 0 };
      });
      opts.cssBefore = { top: 0, width: 0 };
    };
    // curtainY - squeeze in both edges vertically
    $.fn.cycle.transitions.curtainY = function($cont, $slides, opts) {
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts,true,false,true);
        opts.cssBefore.top = next.cycleH/2;
        opts.animIn = { top: 0, height: next.cycleH };
        opts.animOut = { top: curr.cycleH/2, height: 0 };
      });
      opts.cssBefore = { left: 0, height: 0 };
    };
    
    // cover - curr slide covered by next slide
    $.fn.cycle.transitions.cover = function($cont, $slides, opts) {
      var d = opts.direction || 'left';
      var w = $cont.css('overflow','hidden').width();
      var h = $cont.height();
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts);
        if (d == 'right')
          opts.cssBefore.left = -w;
        else if (d == 'up')
          opts.cssBefore.top = h;
        else if (d == 'down')
          opts.cssBefore.top = -h;
        else
          opts.cssBefore.left = w;
      });
      opts.animIn = { left: 0, top: 0};
      opts.animOut = { opacity: 1 };
      opts.cssBefore = { top: 0, left: 0 };
    };
    
    // uncover - curr slide moves off next slide
    $.fn.cycle.transitions.uncover = function($cont, $slides, opts) {
      var d = opts.direction || 'left';
      var w = $cont.css('overflow','hidden').width();
      var h = $cont.height();
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts,true,true,true);
        if (d == 'right')
          opts.animOut.left = w;
        else if (d == 'up')
          opts.animOut.top = -h;
        else if (d == 'down')
          opts.animOut.top = h;
        else
          opts.animOut.left = -w;
      });
      opts.animIn = { left: 0, top: 0 };
      opts.animOut = { opacity: 1 };
      opts.cssBefore = { top: 0, left: 0 };
    };
    
    // toss - move top slide and fade away
    $.fn.cycle.transitions.toss = function($cont, $slides, opts) {
      var w = $cont.css('overflow','visible').width();
      var h = $cont.height();
      opts.before.push(function(curr, next, opts) {
        $.fn.cycle.commonReset(curr,next,opts,true,true,true);
        // provide default toss settings if animOut not provided
        if (!opts.animOut.left && !opts.animOut.top)
          opts.animOut = { left: w*2, top: -h/2, opacity: 0 };
        else
          opts.animOut.opacity = 0;
      });
      opts.cssBefore = { left: 0, top: 0 };
      opts.animIn = { left: 0 };
    };
    
    // wipe - clip animation
    $.fn.cycle.transitions.wipe = function($cont, $slides, opts) {
      var w = $cont.css('overflow','hidden').width();
      var h = $cont.height();
      opts.cssBefore = opts.cssBefore || {};
      var clip;
      if (opts.clip) {
        if (/l2r/.test(opts.clip))
          clip = 'rect(0px 0px '+h+'px 0px)';
        else if (/r2l/.test(opts.clip))
          clip = 'rect(0px '+w+'px '+h+'px '+w+'px)';
        else if (/t2b/.test(opts.clip))
          clip = 'rect(0px '+w+'px 0px 0px)';
        else if (/b2t/.test(opts.clip))
          clip = 'rect('+h+'px '+w+'px '+h+'px 0px)';
        else if (/zoom/.test(opts.clip)) {
          var t = parseInt(h/2);
          var l = parseInt(w/2);
          clip = 'rect('+t+'px '+l+'px '+t+'px '+l+'px)';
        }
      }
      
      opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)';
      
      var d = opts.cssBefore.clip.match(/(\d+)/g);
      var t = parseInt(d[0]), r = parseInt(d[1]), b = parseInt(d[2]), l = parseInt(d[3]);
      
      opts.before.push(function(curr, next, opts) {
        if (curr == next) return;
          var $curr = $(curr), $next = $(next);
        $.fn.cycle.commonReset(curr,next,opts,true,true,false);
        opts.cssAfter.display = 'block';
        
        var step = 1, count = parseInt((opts.speedIn / 13)) - 1;
        (function f() {
          var tt = t ? t - parseInt(step * (t/count)) : 0;
          var ll = l ? l - parseInt(step * (l/count)) : 0;
          var bb = b < h ? b + parseInt(step * ((h-b)/count || 1)) : h;
          var rr = r < w ? r + parseInt(step * ((w-r)/count || 1)) : w;
          $next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' });
          (step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none');
        })();
      });
      opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 };
      opts.animIn     = { left: 0 };
      opts.animOut   = { left: 0 };
    };
    
  })(jQuery);
  
  /*    06/2/2010
  PikaChoose
  Jquery plugin for photo galleries
  Copyright (C) 2010 Jeremy Fry
  
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.
  
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
  
  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
  
  (function (jQuery) {
    jQuery.fn.PikaChoose = function (user_options) {
      var defaults = {
        show_captions: true,
        auto_play: false,
        show_prev_next: true,
        slide_speed: 5000,
        thumb_width: 90,
        thumb_height: 60,
        buttons_text: { play: "", stop: "", previous: "Previous", next: "Next" },
        delay_caption: true,
        user_thumbs: false,
        transition:[-1],
        IESafe: false
      };
      
      return jQuery(this).each(
        function() 
        {
          function CreateThumbnail()
          {
            var image = jQuery(this);
            var aParent = jQuery(this).parent('a');
            if(aParent.length == 0){ aParent = jQuery(this); }
            aParent.hide();
            jQuery(this).attr('pikaLink', aParent.attr('href'));
            //pull it out of the a tag
            image = jQuery(this).clone(true).insertAfter(aParent);
            jQuery(this).removeClass('pika_first');
            //wait for load to remove previous or ie will never see the page loaded
            jQuery(this).bind("load",function(){ aParent.remove(); });
            jQuery('<img />').load(function()
                                   {
                                     var w = image.width();
                                     var h = image.height();
                                     if(w===0){w = image.attr("width");}
                                     if(h===0){h = image.attr("height");}
                                     //grab a ratio for image to user defined settings
                                     var rw = options.thumb_width/w;
                                     var rh = options.thumb_height/h;
                                     
                                     //determine which has the smallest ratio (thus needing
                                     //to be the side we use to scale so our whole thumb is filled)
                                     var ratio;
                                     if(rw<rh){
                                       //we'll use ratio later to scale and not distort
                                       ratio = rh;
                                       var left = ((w*ratio-options.thumb_width)/2)*-1;
                                       left = Math.round(left);
                                       //set images left offset to match
                                       image.css({left:left});
                                     }else{
                                       ratio = rw;
                                       var top = 0;
                                       image.css({top:top});
                                     }
                                     //use those ratios to calculate scale
                                     var width = Math.round(w*ratio);
                                     var height = Math.round(h*ratio);
                                     image.css("position","relative");
                                     image.width(width).height(height);
                                     var imgcss={
                                       width: width,
                                       height: height
                                     };
                                     image.css(imgcss);          
                                     image.hover(
                                       function(){jQuery(this).fadeTo(250,1);},
                                       function(){if(!jQuery(this).hasClass("pika_selected")){jQuery(this).fadeTo(250,0.4);}}
                                     );
                                     if(ulist.children('li').find('img:last').index(image)==0){
                                       image.fadeTo(250,1);  
                                     }else{
                                       image.fadeTo(250,0.4);  
                                     }
                                     jQuery(this).show();
                                   }).attr('src',image.attr('src'));
            //reset images to the clones
            
            images = ulist.children('li').find('img:last');
          }
          //bring in options
          var tranStep = 0;
          var options = jQuery.extend(defaults, user_options);
          var images = jQuery(this).children('li').find('img');
          images.hide();
          //save our list for future ref
          var ulist = jQuery(this);
          ulist.children("li:last").children("img").addClass("pika_last");
          images.each(CreateThumbnail);
          //start building structure
          jQuery(this).before("<div class='pika_main'></div>");
          // houses eveything about the UL
          var main_div = jQuery(this).prev(".pika_main");
          
          //add in slideshow elements when appropriate
          main_div.append("<div class='pika_play'></div>");
          var play_div = jQuery(this).prev(".pika_main").children(".pika_play");
          play_div.html("<a class='pika_play_button'>" + options.buttons_text.play + "</a><a class='pika_stop_button'>" + options.buttons_text.stop + "</a>");
          play_div.fadeOut(1);
          var play_anchor = play_div.children('a:first');
          var stop_anchor = play_div.children('a:last');
          //this div is used to make image and caption fade together
          main_div.append("<div class='pika_subdiv'></div>");
          var sub_div = main_div.children(".pika_subdiv");
          //the main image we'll be using to load
          var firstImage = ulist.find("img:first");
          if(options.user_thumbs)
          {    
            firstImage = firstImage.attr('ref');
          }else
          {
            firstImage = firstImage.attr('src');
          }
          
          
          sub_div.append("<img class='pika_main_img' src='"+firstImage+"' />");
          sub_div.append("<div class='pika_animationDivs'>");
          var ani_divs = sub_div.find(".pika_animationDivs");
          ani_divs.css({'position':'absolute','width':'100%','height':'100%'});
          
          var y = 0;
          var x = 0;
          for(var t = 0; t<25;t++)
          {
            var a = '<div col="'+y+'" row="'+x+'"></div>';
            ani_divs.append(a);
            y++
              if(y == 5)
              {
                x++;
                y=0;
              }
          }
          ani_divs.children(':last').addClass("pikaLastAni");
          var main_img = sub_div.children("img");
          //build custom overlays. These will use navigation div
          sub_div.append("<div class='pika_prev_hover'></div><div class='pika_next_hover'></div>");
          var prevHover = sub_div.find('.pika_prev_hover');
          var nextHover = sub_div.find('.pika_next_hover');
          prevHover.hide();
          nextHover.hide();
          //create the caption div when appropriate
          if(options.show_captions){
            main_div.append("<div class='pika_caption'></div>");
            var caption_div = main_div.children(".pika_caption");
          }
          
          //navigation div ALWAYS gets created, its refrenced a lot        
          ulist.after("<div class='pika_navigation'></div>");
          var navigation_div = jQuery(this).next(".pika_navigation");
          //fill in sub elements
          navigation_div.append("<a>" + options.buttons_text.previous + "</a> :: <a>" + options.buttons_text.next + "</a>");
          var previous_image_anchor = navigation_div.children('a:first');
          var next_image_anchor = navigation_div.children('a:last');
          
          //hide the navigation if the user doesn't want it
          if(!options.show_prev_next){
            navigation_div.css("display","none");
          }
          
          //playing triggers the loop for the slideshow
          var playing = options.auto_play;
          var animating = false;
          main_img.wrap("<a></a>");
          var main_link = main_img.parent("a");
          
          function activate()
          {
            //sets the intial phase for everything
            
            //image_click is controls the fading
            images.bind("click",image_click);
            //hiding refrence to slide elements if slide is disabled
            
            if(options.auto_play){
              playing = true;
              play_anchor.hide();
              stop_anchor.show();
            }else{
              play_anchor.show();
              stop_anchor.hide();
            }
            
            
            ulist.children("li:last").children("img").addClass("pika_last");
            ulist.children("li:first").children("img").addClass("pika_first");
            ulist.children("li").each(function(){ jQuery(this).children("span").hide(); });
            //css for the list
            var divcss = {
              width: options.thumb_width+"px",
              height: options.thumb_height+"px",
              "list-style": "none",
              overflow: "hidden"
            };
            var licss = {
              "list-style": "none",
              overflow: "hidden"
            };
            images.each(function(){
              jQuery(this).parent('li').css(licss);
              jQuery(this).wrap(document.createElement("div"));
              jQuery(this).parent('div').css(divcss);
            });
            //previous link to go back an image
            previous_image_anchor.bind("click",previous_image);
            prevHover.bind("click",previous_image);
            //ditto for forward, also the item that gets auto clicked for slideshow
            next_image_anchor.bind("click",next_image);
            nextHover.bind("click",next_image);  
            
            //enable mouse tracking for the hover
            sub_div.mousemove(function(e){
              var w = sub_div.width();
              var x = e.pageX - sub_div.offset().left;
              if(x<w*0.3)
              {
                prevHover.fadeIn('fast');
              }else{
                prevHover.fadeOut('fast');
              }
              if(x>w*0.7)
              {
                nextHover.fadeIn('fast');  
              }else{
                nextHover.fadeOut('fast');  
              }
            });
            sub_div.mouseleave(function(){ prevHover.fadeOut('fast');nextHover.fadeOut('fast'); });
            
          }//end activate function
          
          function Gapper(ele, aHeight)
          {
            if(ele.attr('row') == 9 && ele.attr('col') == 0)
            {
              //last row, check the gap and fix it!
              var gap = ani_divs.height()-(aHeight*9);
              return gap;
            }
            return aHeight;
          }
          
          
          function AnimateImage(image_source, image_link,how)
          {
            //main_img.hide();
            jQuery('<img />').load(function()
                                   {
                                     ani_divs.height(main_img.height()).show();
                                     ani_divs.children('div').css({'width':'20%','height':'20%','float':'left'});
                                     
                                     var aWidth = ani_divs.children('div:first').width();
                                     var aHeight = ani_divs.children('div:first').height();
                                     if(how!="autoFirst"){
                                       ani_divs.children().each(function()
                                                                {
                                                                  //position myself absolutely
                                                                  var div = jQuery(this);
                                                                  var xOffset = Math.floor(div.parent().width()/5)*div.attr('col');
                                                                  var yOffset = Math.floor(div.parent().height()/5)*div.attr('row');
                                                                  div.css({
                                                                    'background':'url('+image_source+') -'+xOffset+'px -'+yOffset+'px',
                                                                    'width':'0px',
                                                                    'height':'0px',
                                                                    'position':'absolute',
                                                                    'top':yOffset+'px',
                                                                    'left':xOffset+'px',
                                                                    'float':'none'
                                                                  });
                                                                });//end ani_divs.children.each
                                     }
                                     
                                     //decide our transition
                                     var n = 0;
                                     if(options.transition[0] == -1)
                                     {  //random
                                       n = Math.floor(Math.random()*6);
                                     }else{
                                       n = options.transition[tranStep];
                                       tranStep++;
                                       if(tranStep >= options.transition.length){tranStep=0;}
                                     }
                                     if(options.IESafe == true)
                                     {
                                       if(jQuery.browser.msie)
                                       {
                                         n = 0;
                                       }
                                       
                                     }
                                     switch(n)
                                     {
                                       case 0:
                                         //full frame fade
                                         ani_divs.height(main_img.height()).hide().css({'background':'url('+image_source+') top left no-repeat'});
                                         ani_divs.children('div').hide();
                                         ani_divs.fadeIn('slow',function(){
                                           FinishedAnimating(image_source,image_link);
                                           ani_divs.css({'background':'transparent'});
                                         });
                                         
                                         break;
                                           case 1:
                                         ani_divs.children().hide().each(function(index)
                                                                         {  
                                                                           //animate out as blocks 
                                                                           var delay = index*10;
                                                                           jQuery(this).delay(delay).animate({"width":aWidth,"height":aHeight},800,'linear',function()
                                                                                                             {
                                                                                                               if(jQuery(this).hasClass('pikaLastAni'))
                                                                                                               {
                                                                                                                 FinishedAnimating(image_source,image_link);
                                                                                                               }
                                                                                                             });
                                                                         });
                                         break;
                                           case 2:
                                         ani_divs.children().hide().each(function(index)
                                                                         {
                                                                           var delay = jQuery(this).attr('row')*10;
                                                                           jQuery(this).css({"width":aWidth}).delay(delay).animate({"height":aHeight},800,'linear',function()
                                                                                                                                   {
                                                                                                                                     if(jQuery(this).hasClass('pikaLastAni'))
                                                                                                                                     {
                                                                                                                                       FinishedAnimating(image_source,image_link);
                                                                                                                                     }
                                                                                                                                   });
                                                                         });
                                         break;            
                                           case 3:
                                         ani_divs.children().hide().each(function(index)
                                                                         {
                                                                           var delay = jQuery(this).attr('col')*10;
                                                                           aHeight = Gapper(jQuery(this), aHeight);
                                                                           jQuery(this).css({"height":aHeight}).delay(delay).animate({"width":aWidth},800,'linear',function()
                                                                                                                                     {
                                                                                                                                       if(jQuery(this).hasClass('pikaLastAni'))
                                                                                                                                       {
                                                                                                                                         FinishedAnimating(image_source,image_link);
                                                                                                                                       }
                                                                                                                                     });
                                                                         });
                                         break;
                                           case 4:
                                         ani_divs.children().show().each(function(index)
                                                                         {
                                                                           var delay = index*Math.floor(Math.random()*5)*10;
                                                                           aHeight = Gapper(jQuery(this), aHeight);
                                                                           
                                                                           if(jQuery(this).hasClass('pikaLastAni'))
                                                                           {
                                                                             delay = 800;
                                                                           }
                                                                           jQuery(this).css({"height":aHeight,"width":aWidth,"opacity":.01}).delay(delay).animate({"opacity":1},800,function()
                                                                                                                                                                  {
                                                                                                                                                                    if(jQuery(this).hasClass('pikaLastAni'))
                                                                                                                                                                    {
                                                                                                                                                                      FinishedAnimating(image_source,image_link);
                                                                                                                                                                    }
                                                                                                                                                                  });
                                                                         });
                                         break;
                                           case 5:
                                         //full frame slide
                                         ani_divs.height(main_img.height()).hide().css({'background':'url('+image_source+') top left no-repeat'});
                                         ani_divs.children('div').hide();
                                         ani_divs.css({width:0}).animate({width:main_img.width()},'slow',function(){
                                           FinishedAnimating(image_source,image_link);
                                           ani_divs.css({'background':'transparent'});
                                         });
                                         
                                         break;
                                           }
                                   }).attr('src',image_source);//end image preload
          }// end animate images
          
          function FinishedAnimating(image_source,image_link)
          {
            animating = false;
            main_img.attr("src", image_source);
            if(image_link == null){image_link = "#"}
            main_link.attr("href", image_link);
            ani_divs.children().css({"background":"transparent"});
            ani_divs.hide();
            if(playing)
            {
              main_img.animate({opacity:1},options.slide_speed, function()
                               {
                                 //redudency needed here to catch the user clicking on an image during a change.
                                 if(playing){next_image_anchor.trigger("click",["auto"]);}
                               });
            }
          }
          function image_click(event, how){
            //catch when user clicks on an image Then cancel current slideshow
            if(jQuery(this).hasClass('pika_selected') || animating){ return; }
            if(how!="auto" && how!="autoFirst"){
              animating = true;
              stop_anchor.hide();
              play_anchor.show();
              playing=false;
              
              main_img.stop().dequeue();
              if(options.show_captions)
              {
                caption_div.stop().dequeue();
              }
            }
            //all our image variables
            var image_source = "";
            if(options.user_thumbs)
            {    
              image_source = jQuery(this).attr("ref");
            }else
            {
              image_source = this.src;
            }
            //thumbnail animations
            var image_link = jQuery(this).attr("pikalink");
            var image_caption = jQuery(this).parent().next("span").html();
            //fade out the old thumb
            images.filter(".pika_selected").fadeTo(250,0.4); 
            images.filter(".pika_selected").removeClass("pika_selected"); 
            //fade in the new thumb
            jQuery(this).fadeTo(250,1);
            jQuery(this).addClass("pika_selected");
            //fade the caption out
            if(options.show_captions)
            {
              if(options.delay_caption)
              {
                caption_div.fadeTo(800,0);
              }
              caption_div.fadeTo(500,0,function(){
                caption_div.html(image_caption);
                caption_div.fadeTo(800,1);
              });
            }
            AnimateImage(image_source, image_link, how);
          }//end image_click function
          
          function next_image(event, how){
            if(images.filter(".pika_selected").hasClass("pika_last")){
              images.filter(":first").trigger("click",how);
            }else{
              images.filter(".pika_selected").parents('li').next('li').find('img').trigger("click",how);
            }
          }//end next image function
          
          function previous_image(event, how){
            if(images.filter(".pika_selected").hasClass("pika_first")){
              images.filter(":last").trigger("click",how);
            }else{
              images.filter(".pika_selected").parents('li').prev('li').find('img').trigger("click",how);
            }
          }//end previous image function
          
          function play_button(){
            main_div.hover(
              function(){play_div.fadeIn(400);},
              function(){play_div.fadeOut(400);}
            );
            play_anchor.bind("click", function(){
              main_img.stop();
              main_img.dequeue();
              if(options.show_captions)
              {
                caption_div.stop();
                caption_div.dequeue();
              }
              playing = true;
              next_image_anchor.trigger("click",["auto"]);
              jQuery(this).hide();
              stop_anchor.show();
            });
            stop_anchor.bind("click", function(){
              playing = false;
              jQuery(this).hide();
              play_anchor.show();
            });
          }
          play_button();
          activate();
          ulist.children('li:first').find('img:last').trigger("click",["autoFirst"]);
        });//end return this.each
    }//end build function
      
      //activate applies the appropriate actions to all the different parts of the structure.
      //and loads the sets the first image
      })(jQuery);
  
  /**
  * --------------------------------------------------------------------
  * jQuery-Plugin "toggleElements"
  * Version: 1.3, 11.09.2007
  * by Andreas Eberhard, andreas.eberhard@gmail.com
  *                      http://jquery.andreaseberhard.de/
  *
  * Copyright (c) 2007 Andreas Eberhard
  * Licensed under GPL (http://www.opensource.org/licenses/gpl-license.php)
  *
  * Changelog:
  *    11.09.2007 Version 1.3
  *    - removed noConflict
  *    - added 'opened'-state via additional class 'opened'
  *    02.07.2007 Version 1.2.1
  *    - changed blur to work with jQuery 1.1.3
  *    - added packed version
  *    27.06.2007 Version 1.2
  *    - suppress multiple animations
  *    15.06.2007 Version 1.1
  *    - added callbacks onClick, onShow, onHide
  *    - added option showTitle
  *    31.05.2007 initial Version 1.0
  * --------------------------------------------------------------------
  * @example $(function(){$('div.toggler-1').toggleElements( );});
  * @desc Toggles the div with class 'toggler-1' into closed state on document.ready
  *
  * @example $(function(){$('fieldset.toggler-9').toggleElements( { fxAnimation:'show', fxSpeed:1000, className:'toggler', onClick:doOnClick, onHide:doOnHide, onShow:doOnShow } );});
  * @desc Toggles the fieldset with class 'toggler-9' into closed state on document.ready
  *       Animation show with speed 1000 ms is used, for the different states the css-class-prefix 'toggler-' will be used
  *       Events OnClick, OnHide, OnShow will call your JavaScript-functions
  * --------------------------------------------------------------------
  */
  
  var toggleElements_animating = false;
  
  (function($) {
    
    jQuery.fn.toggleElements = function(settings) {
      
      // Settings
      settings = jQuery.extend({
        fxAnimation: "slide",   // slide, show, fade
        fxSpeed: "normal",   // slow, normal, fast or number of milliseconds
        className: "toggler",
        removeTitle: true,
        showTitle: false,
        onClick: null,
        onHide: null,
        onShow: null
      }, settings);
      
      var onClick = settings.onClick, onHide = settings.onHide, onShow = settings.onShow;
      
      if ((settings.fxAnimation!='slide')&&(settings.fxAnimation!='show')&&(settings.fxAnimation!='fade'))
        settings.fxAnimation='slide';
      
      // First hide all elements without class 'opened'
      this.each(function(){
        if (jQuery(this).attr('class').indexOf("opened")==-1){
          jQuery(this).hide();
        }
      });
      
      // Add Toggle-Links before elements
      this.each(function(){
        
        wtitle='';
        wlinktext=jQuery(this).attr('title');
        
        if (settings.showTitle==true) wtitle=wlinktext;
        if (settings.removeTitle==true) jQuery(this).attr('title','');
        
        if (jQuery(this).attr('class').indexOf("opened")!=-1){
          jQuery(this).before('<a class="'+settings.className+' '+settings.className+'-opened" href="#" title="'+ wtitle +'">' + wlinktext + '</a>');
          jQuery(this).addClass(settings.className+'-c-opened');
        } else {
          jQuery(this).before('<a class="'+settings.className+' '+settings.className+'-closed" href="#" title="'+ wtitle +'">' + wlinktext + '</a>');
          jQuery(this).addClass(settings.className+'-c-closed');
        }
        
        // Click-Function for Toggle-Link
        jQuery(this).prev('a.'+settings.className).click(function() {
          
          if (toggleElements_animating) return false;
          
          thelink = this;
          jQuery(thelink)[0].blur();
          
          if (thelink.animating||toggleElements_animating) return false;
          toggleElements_animating = true;
          thelink.animating = true;
          
          // Callback onClick
          if ( typeof onClick == 'function' && onClick(thelink) === false) {
            toggleElements_animating = false;
            thelink.animating = false;
            return false;
          }
          
          // Hide Element
          if (jQuery(this).next().css('display')=='block') {
            jQuery(this).next().each(function(){
              if (settings.fxAnimation == 'slide') jQuery(this).slideUp(settings.fxSpeed,function(){
                jQuery.toggleElementsHidden(this,settings.className,onHide,thelink);
              });
              if (settings.fxAnimation == 'show') jQuery(this).hide(settings.fxSpeed,function(){
                jQuery.toggleElementsHidden(this,settings.className,onHide,thelink);
              });
              if (settings.fxAnimation == 'fade') jQuery(this).fadeOut(settings.fxSpeed,function(){
                jQuery.toggleElementsHidden(this,settings.className,onHide,thelink);
              });
            });
            // Show Element
          } else {
            jQuery(this).next().each(function(){
              if (settings.fxAnimation == 'slide') jQuery(this).slideDown(settings.fxSpeed,function(){
                jQuery.toggleElementsShown(this,settings.className,onShow,thelink);
              });
              if (settings.fxAnimation == 'show')  jQuery(this).show(settings.fxSpeed,function(){
                jQuery.toggleElementsShown(this,settings.className,onShow,thelink);
              });
              if (settings.fxAnimation == 'fade')  jQuery(this).fadeIn(settings.fxSpeed,function(){
                jQuery.toggleElementsShown(this,settings.className,onShow,thelink);
              });
            });
          }
          return false;
          
        });
        
      });
      
    };
    
    // Remove/Add classes to Toggler-Link
    jQuery.toggleElementsHidden = function(el,cname,onHide,thelink) {
      jQuery(el).prev('a.'+cname).removeClass(cname+'-opened').addClass(cname+'-closed').blur();
      if ( typeof onHide == 'function') onHide(this); // Callback onHide
      jQuery(el).removeClass(cname+'-c-opened').addClass(cname+'-c-closed');
      toggleElements_animating = false;
      thelink.animating = false;
    };
    jQuery.toggleElementsShown = function(el,cname,onShow,thelink) {
      jQuery(el).prev('a.'+cname).removeClass(cname+'-closed').addClass(cname+'-opened').blur();
      if ( typeof onShow == 'function') onShow(this); // Callback onShow
      jQuery(el).removeClass(cname+'-c-closed').addClass(cname+'-c-opened');
      toggleElements_animating = false;
      thelink.animating = false;
    };
    
  })(jQuery);
  
  
})(this.jQuery);
