/*
 * jQuery Slideshow Plugin
 * Author (c) Miroslav Peterka - wiki@seznam.cz
 * 2011 (c) Xacti Group
 * @version 0.0.1
 */


;(function($) {

	$.fn.slideshow = function(option){

		var options={

      data:[],
        /*
        image: image src
        name: html text in tab
        link: [optional] open on click on image. not tab
        */
      speed:5000,
      animationSpeed:500,
      slices:25
		};
   
    return this.each(function(i,el){
			var slideshow = new slideshowClass( $(el),$.extend(options, option) );
    });
	}

		
	function slideshowClass(wall,options){
    this.wall=wall;
    this.tabs=null;
    this.link=null;
    this.image=null;
    this.current=0;
    this.timer=null;
    this.slicesCont=null;
    this.slices=[];
    this.slicesFinish=null;
		this.options=options;
    this.create();
		return this;
	}
	
	slideshowClass.prototype.create = function (){
    var self=this;
    
    if(this.options.data.length>1){
      this.tabs=$('<div class="slideshow-tabs" />');
      $.each(this.options.data,function(i,slide){
        $('<a href="#" class="slideshow-tab" />')
          .html(slide.name)
          .click(function(){
            self.showSlide(i);
            return false;
          })
          .appendTo(self.tabs);
      });

      this.wall.append(this.tabs);
      
      var top=(this.wall.height()-this.tabs.height())/2;
      this.tabs.css('top',top);

      this.createSlices();

    }


    this.image=$('<div class="slideshow-image" />').appendTo(this.wall);
    this.link=$('<a class="slideshow-link" href="" />').appendTo(this.wall);

    this.showSlide(this.current,true);


  }

	slideshowClass.prototype.showSlide = function (i,instant){
    if(i==null)i=this.getNext();

    var slide=this.options.data[i];
    
    var show=function(){
        this.image.css('background-image','url("'+slide.image+'")');
        if(slide.link)this.link.attr('href',slide.link).show();
        else this.link.hide();
    }

    if(this.tabs){
      var self=this;
      var tabs=this.tabs.find('.slideshow-tab');
      tabs.eq(this.current).removeClass('slideshow-tab-current');
      tabs.eq(i).addClass('slideshow-tab-current');

      clearTimeout(this.timer)


      var finish=function(){
        var self=this;
        show.call(self);
        clearTimeout(this.timer)
        this.timer=setTimeout(function(){self.showSlide()},this.options.speed);
      }
      
      if(!instant){
        this.animate(i,finish)
      }
      else finish.call(this);
      
      this.current=i;
    }
    else{
      show.call(this);
    }
   
  }

	slideshowClass.prototype.getNext = function (){
    var i=this.current+1;
    if(i>this.options.data.length-1)i=0;
    return i;
  }
  
  slideshowClass.prototype.animate = function (i,callback){

    if(this.slicesFinish){
      this.slicesFinish.call(this);
    }

    this.slicesCont.show();
    var slide=this.options.data[i];
    var timeForSlice=parseInt(this.options.animationSpeed/this.options.slices,10);
    var self=this;
    
    this.slicesFinish=function(){
      this.slicesFinish=null;
      this.slicesCont.hide();
      callback.call(this);
    }

    $.each(this.slices,function(i,slice){
      
      slice.el.stop().css({width:0,backgroundImage:'url('+slide.image+')','background-position':(slice.left*-1)+'px 100%'});
      var fce=function(){
        var finish=null;
        if(i==self.slices.length-1)finish=function(){
          if(self.slicesFinish)self.slicesFinish.call(self);
        };
        slice.el.animate({width:slice.width},400,finish);
      };
    
      clearTimeout(slice.timer);
      slice.timer=setTimeout(fce,i*timeForSlice);

    });

  };


  slideshowClass.prototype.createSlices=function(){
    this.slicesCont=$('<div class="slideshow-slices" />');
    var sliceWidth=Math.round(this.wall.width()/this.options.slices);
    for(var i=0;i<this.options.slices;i++){
      var w=sliceWidth;
      if((i+1)*sliceWidth>this.wall.width()){
        w=this.wall.width()-(i)*sliceWidth;
      }
      var l=i*sliceWidth;
      var slice=$('<div class="slideshow-slice" />').css({height:'100%',position:'absolute',bottom:0,left:l,width:w,backgroundRepeat:'no-repeat'}).appendTo(this.slicesCont);

      this.slices.push({width:w,left:l,el:slice,timer:null});

    }
    this.slicesCont.hide();
    this.wall.append(this.slicesCont);
  }


})(jQuery);





