jQuery.fn.ddSlider = function() {
    var args            = arguments[0] || {};
    var slider          = this;
    var slides          = $(slider).find('div.dd_slider_slide');
    var navigator       = null;
    var controller      = null;
    var points          = [];
    var direction       = 'forward';
    var first           = 0;
    var last            = (slides.size() - 1);
    var current         = 0;
    var fade            = 'slow';
    var autoslide       = false;
    var interval        = 5000;
    var navigation      = false;
    var controle        = false;
    var timer           = null;

    for (var i in args) {
        args[i] = new String(args[i]);
    }

    if (typeof(args.fade) != 'undefined') {
        if (args.fade == 'slow') {
            fade = 'slow';
        }

        if (args.fade == 'fast') {
            fade = 'fast';
        }

        if (args.fade.match(/^\d+$/)) {
            fade = parseInt(args.fade);
        }
    }

    if (typeof(args.autoslide) != 'undefined') {
        if (args.autoslide == 'true') {
            autoslide = true;
        }
    }

    if (typeof(args.interval) != 'undefined') {
        if (args.interval.match(/^\d+$/)) {
            interval = parseInt(args.interval);
        }
    }

    if (typeof(args.navigation) != 'undefined') {
        if (args.navigation == 'true') {
            navigation = true;
        }
    }

    if (typeof(args.controle) != 'undefined') {
        if (args.controle == 'true') {
            controle = true;
        }
    }

    if (last >= 1) {
        slides.each(function(i) { if (i >= 1) { $(this).hide(); } });

        if (autoslide === true) {
            setAutoslider();
        }

        if (navigation === true) {
            defineNavigator();
        }

        if (controle === true) {
            defineController();

            $(controller).find('div.dd_slider_controller_forward').click(function(){
                forward();
                direction = 'forward';

                if (autoslide === true) {
                    setAutoslider();
                }

                return false;
            });

            $(controller).find('div.dd_slider_controller_backward').click(function(){
                backward();
                direction = 'backward';

                if (autoslide === true) {
                    setAutoslider();
                }

                return false;
            });
        }
    }

    function defineNavigator()
    {
        
        if ($(slider).find('div.dd_slider_navigator').size() == 0) {
            $(slider).append('<div class="dd_slider_navigator"></div>');
        }

        navigator = $(slider).find('div.dd_slider_navigator')[0];

        for (point = 0; point <= last; point++) {
            $(navigator).append('<div class="point" id="dd_slider_navigator_point_' + point  + '">' + '<span>' + point  + '</span>' + '</div>');

            $('#dd_slider_navigator_point_' + point).click(function(){
                var pieces  = $(this).attr('id').split('_');
                var number  = (pieces[(pieces.length-1)]);

                locator(number);
            });
        }

        points = $(navigator).find('div.point');

        $(points[current]).addClass('active');
    }

    function defineController()
    {
        if ($(slider).find('div.dd_slider_controller').size() == 0) {
            $(slider).append('<div class="dd_slider_controller"></div>');
        }

        controller = $(slider).find('div.dd_slider_controller')[0];

        $(controller).append('<div class="dd_slider_controller_backward"><span>backward</span></div>');
        $(controller).append('<div class="dd_slider_controller_forward"><span>forward</span></div>');
    }

    function setAutoslider()
    {
        clearInterval(timer);

        if (direction == 'backward') {
            timer = setInterval(backward, interval);
        } else {
            timer = setInterval(forward, interval);
        }
    }

    function forward() {
        var previous = current;

        if (current == last) {
            current = 0;
        } else {
            current++;
        }

        $(slides[previous]).hide();
        $(slides[current]).fadeIn(fade);

        showPoint(previous, current);
    }

    function backward() {
        var previous = current;

        if (current == first) {
            current = last;
        } else {
            current--;
        }

        $(slides[previous]).hide();
        $(slides[current]).fadeIn(fade);

        showPoint(previous, current);
    }

    function locator(point) {
        previous    = current;
        current     = point;

        $(slides[previous]).hide();
        $(slides[current]).fadeIn(fade);

        showPoint(previous, current);
    }

    function showPoint(previous, current)
    {
        if (typeof(points) != 'undefined') {
            $(points[previous]).removeClass('active');
            $(points[current]).addClass('active');
        }
    }

};