$.fn.extend({
    imageSeries: function(args) {
        return this.each(function() {
            new $.imageSeries(this, args);
        });
    }
});

$.imageSeries = function(object, args) {
    if (!object) return;
    
    if (!args) args = new Object();
    var $object   = $(object);
    var $marquee  = args.marquee ? $(args.marquee) : $object.find('a.clip');
    var $next     = args.next ? $(args.next) : $object.find('a[rel=next]');
    var $prev     = args.prev ? $(args.prev) : $object.find('a[rel=prev]');
    var $series   = args.source ? $(args.source) : $object.find('.series');
    var num_items = $series.find('a[rel]').length;
    if (num_items == 0 || $marquee.length == 0) return;

    var loading = false;
    var controllerClick = function(action) {
        if (loading) return;
        var cur_image  = $marquee.find('img:visible');
        var cur_source = cur_image.attr('src');
        
        var next_source = '';
        var flag = false;
        if (action == 'next') {
          var next_image = $series.find('a[rel=' + cur_source + ']').parent().next().find('a[rel]');
          if (next_image.length  >= 1) {
            next_source = next_image.attr('rel');
            if ($series.find('a[rel=' + next_source + ']').parent().next().length == 0) flag = true;
          }
          else return;
        }
        else {
          var previmage = $series.find('a[rel=' + cur_source + ']').parent().prev().find('a[rel]');
          if (previmage.length == 1) {
            next_source = previmage.attr('rel');
            if ($series.find('a[rel=' + next_source + ']').parent().prev().length == 0) flag = true;
          }
          else return;
        }

        if (next_source != '') {
          loading = true;
          var next_image = $marquee.find('img[src=' + next_source + ']');
          if (next_image.length == 0) {
            next_image = $marquee.append('<img src="' + next_source + '" style="display: none;" />').find('img[src=' + next_source + ']');
          }
          cur_image.fadeOut('normal');
          next_image.fadeIn('normal', function() { loading = false; });
          if (flag) {
            if (action == 'next') $next.addClass('disabled');
            else $prev.addClass('disabled');
            flag = false;
          }
          else {
            if (action == 'next' && $prev.hasClass('disabled')) $prev.removeClass('disabled');
            else if (action == 'prev' && $next.hasClass('disabled')) $next.removeClass('disabled');
          }
        }
    }

    $next.bind('click', function() {
      controllerClick('next');
      return false;
    });
    
    $prev.bind('click', function() {
      controllerClick('prev');
      return false;
    });
}

