var noobSlide=new Class({
    initialize:function(a) {
        this.items=a.items;
        this.mode=a.mode||'horizontal';
        this.modes={
            horizontal:['left','width'],
            vertical:['top','height']
        };
        this.size=a.size||240;
        this.box=a.box.setStyle(this.modes[this.mode][1],(this.size*this.items.length)+'px');
        this.button_event=a.button_event||'click';
        this.handle_event=a.handle_event||'click';
        this.onWalk=a.onWalk||null;
        this.currentIndex=null;
        this.previousIndex=null;
        this.nextIndex=null;
        this.interval=a.interval||5000;
        this.autoPlay=a.autoPlay||false;
        this._play=null;
        this.handles=a.handles||null;
        if(this.handles) {
            this.addHandleButtons(this.handles)
        }
        this.buttons={
            previous:[],
            next:[],
            play:[],
            playback:[],
            stop:[]
        };
        if(a.addButtons) {
            for(var b in a.addButtons) {
                this.addActionButtons(b,$type(a.addButtons[b])=='array'?a.addButtons[b]:[a.addButtons[b]])
            }
        }
        this.fx=new Fx.Tween(this.box,$extend((a.fxOptions||{duration:500,wait:false}),{property:this.modes[this.mode][0]}));
        this.walk((a.startItem||0),true,true)
    },
    addHandleButtons:function(a) {
        for(var i=0;i<a.length;i++) {
            a[i].addEvent(this.handle_event,this.walk.bind(this,[i,true]))
        }
    },
    addActionButtons:function(a,b) {
        for(var i=0;i<b.length;i++) {
            switch(a) {
            case'previous':
                b[i].addEvent(this.button_event,this.previous.bind(this,[true]));
                break;
            case'next':
                b[i].addEvent(this.button_event,this.next.bind(this,[true]));
                break;
            case'play':
                b[i].addEvent(this.button_event,this.play.bind(this,[this.interval,'next',false]));
                break;
            case'playback':
                b[i].addEvent(this.button_event,this.play.bind(this,[this.interval,'previous',false]));
                break;
            case'stop':
                b[i].addEvent(this.button_event,this.stop.bind(this));
                break
            }
            this.buttons[a].push(b[i])
        }
    },
    previous:function(a) {
        this.walk((this.currentIndex>0?this.currentIndex-1:this.items.length-1),a)
    },
    next:function(a) {
        this.walk((this.currentIndex<this.items.length-1?this.currentIndex+1:0),a)
    },
    play:function(a,b,c) {
        this.stop();
        if(!c) {
            this[b](false)
        }
        this._play=this[b].periodical(a,this,[false])
    },
    stop:function(){ 
        $clear(this._play)
    },
    walk:function(a,b,c) {
        if(a[1] != undefined) a=a[0];
        if(a!=this.currentIndex) {
            this.currentIndex=a;
            this.previousIndex=this.currentIndex+(this.currentIndex>0?-1:this.items.length-1);
            this.nextIndex=this.currentIndex+(this.currentIndex<this.items.length-1?1:1-this.items.length);
            if(b){
                this.stop()
            }
            if(c) {
                this.fx.cancel().set((this.size*-this.currentIndex)+'px')
            } else { 
                this.fx.start(this.size*-this.currentIndex)
            }
            if(b&&this.autoPlay) {
                this.play(this.interval,'next',true)
            }
            if(this.onWalk) {
                this.onWalk((this.items[this.currentIndex]||null),(this.handles && this.handles[this.currentIndex]?this.handles[this.currentIndex]:null))
            }
        }
    }
});
