/*
 *        faded 0.3.1 - jQuery plugin
 *        written by Nathan Searles
 *        http://nathansearles.com/faded/
 *
 *        Copyright (c) 2009 Nathan Searles (http://nathansearles.com/)
 *        Dual licensed under the MIT (MIT-LICENSE.txt)
 *        and GPL (GPL-LICENSE.txt) licenses.
 *
 *        Built for jQuery library
 *        http://jquery.com
 *        Compatible with jQuery 1.3.2+
 *
 */
if(typeof jQuery != "undefined") {
        jQuery(function($) {
                $.fn.extend({
                        faded: function(options) {
                                var settings = $.extend({}, $.fn.faded.defaults, options);
                                return this.each(
                                        function() {
                                                if($.fn.jquery < "1.3.1") {return;}
                                                var $t = $(this);
                                                var $c = $t.children(":nth-child(1)");
                                                var o = $.metadata ? $.extend({}, settings, $t.metadata()) : settings;
                                                var total = $c.children().size();
                                                var next = 0, prev = 0, number = 0, currentitem = 0, restart = 0, restartinterval = 0;
                                                var loaded,active,imgSrc,clicked,current;
                                                if (o.random) {
                                                        $.fn.reorder = function(callback) {
                                                                function randOrd() { return(Math.round(Math.random())-0.5); }
                                                                        return($(this).each(function() {
                                                                        var $this = $(this);
                                                                        var $children = $this.children();
                                                                        var childCount = $children.length;
                                                                        if (childCount > 1) {
                                                                                $children.hide();
                                                                                var indices = new Array();
                                                                                for (i=0;i<childCount;i++) { indices[indices.length] = i; }
                                                                                indices = indices.sort(randOrd);
                                                                                $.each(indices,function(j,k) {
                                                                                        var $child = $children.eq(k);
                                                                                        var $clone = $child.clone(true);
                                                                                        $clone.show().appendTo($this);
                                                                                        if (callback !== undefined) {
                                                                                                callback($child, $clone);
                                                                                        }
                                                                                $child.remove();
                                                                        });
                                                                        }
                                                                }));
                                                        };
                                                        $c.reorder();
                                                }
                                                function pause() {
                                                        clearInterval(autoplay);
                                                        clearTimeout(restart);
                                                        restart = setTimeout(function() {
                                                                autoplay = setInterval(function(){
                                                                        animate("next");
                                                                },o.autoplay);
                                                        },o.autorestart);
                                                }
                                                $c.css({position:"relative"});
                                                $c.children().css({
                                                        position:"absolute",
                                                        top: 0,
                                                        left: 0,
                                                        zIndex: 0,
                                                        display:"none"
                                                 });
                                                if (o.autoheight) {
                                                        $c.animate({height: $c.children(":eq(0)").outerHeight()},o.autoheight);
                                                }
                                                if (o.pagination) {
                                                        if (o.autopagination) {
                                                                $t.append("<ul class="+o.pagination+"></ul>");
                                                                $c.children().each(function(){
                                                                        $("."+o.pagination+"",$t).append("<li><a rel="+number+" href=\"#\" >"+(number+1)+"</a></li>");
                                                                        number++;
                                                                });
                                                        }
                                                        $("."+o.pagination+" li a:eq(0)",$t).parent().addClass("current");
                                                        $("."+o.pagination+" li a",$t).click(function(){
                                                                current = $("."+o.pagination+" li.current a",$t).attr("rel");
                                                                clicked = $(this).attr("rel");
                                                                if (current != clicked) {animate("pagination",clicked,current);}
                                                                if(o.autoplay){pause();}
                                                                return false;
                                                        });
                                                }
                                                if (o.sequentialloading&&$c.children()[0].tagName=="IMG") {
                                                        $c.css({background:"url("+o.loadingimg+") no-repeat 50% 50%"});
                                                        imgSrc = $("img:eq(0)",$c).attr("src");
                                                        $("img:eq(0)",$c).attr("src", imgSrc).load(function() {
                                                                $(this).fadeIn(o.speed,function(){
                                                                        loaded = true;
                                                                });
                                                        });
                                                } else {
                                                        $c.find(":eq(0)").fadeIn(o.speed,function(){
                                                                loaded = true;
                                                        });
                                                }
                                                if (o.bigtarget) {
                                                        $c.css({"cursor":"pointer"});
                                                        $c.click(function(){
                                                                animate("next");
                                                                if(o.autoplay){
                                                                        if (o.autorestart) {
                                                                                pause();
                                                                        } else {
                                                                                clearInterval(autoplay);
                                                                        }
                                                                }
                                                                return false;
                                                        });
                                                }
                                                if (o.autoplay) {
                                                        autoplay = setInterval(function(){
                                                                animate("next");
                                                        },o.autoplay);
                                                        pause();
                                                }
                                                $("."+o.nextbtn,$t).click(function(){
                                                        animate("next");
                                                        if(o.autoplay){
                                                                if (o.autorestart) {
                                                                        pause();
                                                                } else {
                                                                        clearInterval(autoplay);
                                                                }
                                                        }
                                                        return false;
                                                });
                                                $("."+o.prevbtn,$t).click(function(){
                                                        animate("prev");
                                                        if(o.autoplay){
                                                                if (o.autorestart) {
                                                                        pause();
                                                                } else {
                                                                        clearInterval(autoplay);
                                                                }
                                                        }
                                                        return false;
                                                });
                                                function animate(dir,clicked,current){
                                                        if (!active&&loaded) {
                                                                active=true;
                                                                switch(dir) {
                                                                        case "next":
                                                                                prev = next;
                                                                                next = currentitem*1+1;
                                                                                if (total === next) { next = 0; }
                                                                        break;
                                                                        case "prev":
                                                                                prev = next;
                                                                                next = currentitem*1-1;
                                                                                if (next === -1) { next = total-1; }
                                                                        break;
                                                                        case "pagination":
                                                                                next = clicked;
                                                                                prev = current;
                                                                        break;
                                                                }
                                                                if (o.pagination) {
                                                                        $(".pagination li.current",$t).removeClass("current");
                                                                        $(".pagination li a:eq("+next+")",$t).parent().addClass("current");
                                                                }
                                                                if (o.crossfade) {
                                                                        $c.children(":eq("+next+")").css({zIndex:10}).fadeIn(o.speed,function(){
                                                                                $c.children(":eq("+prev+")").css({display:"none",zIndex:0});
                                                                                $(this).css({zIndex:0});
                                                                                currentitem = next;
                                                                                active = false;
                                                                        });
                                                                } else {
                                                                        $c.children(":eq("+prev+")").fadeOut(o.speed,function(){
                                                                                if (o.autoheight) {
                                                                                        $c.animate({height: $c.children(":eq("+next+")").outerHeight()},o.autoheight,function(){
                                                                                                $c.children(":eq("+next+")").fadeIn(o.speed);
                                                                                        });
                                                                                } else {
                                                                                        $c.children(":eq("+next+")").fadeIn(o.speed);
                                                                                }
                                                                                currentitem = next;
                                                                                active = false;
                                                                        });
                                                                }
                                                        }
                                                }
                                        }
                                );
                                }
                });
                $.fn.faded.defaults = {
                        speed: 300,
                        crossfade: false,
                        bigtarget: false,
                        sequentialloading: false,
                        autoheight: false,
                        pagination: "pagination",
                        autopagination: true,
                        nextbtn: "next",
                        prevbtn: "prev",
                        loadingimg: false,
                        autoplay: false,
                        autorestart: false,
                        random: false
                };
        });
}
