/**
 * jqFancyTransitions - jQuery plugin
 * @version: 1.8 (2010/06/13)
 * @requires jQuery v1.2.2 or later
 * @author Ivan Lazarevic
 * Examples and documentation at: http://www.workshop.rs/projects/jqfancytransitions

 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
**/

(function($) {
   var opts = new Array;
   var level = new Array;
   var img = new Array;
   var links = new Array;
   var titles = new Array;
   var order = new Array;
   var imgInc = new Array;
   var inc = new Array;
   var stripInt = new Array;
   var imgInt = new Array;

   $.fn.jqFancyTransitions = $.fn.jqfancytransitions = function(options){

   init = function(el){

      opts[el.id] = $.extend({}, $.fn.jqFancyTransitions.defaults, options);
      img[el.id] = new Array(); // images array
      links[el.id] = new Array(); // links array
      titles[el.id] = new Array(); // titles array
      order[el.id] = new Array(); // strips order array
      imgInc[el.id] = 0;
      inc[el.id] = 0;

      params = opts[el.id];

      if(params.effect == 'zipper'){ params.direction = 'alternate'; params.position = 'alternate'; }
      if(params.effect == 'wave'){ params.direction = 'alternate'; params.position = 'top'; }
      if(params.effect == 'curtain'){ params.direction = 'alternate'; params.position = 'curtain'; }

      // width of strips
      stripWidth = parseInt(params.width / params.strips);
      gap = params.width - stripWidth*params.strips; // number of pixels
      stripLeft = 0;

      // create images and titles arrays
      $.each($('#'+el.id+' img'), function(i,item){
         img[el.id][i] = $(item).attr('src');
         links[el.id][i] = $(item).next().attr('href');
         titles[el.id][i] = $(item).attr('alt') ? $(item).attr('alt') : '';
         $(item).hide();
      });

      // set panel
      $('#'+el.id).css({
         'background-image':'url("'+img[el.id][0]+'")',
         'width': params.width,
         'height': params.height,
         'position': 'relative',
         'background-position': 'top left'
         });

      // create title bar
      $('#'+el.id).append("<div class='ft-title' id='ft-title-"+el.id+"' style='position: absolute; bottom:0; left: 0; z-index: 1000; color: #fff; background-color: #000; '>"+titles[el.id][0]+"</div>");
      if(titles[el.id][imgInc[el.id]])
         $('#ft-title-'+el.id).css('opacity',opts[el.id].titleOpacity);
      else
         $('#ft-title-'+el.id).css('opacity',0);

      if(params.navigation){
         $.navigation(el);
         $('#ft-buttons-'+el.id).children().first().addClass('ft-button-'+el.id+'-active');
      }

      odd = 1;
      // creating bars
      // and set their position
      for(j=1; j < params.strips+1; j++){

         if( gap > 0){
            tstripWidth = stripWidth + 1;
            gap--;
         } else {
            tstripWidth = stripWidth;
         }

         if(params.links)
            $('#'+el.id).append("<a href='"+links[el.id][0]+"' class='ft-"+el.id+"' id='ft-"+el.id+j+"' style='width:"+tstripWidth+"px; height:"+params.height+"px; float: left; position: absolute;outline:none;'></a>");
         else
            $('#'+el.id).append("<div class='ft-"+el.id+"' id='ft-"+el.id+j+"' style='width:"+tstripWidth+"px; height:"+params.height+"px; float: left; position: absolute;'></div>");

         // positioning bars
         $("#ft-"+el.id+j).css({
            'background-position': -stripLeft +'px top',
            'left' : stripLeft
         });

         stripLeft += tstripWidth;

         if(params.position == 'bottom')
            $("#ft-"+el.id+j).css( 'bottom', 0 );

         if (j%2 == 0 && params.position == 'alternate')
            $("#ft-"+el.id+j).css( 'bottom', 0 );

         // bars order
            // fountain
            if(params.direction == 'fountain' || params.direction == 'fountainAlternate'){
               order[el.id][j-1] = parseInt(params.strips/2) - (parseInt(j/2)*odd);
               order[el.id][params.strips-1] = params.strips; // fix for odd number of bars
               odd *= -1;
            } else {
            // linear
               order[el.id][j-1] = j;
            }

      }

         $('.ft-'+el.id).mouseover(function(){
            opts[el.id].pause = true;
         });

         $('.ft-'+el.id).mouseout(function(){
            opts[el.id].pause = false;
         });

         $('#ft-title-'+el.id).mouseover(function(){
            opts[el.id].pause = true;
         });

         $('#ft-title-'+el.id).mouseout(function(){
            opts[el.id].pause = false;
         });

      clearInterval(imgInt[el.id]);
      imgInt[el.id] = setInterval(function() { $.transition(el)  }, params.delay+params.stripDelay*params.strips);

   };

   // transition
   $.transition = function(el,direction){

      if(opts[el.id].pause == true) return;

      stripInt[el.id] = setInterval(function() { $.strips(order[el.id][inc[el.id]], el)  },opts[el.id].stripDelay);

      $('#'+el.id).css({ 'background-image': 'url("'+img[el.id][imgInc[el.id]]+'")' });

      if(typeof(direction) == "undefined")
         imgInc[el.id]++;
      else
         if(direction == 'prev')
            imgInc[el.id]--;
         else
            imgInc[el.id] = direction;

      if  (imgInc[el.id] == img[el.id].length) {
         imgInc[el.id] = 0;
      }

      if (imgInc[el.id] == -1){
         imgInc[el.id] = img[el.id].length-1;
      }

      if(titles[el.id][imgInc[el.id]]!=''){
         $('#ft-title-'+el.id).animate({ opacity: 0 }, opts[el.id].titleSpeed, function(){
            $(this).html(titles[el.id][imgInc[el.id]]).animate({ opacity: opts[el.id].titleOpacity }, opts[el.id].titleSpeed);
         });
      } else {
         $('#ft-title-'+el.id).animate({ opacity: 0}, opts[el.id].titleSpeed);
      }

      inc[el.id] = 0;

      buttons = $('#ft-buttons-'+el.id).children();

      buttons.each(function(index){
         if(index == imgInc[el.id]){
            $(this).addClass('ft-button-'+el.id+'-active');
         } else{
            $(this).removeClass('ft-button-'+el.id+'-active');
         }
      });

      if(opts[el.id].direction == 'random')
         $.fisherYates (order[el.id]);

      if((opts[el.id].direction == 'right' && order[el.id][0] == 1)
         || opts[el.id].direction == 'alternate'
         || opts[el.id].direction == 'fountainAlternate')
            order[el.id].reverse();
   };


   // strips animations
   $.strips = function(itemId, el){

      temp = opts[el.id].strips;
      if (inc[el.id] == temp) {
         clearInterval(stripInt[el.id]);
         return;
      }
      $('.ft-'+el.id).attr('href',links[el.id][imgInc[el.id]]);
      if(opts[el.id].position == 'curtain'){
         currWidth = $('#ft-'+el.id+itemId).width();
         $('#ft-'+el.id+itemId).css({ width: 0, opacity: 0, 'background-image': 'url("'+img[el.id][imgInc[el.id]]+'")' });
         $('#ft-'+el.id+itemId).animate({ width: currWidth, opacity: 1 }, 1000);
      } else {
         $('#ft-'+el.id+itemId).css({ height: 0, opacity: 0, 'background-image': 'url("'+img[el.id][imgInc[el.id]]+'")' });
         $('#ft-'+el.id+itemId).animate({ height: opts[el.id].height, opacity: 1 }, 1000);
      }

      inc[el.id]++;

   };

   // navigation
   $.navigation = function(el){
      // create prev and next
      $('#'+el.id).append("<a href='#' id='ft-prev-"+el.id+"' class='ft-prev'>prev</a>");
      $('#'+el.id).append("<a href='#' id='ft-next-"+el.id+"' class='ft-next'>next</a>");
      $('#ft-prev-'+el.id).css({
         'position'  : 'absolute',
         'top'    : params.height/2 - 15,
         'left'      : 0,
         'z-index'   : 1001,
         'line-height': '30px',
         'opacity'   : 0.7
      }).click( function(e){
         e.preventDefault();
         $.transition(el,'prev');
         clearInterval(imgInt[el.id]);
         imgInt[el.id] = setInterval(function() { $.transition(el)  }, params.delay+params.stripDelay*params.strips);
      });

      $('#ft-next-'+el.id).css({
         'position'  : 'absolute',
         'top'    : params.height/2 - 15,
         'right'     : 0,
         'z-index'   : 1001,
         'line-height': '30px',
         'opacity'   : 0.7
      }).click( function(e){
         e.preventDefault();
         $.transition(el);
         clearInterval(imgInt[el.id]);
         imgInt[el.id] = setInterval(function() { $.transition(el)  }, params.delay+params.stripDelay*params.strips);
      });

      // image buttons
      $("<div id='ft-buttons-"+el.id+"'></div>").insertAfter($('#'+el.id));
      $('#ft-buttons-'+el.id).css({
         'text-align'   : 'right',
         'padding-top'  : 5,
         'width'        : opts[el.id].width
      });
      for(k=1;k<img[el.id].length+1;k++){
         $('#ft-buttons-'+el.id).append("<a href='#' class='ft-button-"+el.id+"'>"+k+"</a>");
      }
      $('.ft-button-'+el.id).css({
         'padding'   : 5
      });

      $.each($('.ft-button-'+el.id), function(i,item){
         $(item).click( function(e){
            e.preventDefault();
            $.transition(el,i);
            clearInterval(imgInt[el.id]);
            imgInt[el.id] = setInterval(function() { $.transition(el)  }, params.delay+params.stripDelay*params.strips);
         })
      });
   }



   // shuffle array function
   $.fisherYates = function(arr) {
     var i = arr.length;
     if ( i == 0 ) return false;
     while ( --i ) {
        var j = Math.floor( Math.random() * ( i + 1 ) );
        var tempi = arr[i];
        var tempj = arr[j];
        arr[i] = tempj;
        arr[j] = tempi;
      }
   }

   this.each (
      function(){ init(this); }
   );

};

   // default values
   $.fn.jqFancyTransitions.defaults = {
      width: 500, // width of panel
      height: 332, // height of panel
      strips: 10, // number of strips
      delay: 5000, // delay between images in ms
      stripDelay: 50, // delay beetwen strips in ms
      titleOpacity: 0.7, // opacity of title
      titleSpeed: 1000, // speed of title appereance in ms
      position: 'alternate', // top, bottom, alternate, curtain
      direction: 'fountainAlternate', // left, right, alternate, random, fountain, fountainAlternate
      effect: '', // curtain, zipper, wave
      navigation: false, // prev next and buttons
      links : false // show images as links
   };

})(jQuery);

