/******************************************************
    * transitions [transType, easing, startOpacity, startRatio, animationTime]
    * transType: slideLeft/slideRight/slideUp/slideDown/blend/none
    * easing: http://matthewlein.com/experiments/easing.html
    * startOpacity: 0 - 1
    * startRatio 0 - nekonecno    
    * animationTime 0 - nekonecno nekonecen         
******************************************************/

var transitions = [];
transitions[1] = ["blend", "easeOutSine", 0, 1.5, 700]; //auto slide
transitions[2] = ["slideRightBack", "easeInOutExpo", 0, 0, 1000]; //prev
transitions[3] = ["slideRight", "easeInOutExpo", 0, 0, 1000];  //next



var autoSlide = true;
var autoSlideTime = 3500;
var bgDir = "img/";
  
/*******************************************************/  


var animatingFoto = false;
var animatingLogo = false;
var imgIndex = 0;
var lastImgIndex = 0;
var actualBackDiv;
var lastBackDiv;
var firstPic = true;
var transIndex = 1;
var slideImgs = [];

/////// INIT ///////

$(document).ready(function(){
  loadXML();  
  $("#logo").mouseenter(function() {
    if(!animatingLogo){
      $("#info").animate({"left": 150, "opacity": 1}, 700, "easeInOutExpo").delay(10000).animate({"left": -860, "opacity": 0}, 700, "easeInOutExpo", function(){animatingLogo = false;});
      animatingLogo = true;
    }
  })  
});

$(window).resize(function(){
  resize();    
});

  
  
/////// PUBLIC METHODS ///////

function next(tt,auto){
  autoSlide = auto;
  if(animatingFoto){
    return;
  }
  transIndex = tt;
  lastImgIndex = imgIndex;
  if(imgIndex + 1 < slideImgs.length){
    imgIndex++
  }else{ 
    imgIndex = 0;
  }
  loadImg();  
}

function prev(tt,auto){
  autoSlide = auto;
  if(animatingFoto){
    return;
  }
  transIndex = tt;
  lastImgIndex = imgIndex;
  if(imgIndex > 0){
    imgIndex--
  }else{ 
    imgIndex = slideImgs.length - 1;
  }
  loadImg();  
}

/////// EVENT LISTENERS ///////

function resize(){  
  var newArray = calculateResize(slideImgs[imgIndex][1], slideImgs[imgIndex][2], $(window).width(), $(window).height())
  actualBackDiv.children('img').css({"width"  : newArray["width"], "height" : newArray["height"]});
  actualBackDiv.css({"top"  : newArray["top"], "left" : newArray["left"]});  
}

function animationFinished(){
  animatingFoto = false;  
  if(imgIndex != lastImgIndex){
    lastBackDiv.remove();
  } 
  if(autoSlide){
    setTimeout(nextSlideAuto, autoSlideTime);
  } 
}

function nextSlideAuto(){
  if(autoSlide){
    next(1, autoSlide);
  }
}

/////// PRIVATE METHODS ///////

function loadXML(){
  $.ajax({
          type: "GET",
  	url: bgDir + "index.php",
  	dataType: "xml",
  	success: function(xml){
      $(xml).find('img').each(function(){
        img = $(this).attr('name');
        width = $(this).attr('width');
        height = $(this).attr('height');
        slideImgs.push([bgDir + img,width,height]); 
      });
      loadImg();
    }
  });
}

function loadImg(){
  if(slideImgs[imgIndex][4]){
    slideStart();
  }else{
    $.preLoadImages([slideImgs[imgIndex][0]],slideStart);
  }
}

function slideStart(){
  slideImgs[imgIndex][4] = true;
  animatingFoto = true;
  //vytvoreni divu
  $('<div id="foto_' + imgIndex + '" class="slide_img"></div>').appendTo('#slide');
  var slideURL = slideImgs[imgIndex][0];
  $('<img src="' + slideURL + '" />').appendTo('#foto_' + imgIndex);
  //naplneni vars
  actualBackDiv = $('#foto_' + imgIndex);
  lastBackDiv = $('#foto_' + lastImgIndex);
  
  //vypocet konecneho stavu bck
  var newArray = calculateResize(slideImgs[imgIndex][1], slideImgs[imgIndex][2], $(window).width(), $(window).height());
  
  //pepinani typu prechodu
  var transition = transitions[transIndex]; 
  var transType = transition[0];
  var easing = transition[1]; 
  var startOpacity = transition[2];
  var startRatio = transition[3];
  var animationTime = transition[4];
  
  //bring to front
  if(transType == "slideLeftBack" || transType == "slideRightBack"){
    actualBackDiv.css({"z-index"  : 1});
    lastBackDiv.css({"z-index"  : 100});
  }else{
    actualBackDiv.css({"z-index"  : 100});
    lastBackDiv.css({"z-index"  : 1});  
  }

  if(firstPic){
    transType = "none";
    firstPic = false;
  }

  switch (transType) {
    case "slideLeft":
        //vychozi bod - novy
        actualBackDiv.children('img').css({"width"  : newArray["width"], "height" : newArray["height"]});
        actualBackDiv.css({"opacity"  : startOpacity, "top"  : newArray["top"], "left" : newArray["width"]}); 
        //konecny bod - animace noveho
        actualBackDiv.children('img').animate({opacity: 1, width: newArray["width"], height: newArray["height"]}, animationTime, easing);
        actualBackDiv.animate({opacity: 1, top: newArray["top"], left: newArray["left"] }, animationTime, easing, animationFinished);
        break;
    case "slideLeftBack":
        //vychozi bod - novy
        actualBackDiv.children('img').css({"width"  : newArray["width"], "height" : newArray["height"]});
        actualBackDiv.css({"opacity"  : 1, "top"  : newArray["top"], "left" : newArray["left"]}); 
        //konecny bod - animace stareho
        lastBackDiv.children('img').animate({opacity: 1, width: newArray["width"], height: newArray["height"]}, animationTime, easing);
        lastBackDiv.animate({opacity: startOpacity, top: newArray["top"], left: newArray["width"] }, animationTime, easing, animationFinished);
        break;
    case "slideRight":
        //vychozi bod - novy
        actualBackDiv.children('img').css({"width"  : newArray["width"], "height" : newArray["height"]});
        actualBackDiv.css({"opacity"  : startOpacity, "top"  : newArray["top"], "left" : - newArray["width"]}); 
        //konecny bod - animace noveho
        actualBackDiv.children('img').animate({opacity: 1, width: newArray["width"], height: newArray["height"]}, animationTime, easing);
        actualBackDiv.animate({opacity: 1, top: newArray["top"], left: newArray["left"] }, animationTime, easing, animationFinished);
        break;
    case "slideRightBack":
        //vychozi bod - novy
        actualBackDiv.children('img').css({"width"  : newArray["width"], "height" : newArray["height"]});
        actualBackDiv.css({"opacity"  : 1, "top"  : newArray["top"], "left" : newArray["left"]}); 
        //konecny bod - animace stareho
        lastBackDiv.children('img').animate({opacity: 1, width: newArray["width"], height: newArray["height"]}, animationTime, easing);
        lastBackDiv.animate({opacity: startOpacity, top: newArray["top"], left: - newArray["width"] }, animationTime, easing, animationFinished);
        break;
    case "slideUp":
        //vychozi bod - novy
        actualBackDiv.children('img').css({"width"  : newArray["width"], "height" : newArray["height"]});
        actualBackDiv.css({"opacity"  : startOpacity, "top"  : - newArray["height"], "left" : newArray["left"]}); 
        //konecny bod - animace noveho
        actualBackDiv.children('img').animate({opacity: 1, width: newArray["width"], height: newArray["height"]}, animationTime, easing);
        actualBackDiv.animate({opacity: 1, top: newArray["top"], left: newArray["left"] }, animationTime, easing, animationFinished);
        break;
    case "slideDown":
        //vychozi bod - novy
        actualBackDiv.children('img').css({"width"  : newArray["width"], "height" : newArray["height"]});
        actualBackDiv.css({"opacity"  : startOpacity, "top"  : newArray["height"], "left" : newArray["left"]}); 
        //konecny bod - animace noveho
        actualBackDiv.children('img').animate({opacity: 1, width: newArray["width"], height: newArray["height"]}, animationTime, easing);
        actualBackDiv.animate({opacity: 1, top: newArray["top"], left: newArray["left"] }, animationTime, easing, animationFinished);
        break;
    case "blend":    
        //vychozi bod - novy
        actualBackDiv.children('img').css({"width"  : newArray["width"], "height" : newArray["height"]});
        actualBackDiv.css({"opacity"  : 0, "top"  : newArray["top"], "left" : newArray["left"]}); 
        //konecny bod - animace noveho
        actualBackDiv.children('img').animate({opacity: 1, width: newArray["width"], height: newArray["height"]}, animationTime, easing);
        actualBackDiv.animate({opacity: 1, top: newArray["top"], left: newArray["left"] }, animationTime, easing, animationFinished);
        break;
    case "ratio":
        var left = Math.round(($(window).width() - (newArray["width"] * startRatio)) / 2);
        var top = Math.round(($(window).height() - (newArray["height"] * startRatio)) / 2);    
        //vychozi bod - novy
        actualBackDiv.children('img').css({"width"  : newArray["width"] * startRatio, "height" : newArray["height"] * startRatio});
        actualBackDiv.css({"opacity"  : 0, "top"  : top, "left" : left}); 
        //konecny bod - animace noveho
        actualBackDiv.children('img').animate({opacity: 1, width: newArray["width"], height: newArray["height"]}, animationTime, easing);
        actualBackDiv.animate({opacity: 1, top: newArray["top"], left: newArray["left"] }, animationTime, easing, animationFinished);
        break;
    case "none":   
        actualBackDiv.children('img').css({"width"  : newArray["width"], "height" : newArray["height"]});
        actualBackDiv.css({"top"  : newArray["top"], "left" : newArray["left"]});
        animationFinished();
        break;
  }   
}

function calculateResize(origWidth, originalHeight, destWidth, destHeight){
  
  var imgRatio = origWidth / originalHeight;
  var windowRatio = destWidth / destHeight;
  
  var newWidth;
  var newHeight;
  var top;
  var left;
  
  var newArray = [];                
  
  if(windowRatio < imgRatio){
    newArray["width"] = Math.round(destHeight * imgRatio);
    newArray["height"] = destHeight;
    newArray["top"] = 0;
    newArray["left"] = Math.round((destWidth - newArray["width"]) / 2);        
  }else{
    newArray["width"] = destWidth;
    newArray["height"] = Math.round(destWidth / imgRatio);
    newArray["top"] = Math.round((destHeight - newArray["height"]) / 2);  
    newArray["left"] = 0;   
  }
  return newArray;    
}
