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

$.slideShow = function(object, args) {
    var $object   = $(object);
    var $marquee  = $object.find('.marquee-main');
    var $nav      = $object.find('.marquee-nav');
    var $items    = $nav.find('a[rel]');
    var num_items = $items.length;
    var loading   = false;
    if (num_items == 0 || !$marquee) return;

    if (!args) args = new Object;
    if (!args.speed) args.speed = 1200;
    if (!args.autoSpeed) args.autoSpeed = 5000;

    var hasCallBack = typeof(args.callBack) == 'function' ? true : false;

    $.fn.play = function() {
        args.playing = true;
        $(document).everyTime(args.autoSpeed, function() { $.fn.controllerClick('marquee-next'); });
    };
    $.fn.stop = function() {
        args.playing = false;
        $(document).stopTime();
    }

    $.fn.gotoItem = function(name) {
        if (!name || loading) return 
        var $shown; var $hidden;
        var obj = $marquee.find('div');
        obj.each(function() {
            if ($(this).is(':hidden')) {
                $hidden = $(this);
            }
            else {
                $shown = $(this);
            }
        });
        
        if (!$shown) {
            $shown  = $(obj[0]);
            $hidden = $(obj[1]);
        }
        if ($shown.hasClass(name)) return;
        
        loading = true;

        if ($shown.attr('class') == '') {
            $object.find('.text-' + name).fadeIn(args.speed);
            if (hasCallBack) args.callBack(name);
        }
        else {
            $object.find('.text-' + $shown.attr('class')).fadeOut(args.speed, function() {
              $object.find('.text-' + name).fadeIn(args.speed);
              if (hasCallBack) args.callBack(name);
            });
        }

        $shown.fadeOut(args.speed, function() { $shown.removeClass(); });

        $hidden.addClass(name).fadeIn(args.speed, function() {
            if ($nav.is(':hidden')) $nav.fadeIn(args.speed);
            $items.removeClass('selected');
            $nav.find('a[rel="' + name + '"]').addClass('selected')
            loading = false;
        }).click(function() { window.location = $nav.find('a[rel="' + name + '"]').attr("href"); });
    };

    $.fn.controllerClick = function(action) {
        var current_image = $marquee.find('div:visible').attr('class');
        if (current_image == '') return;

        var current_index = order[current_image] ? order[current_image] : 0;
        var image = '';
        if (action == 'marquee-next') {
            if (current_index == num_items - 1) image = $($items[0]).attr('rel');
            else image = $($items[current_index + 1]).attr('rel');
        }
        else if (action == 'marquee-prev') {
            if (current_index == 0) image = $($items[num_items - 1]).attr('rel');
            else image = $($items[current_index - 1]).attr('rel');
        }
        if (image != '') $.fn.gotoItem(image);
    }

    if ($marquee.find('div').length == 0) $marquee.append('<div></div><div></div>');
    else if (hasCallBack) args.callBack($marquee.find('#default-image').attr('class'));

    var order = new Object;

    var count = 0;
    $items.each(function() {
        var val = $(this).attr('rel');
        $(this).click(function() {
            $.fn.gotoItem(val);
            return false;
        });
        order[val] = count;
        count++;
    });

    $(object).find('.marquee-controller a[rel]').each(function() {
        $(this).click(function() {
            $.fn.controllerClick($(this).attr('rel'));
            return false;
        });
    });
    
    $.fn.gotoItem($($items[0]).attr('rel'));
    $(object).find('#default-image').click(function() { window.location = $(object).find('.marquee-nav a[class="selected"]').attr("href"); });

    $.fn.play();

    $object.mouseover(function() {
        $.fn.stop();
    }).mouseout(function() {
        $.fn.play();
    });
}

