//scroll back, next widht pages
//-> mootools 1.2dev 


ScrollPages = new Class ({

	options: {
       wait: false, //!
	   scrollSteps: false, //only if no pages!
       durfactor: 150,
       duration: 550,
       //transition: Fx.Transitions.linear,
       transition: Fx.Transitions.Quad.easeInOut,
       startAt: 1,
       pagesrange: 5
	},
	
	initialize: function (element, options) {
	
        this.setOptions (options);
        this.element = $(element);
        this.box    = this.element.getElement('.mask');
        this.items  = this.box.getElements('li');

        this.swback = this.element.getElement('.leftarrow');
        this.swnext = this.element.getElement('.rightarrow');
              
        this.pages  = false; //ul/dom
        this.lipages = [];
        this.ipages = false; //all/int
        this.pagenum = false; //current
        
        this.itemsInBox = this.itemsInBox.bind(this);
        this.jumpTo     = this.jumpTo.bind(this);
        this.moveTo     = this.moveTo.bind(this);
        this.switchBack = this.switchBack.bind(this);
        this.switchNext = this.switchNext.bind(this);
        this.toPage     = this.toPage.bind(this);
        
        this.seeinbox = this.itemsInBox(); //pos,len(anzahl)
        
        this.options.offset = {
            'x': -(this.items[0].getStyle('margin-left').toInt() + this.box.getStyle('padding-left').toInt()), 
            'y': -(this.items[0].getStyle('margin-top').toInt() + this.box.getStyle('padding-top').toInt())
        };
      
        if (this.seeinbox.len>-1) 
        {
          this.setupPages(); //navpages
          if (!this.ipages && !this.options.scrollSteps) this.options.scrollSteps = this.seeinbox.len; //non navpages
        
          //this.parent (this.box, this.options); //nicht this.element!
          this.scroller = new Fx.Scroll (this.box, this.options);
          
          this.swnext.addEvent ('mousedown', this.switchNext);
          this.swback.addEvent ('mousedown', this.switchBack);
        
          //anfangs sequenz
          this.moveTo (6); //?  
          var at = this.options.startAt-1;
          var move = this.moveTo;
          var starton = function () {move(at)};
          (function(){starton()}).delay(300);
        }
	},
	
	
	// switchers
    //<<
    switchBack: function () {
        if (this.pagenum===false) this.moveTo (this.seeinbox.pos - this.options.scrollSteps);
        else this.toPage (this.pagenum-1);
    },
    
    //>>
    switchNext: function () {
        if (this.pagenum===false) this.moveTo (this.seeinbox.pos + this.options.scrollSteps); 
        else this.toPage (this.pagenum+1); 
    },
    
    //num
    moveTo: function (num) {
        if (num<0) num=0;
        if (num>=this.items.length) num = this.items.length-1;
        this.setDuration (num-this.seeinbox.pos);
        this.scroller.toElement(this.items[num]);
        this.seeinbox.pos = num;       
    },
    
    //num
    jumpTo: function (num) {
        if (num<0) num=0;
        if (num>>this.items.length) num = this.items.length;   
        var dur = this.options.duration; //error
        this.options.duration = 0;
        this.scroller.toElement(this.items[num]);
        this.options.duration = dur;
        this.seeinbox.pos = num;
    },
	
	setDuration: function (stretch) {
        if (stretch<0) stretch=0-stretch;
        this.options.duration = this.options.durfactor * stretch;
    },
    
    //ooo
    setupPages: function () {

        this.pages = this.element.getElement('.pagenav');
        if (!this.pages) return false;
        this.pagenum = 0;
        var li = this.pages.getElement('li');
        var a;
        var apages = []; apages.push(li);
        this.ipages = (this.items.length/this.seeinbox.len +0.49).round();
        var toPage = this.toPage;
        li.value=0;
        li.getElement('a').innerHTML = 1;
        
        li.addEvent('click', function (e) { toPage (new Event(e).target); });
        this.lipages.push(li);     
          
        for (var i=1; i<this.ipages; i++) {
            if (i>this.options.pagesrange) break;
            
            apages.push (li.clone());
            li = apages.getLast();
            a = li.getElement('a');
            li.value = i;
            a.removeClass('active');
            a.setHTML(i+1); 
            this.pages.adopt (apages.getLast());  

            a.addEvent('click', function (e) {
                toPage (new Event(e).target);
            });
            this.lipages.push(li); 
        }
        
        //li.addClass('big');
        a.innerHTML = this.ipages;//-1;
        //apages.getLast().addClass('big');        
    },
    
    toPage: function (target) {    

        if (!this.pages) return;
        var lis = this.lipages; //$(this.pages.getChildren();          
        var pos, page; 
        $type(target)=='number' ? pos = target.limit(0,this.ipages-1) : page = target; 
        //console.log (target,pos,page);
        
        if ($chk(pos)) {
            for (i=0; i<lis.length; i++) {
                if (pos==lis[i].getProperty('value')) page = lis[i].getElement('a');
            }
        }
        else pos = page.getParent().value;//getText()-1;        
        
        if (this.pages.getElement('.active')) 
            this.pages.getElement('.active').removeClass('active');
        
        if (lis.length == this.options.pagesrange+1) {

            var page1 = (num-this.options.pagesrange/2).limit(0,this.ipages-1);
            if (page1 > this.ipages-this.options.pagesrange-1) page1 = this.ipages-this.options.pagesrange-1;
            for (var i=1; i<this.options.pagesrange; i++) {            
                var set = page1 + i;
                if (set<1 || set>this.ipages-2) lis[i].setStyle('display','none');
                else lis[i].setStyle('display','block');
                if (set==pos) lis[i].getElement('a').addClass('active');
                lis[i].getElement('a').innerHTML = set; 
            }
            if (pos==0) lis[0].getElement('a').addClass('active');
            if (pos==this.ipages-1) lis.getLast().getElement('a').addClass('active');
                        
        } else page.addClass('active');

        this.moveTo(pos*this.seeinbox.len);
        this.pagenum = pos;
    },
    
    	
    itemsInBox: function shownItems () { 
        var seeitems = {pos:-1, len:-1};      
        for (var num=0; num<this.items.length; num++) {
            if (seeitems.pos<0) { 
                if (this.isVisible (this.items[num],this.box)) 
                    seeitems.pos=num;
            } 
            else if (!this.isVisible(this.items[num],this.box)) {
                seeitems.len = num-seeitems.pos;
                return seeitems;
            }
        }
        return seeitems;
    },
    
    //check if item/items is actually visible
	
    isVisible: function (item, box) { //not overflown
    
        var ic = item.getCoordinates(); 
        var bc = box.getCoordinates();      
        if (ic.left     >= bc.left)
        if (ic.right    <= bc.right)
        if (ic.top      >= bc.top)
        if (ic.bottom   <= bc.bottom)
            return true;
        return false;
    }    
});

ScrollPages.implement(new Events, new Options);

