/*
 * jQuery Shifter 1.00
 * 
 * Copyright (c) 2010 Ondrej Skalicka
 *
 */
 
 jQuery.fn.shifter = function(options) {
  settings = jQuery.extend({
     leftSelector : '#shifter-left',
     middleSelector : '#shifter-middle',
     rightSelector : '#shifter-right',
     hiddenSelector: '#shifter-hidden',
     nextSelector : '#shifter-next',
     previousSelector : '#shifter-previous',
     firstClass : 'first',
     secondClass : 'second',
     rel : 'shifter-colorbox',
     loadProtection : false,
     step : 1,
     nextAuto : 2000,
     fadeTime : 500,
     imagePath : '',
     addSpan : false,
     smartList : false,
     titleList : [],
  }, options);
  
  var list;
  var fullList;
  var titleList;
  if (settings.smartList != false) {
    list = [];
    fullList = [];
    titleList = [];
    for (i = 0; i < settings.smartList.length; ++i) {
      fullList[i] = settings.smartList[i][0];
      list[i] = settings.smartList[i][1];
      titleList[i] = settings.smartList[i][2];
      
    }
  } else {
    list = settings.list;
    fullList = settings.fullList;
    titleList = settings.titleList;
  }
  var anchorList = [];
  var count = list.length;
  
  var step = settings.step;
  var fadeTime = settings.fadeTime;
  var counter = 0;
  var locked = 0;
  var timer = false;
  var imagePath = settings.imagePath;
  var loadProtection = settings.loadProtection;
  
  var timer = false;
  
  var left = $(settings.leftSelector);
  var middle = $(settings.middleSelector);
  var right = $(settings.rightSelector);
  var hidden = $(settings.hiddenSelector);
  var next = $(settings.nextSelector);
  var previous = $(settings.previousSelector);
  
  var firstClass = settings.firstClass;
  var secondClass = settings.secondClass;
  
  var useLeft = left.size() == 1;
  var useRight = right.size() == 1;
  
  // only middle and hidden are required, others are optional
  
  
  if (left.size() > 1 || middle.size() != 1 || right.size() > 1 || hidden.size() != 1) {
    //alert ('Shifter - Invalid specification'); // no error - if there is no place to put shifter, just ignore it
    return;
  }
  
  if (useLeft) left.empty();
  middle.empty();
  if (useRight) right.empty();
  hidden.empty();    
  
  if (settings.addSpan) {
    if (useLeft) left.append($('<span />'));
    middle.append($('<span />'));
    if (useRight) right.append($('<span />'));
  }
  
  for (i = 0; i < count; i++) {
    title = titleList[i] == undefined ? '' : titleList[i];
    var anch = $('<a />')
                .attr('rel', settings.rel)
                .attr('href', imagePath + fullList[i])
                .attr('title', title);
    anch.appendTo(hidden);
    if (loadProtection) locked ++; // start animations/enable buttons after all images are loaded, part 1
    var img = $('<img />')
                .attr('src', imagePath + list[i])
                .addClass(firstClass)
                .attr('alt', title)
                .load(function() {if (loadProtection) locked--;}); // start animations/enable buttons after all images are loaded, part 2
    img.appendTo(anch);
    anchorList[i] = anch;
  }
  
  if (useLeft) left.append(anchorList[0]).append($('<img />').attr('src', imagePath + list[0]).addClass(secondClass));
  middle.append(anchorList[1]).append($('<img />').attr('src', imagePath + list[1]).addClass(secondClass));
  if (useRight) right.append(anchorList[2]).append($('<img />').attr('src', imagePath + list[2]).addClass(secondClass));
  
  $("a[rel='" + settings.rel + "']").colorbox({onOpen:function(){locked ++;stopTimer()},onClosed:function(){locked--;startTimer()}, current:'{current}/{total}', previous:'Předchozí', next: 'Další', close: 'Zavřít'});  
  
  next.click(function(event){
    event.preventDefault();
    changeAll(step);
  });
  previous.click(function(event){
    event.preventDefault();
    changeAll(-step);
  });
  
  var executeTimer_ = function executeTimer () {
    changeAll(step);
    startTimer();
  }
  
  if (settings.nextAuto > 0) startTimer();
  
  function changeAll (diff) {
    if (locked > 0) {
      return;  
    }
    locked = 1;
    if (useLeft) locked++;
    if (useRight) locked++;
    
    counter = (counter + diff) % count;
    
    while (counter < 0) counter += count;
    
    var index1 = (counter + 1) % count;
    var index2 = (counter + 2) % count;
    
    if (useLeft) changeOne(settings.leftSelector, list[counter], anchorList[counter]);
    changeOne(settings.middleSelector, list[index1], anchorList[index1]);
    if (useRight) changeOne(settings.rightSelector, list[index2], anchorList[index2]);
  }
  
  function changeOne (containerSelector, newImgSrc, newBlock) {
  var first = $(containerSelector + ' img.' + firstClass);
  var second = $(containerSelector + ' img.' + secondClass);
  
  second.attr('src', imagePath + newImgSrc);
  
  first.fadeOut(fadeTime, function() {
    locked --;
    // remove old, show it
    var anchor = $(containerSelector + ' a');
    var anchorImg = $(containerSelector + ' img.' + firstClass);
    anchor.appendTo(hidden);
    anchorImg.show();
    
    newBlock.appendTo(containerSelector);
    var firstImg = $(containerSelector + ' img.' + firstClass);
    firstImg.stop(true, true); // stop its animation, trigger its fadeOut callback
    firstImg.show();
  });
}

  
  function startTimer () {
    if (timer != false) clearTimeout(timer);
    timer = setTimeout(executeTimer_, settings.nextAuto);
  }
  function stopTimer () {
    if (timer != false) clearTimeout(timer);
  }
}
