function getBWImage(img_html) {
  if (img_html.indexOf('http') >= 0) {
    img_html = img_html.replace(/http:\/\/[^\/]+/,'');
  }
  return img_html.replace(/src="/,'src="/bw.php?i=');
}

function CS_Carousel(params) {
  this.params = {
    selector: 'ul#cs_carousel',
    ready_container: '#slideshow',
    container: '#slideshow_container',
    bottom_offset: 172,
    image_height: 600,
    show: true
  };
  this.params = jQuery.extend(false, this.params, params);

  this.itemList = [];

  this.initCallback = function(csc, carousel) {
    $(csc.params.selector).children().each(function() {
        csc.itemList.push(this.innerHTML);
    });
    $(csc.params.selector).html('');
    $(csc.params.ready_container).css('top',-(csc.params.image_height - csc.params.bottom_offset));
    /*
    $(csc.params.ready_container).mouseenter(function() {
        $(csc.params.ready_container).css('cursor','url(http://www.google.com/intl/en_ALL/mapfiles/openhand.cur), -moz-grab');
    });
    $(csc.params.ready_container).mouseleave(function() {
        $(csc.params.ready_container).css('cursor','auto');
    });
    $(csc.params.ready_container).mousedown(function(down_e) {
        if (down_e.target.tagName == 'A') return;
        $(csc.params.ready_container).css('cursor','url(http://www.google.com/intl/en_ALL/mapfiles/closedhand.cur), -moz-grabbing');
        down_e.preventDefault();
        var mouse_start = { 
          time: new Date(),
          x: down_e.clientX,
          y: down_e.clientY
        };
        var mouseup = function(up_e) {
          var now = new Date();
          var duration = now.getTime() - mouse_start.time.getTime();
          if (duration < 200 || Math.abs() < 10) {
            carousel.options.animation = 'normal';
            if (up_e.clientY < ($(csc.params.container).offset()['top'] + csc.params.bottom_offset)) {
              carousel.prev();
            } else {
              carousel.next();
            }
          } else if (up_e.clientY < mouse_start.y) {
            carousel.options.animation = Math.min(5000, Math.round(duration / (mouse_start.y - up_e.clientY)) * 100);
            carousel.next();
          } else {
            carousel.options.animation = Math.min(5000, Math.round(duration / (up_e.clientY - mouse_start.y)) * 100);
            carousel.prev();
          }
          $(csc.params.ready_container).css('cursor','url(http://www.google.com/intl/en_ALL/mapfiles/openhand.cur), -moz-grab');
          $(this).unbind('mouseup', mouseup);
        };
        $(csc.params.ready_container).bind('mouseup', mouseup);
    });
    */
    $(csc.params.ready_container).click(function(click_e) {
        if (click_e.target.tagName == 'A') return;
        click_e.preventDefault();
        if (click_e.clientY < ($(csc.params.container).offset()['top'] + csc.params.bottom_offset)) {
          carousel.prev();
        } else {
          carousel.next();
        }
    });

    if (!csc.params.show) { 
      $(csc.params.ready_container).css('left','-5000px');
      setTimeout(function() {$(csc.params.ready_container).fadeOut('fast');}, 5000);
    };
    $(csc.params.ready_container).show();
  }

  this.itemVisibleInCallback = function(csc, carousel, item, i, state, evt) {
    // The index() method calculates the index from a
    // given index who is out of the actual item range.
    if (csc.itemList.length > 0) {
      var idx = carousel.index(i, csc.itemList.length);
      var n_img = carousel.add(i, getBWImage(csc.itemList[idx - 1]));
      $(n_img).fadeTo('fast', 0.15);
    }
  };

  this.itemVisibleOutCallback = function(carousel, item, i, state, evt) {
    carousel.remove(i);
  };

  this.clear_selected = function(csc, carousel, item, i, state) {
    var idx = carousel.index(i+1, csc.itemList.length);
    var i_s = '.jcarousel-item-'+(i+1);
    $(csc.params.selector).find(i_s).removeClass('active');
    csc.last_out = i_s;
    csc.last_html = getBWImage(csc.itemList[idx - 1]);
  }

  this.activate_image = function(csc, carousel, item, i, state) {
    var idx = carousel.index(i+1, csc.itemList.length);
    var i_s = '.jcarousel-item-'+(i+1);
    $(csc.params.selector).find(i_s).find('.slide').replaceWith(csc.itemList[idx - 1]);
    $(csc.params.selector).find(i_s).fadeTo('normal', 1.0);
    $(csc.params.selector).find(i_s).addClass('active');
    if (csc.last_out != null) {
      $(csc.params.selector).find(csc.last_out).find('.slide').replaceWith(csc.last_html);
      $(csc.params.selector).find(csc.last_out).fadeTo('fast', 0.15);
    }
  }

  var csc = this;
  $(this.params.selector).jcarousel({
    scroll: 1,
    initCallback: function(carousel) { csc.initCallback(csc, carousel); },
    itemFirstOutCallback: { onBeforeAnimation: function(carousel, item, i, state) { csc.clear_selected(csc, carousel, item, i, state); } },
    itemFirstInCallback: { onAfterAnimation: function(carousel, item, i, state) { csc.activate_image(csc, carousel, item, i, state); } },
    wrap: 'circular',
    vertical: true,
    buttonNextHTML: null,
    buttonPrevHTML: null,
    itemVisibleInCallback: {onBeforeAnimation: function(carousel, item, i, state, evt) { csc.itemVisibleInCallback(csc, carousel, item, i, state, evt); }},
    itemVisibleOutCallback: {onAfterAnimation: csc.itemVisibleOutCallback}
  });

}
