(function($) {

    $.guide = {
    };

    $.fn.extend({
        guide: function($elements, width, height, first_index, speed) {
            if (!first_index)
                first_index = 0;
            if (!speed)
                speed = 500;

            var $current = $elements[first_index];
            var self = $(this);
            
            function calculate_position(name) {
                if ($current.is("#"+name))
                    return 0;
                
                var e = $("#"+name);
                
                for(var i = 0; i<$elements.length; i++) {
                    if (e.attr("id") == $elements[i].attr("id")) {
                        return -1;
                    } else if ($current.attr("id") == $elements[i].attr("id")) {
                        return 1;
                    }
                }
                return 0;
            }

            function wrap_block(data) {
                var html = "<div style='position: absolute; width: 1800px;'>";
                jQuery.each(data, function(i,e) {html += "<div style='float: left; width: 900px;'>" + e + "</div>";})
                html += "</div>";
                return html;
            }

            function transfert_to(name) {
                var $e = $("#"+name);
                var pos = calculate_position(name);
                log("pos="+pos);
                var point = self.children("div").children("div");
                switch(pos)
                {
                    case 0:
                        point.html(wrap_block([$e.html()]));
                        point.children("div").css({left: "0px"});
                        break;
                    case 1:
                        point.html(wrap_block([$current.html(), $e.html()]));
                        point.children("div").css({left: "0px"});
                        point.children("div").animate({left: "-" + width}, speed);
                        break;
                    case -1:
                        point.html(wrap_block([$e.html(), $current.html()]));
                        point.children("div").css({left: "-"+width});
                        point.children("div").animate({left: "0px"}, speed);
                        break;
                }
                
                    point.find("a").map(function(i,e) {
                            var ref = $(e).attr("href");
                            if (ref && ref.indexOf("#")!=-1) {
                                $(e).click(function() {
                                    var tag = $(this).attr("href").substr($(this).attr("href").indexOf("#")+1);
                                    transfert_to(tag);
                                    return false;
                                });
                            }
                    });

                    $current = $e;
                }

            for(var i = 0; i<$elements.length; i++) {
                var $e = $elements[i];
                $e.hide();
            }

            $(this).css("width", ""+width).css("height", ""+height).css("overflow", "hidden").css("position", "relative");
            $(this).html("<div style='width:20000em; position: absolute;'><div style='width:20000em; position: absolute;'></div></div>");
            transfert_to($current.attr("id"));
            
            return this;
        }
    });
    
})(jQuery);
