function Slider(ID,args){
    var id = ID;
    var container = $(ID);
    var pic_cnt = 0;
    var total_pic_cnt = 0;
    var timeout_id = 0;
    var loader = null;
    var loaderUrl = "";
    var loaderSize = ""; // e.g. 16x16
    var beforeRun = function(){};
    var startRandom = false;
    var waitForAll = false;
    var running = false;
    var numPicsLoaded = 0;

    var duration = 1000;// 1s
    var timeout = 10000;// 10s

    if(args){
        if(args.duration && Number(args.duration)){duration = args.duration}
        if(args.timeout && Number(args.timeout)){timeout = args.timeout}
        if(args.loaderUrl){loaderUrl = args.loaderUrl}
        if(args.loaderSize){loaderSize = args.loaderSize}
        if(args.startRandom){startRandom = args.startRandom;}
        if(args.beforeRun){beforeRun = args.beforeRun}
        if(args.waitForAll){waitForAll = args.waitForAll}
    }

    var pic_containers = [];

    this.getContainer = function(){
        return container;
    }

    var init = function(){

        // while initiating show ajax loader
        if(loaderUrl != ""){
            loader = createLoader();
            container.append(loader);
            showLoader();
        }

        pic_containers = container.find('.pic-container');
        pic_containers.hide();
        total_pic_cnt = pic_containers.length;

        var imgs = container.find('.pic-container img');
        imgs.each(function(){
            this.onload = function(){
                numPicsLoaded++;
                if(numPicsLoaded == total_pic_cnt && !running){
                    go();
                }
            }
        });


    }

    this.start = function(){
        init();
        if(!waitForAll){
            go();
        }
    }

    var go = function(){
        running = true;

        if(loader)hideLoader();

        beforeRun(container);


        if(startRandom){
            pic_cnt = Math.floor(Math.random() * total_pic_cnt);
        }
        actual().show();
        run_delayed();
    }

    this.stop = function(){
        running = false;
        window.clearTimeout(timeout_id);
    }

    var run = function(){

        var actualPic = actual();
        var nextPic = next();

        //console.log("before show")
        nextPic.fadeIn(duration);
        //console.log("after show/before hide")
        actualPic.fadeOut(duration);
        //console.log("after hide")

        run_delayed();
    }

    var run_delayed = function(){
        timeout_id = window.setTimeout(run,timeout);
    }


    var next = function(){
        pic_cnt++;
        pic_cnt = pic_cnt % total_pic_cnt;
        return $(pic_containers[pic_cnt]);
    }

    var actual = function(){
        return  $(pic_containers[pic_cnt]);
    }

    var createLoader = function(){

        var loader = $("<img>");
        loader.attr('src',loaderUrl);
        loader.attr('title',"");
        var top;
        var left;

        if(loaderSize != "" && loaderSize.indexOf("x") != -1){
            var size = loaderSize.split("x");

            top = (container.height() - Number(size[0])) / 2;
            left = (container.width() - Number(size[1])) / 2;

        }else{// size not given => render loader and grab size
            var div = $('<div>');
            div.css('position:absolute;height:1px;width:1px;overflow:hidden;');
            div.append(loader);
            $('body').append(div);

            top = (container.height() - loader.height()) / 2;
            left = (container.width() - loader.width()) / 2;

            div.remove();
        }

        loader.css({top:top,left:left,position:'absolute'});
        loader.hide();

        return loader;
    }

    var showLoader=function(){loader.show();}
    var hideLoader=function(){loader.hide();}

}


$(document).ready(function() {
    var slidy = new Slider('#slider-container',{duration: 1000,timeout:10000,startRandom:true});
    slidy.start();
});

