/*!
 * Slide Show with jQuery
 * =========================== 
 * Autor : Václav Fiala [tONE]
 * Date : 2011-06-21
 * Version : 1.0
 * ===========================  
 * Customized from: tONE slideShow 0.2
 */
 
window.onerror = function(a,b,c) {
  /*alert(a+"\n"+b+"\n"+c);*/
  return true;
}

function slideShow(o) {
  // config and system vars
  var cfg = {
    "container":"#slideShow",
    "effect":"fade",
    "duration":2000,
    "slideDuration":50,
    "interval":4000,
    "mousePause":false,
    "overMousePause":false
  };
  var vars = {
    "elm":"",
    "moveNext":true,
    "cPhoto":0,
    "elmWidth":0,
    "elmHeight":0
  };
  // array with photo info
  var photo = [];
  // cache for loaded image names
  var pCache = [];
  // load image to cache
  var loadImage = function(i,cb) {
    if(!pCache[i]) {
      var d = new Date();
      var imgName = photo[i].src+"?v="+d.getTime();
      var img = new Image();
      img.onload = function() {
        pCache[i] = imgName;
        if((typeof cb) == "function") {
          cb();
        }
      }
      img.src = imgName;
    }
    else { // image is on cache -> only callback
      if((typeof cb) == "function") {
        cb();
      }
    }
  };
  // preload images
  var imagePreloader = function() {
    for(i=0;i<photo.length;i++) {
      loadImage(i);
    }
  };
  // starting slide
  var playSlide = function() {
    var e = cfg.effect;
    effect[e](0, function(){
      slideTo((vars.cPhoto+1));
    });
  }
  // create slideshow container
  var create = function() {
    var d = new Date();
    var idNew = "slideShow"+d.getTime();
    var firstImage = $(cfg.container).html();
    $(cfg.container).html('<div style="position:relative;" id="'+idNew+'">'+firstImage+'</div>');
    var w = 944;//parseInt($("#"+idNew+" img").width());
    var h = 346;//parseInt($("#"+idNew+" img").height());
    vars.elm = "#"+idNew;
    vars.elmWidth = w;
    vars.elmHeight = h;
    $("head").append('<style>'+cfg.container+' div { position:relative; width:'+w+'px; height:'+h+'px; overflow:hidden; } '+cfg.container+' div a, '+cfg.container+' div img { position:absolute; top:0px; left:0px; }</style>');
    setTimeout(playSlide, cfg.interval);
  };
  // load users config, preloadImages, create slideshow
  if((typeof o) == "object") {
    if(o.cfg) {
      $.extend(cfg, o.cfg);
    }
    photo = o.photo;
    imagePreloader();
    create();
  }
  // foto counter
  var fotoCount = function() {
    vars.cPhoto = vars.cPhoto + eval(1);
    if(vars.cPhoto == photo.length) {
      vars.cPhoto = 0;
    }
    return vars.cPhoto;
  }
  // make slide code
  var makeSlide = function(f) {
    var s1 = "", s2 = "";
    if(photo[f].url != "") {
      s1 = '<a href="'+photo[f].url+'"'; 
      if(photo[f].target != "") {
        s1 += ' target="'+photo[f].target+'"';
      }
      s1 += '>';
      s2 += '</a>';
    }
    return s1+'<img src="'+pCache[f]+'" class="rel'+f+'" />'+s2;
  }
  // activate tab
  var activateTab = function(c) {
    if(parseInt($("#slide_"+c).css("right")) != 0) {
      $("#slide_"+c).animate({'right': '0px'}, cfg.slideDuration, function(){
        //checkActivate(c);
      });
    }
  }
  // deactivate tabs
  var deactivateTab = function(c) {
    if(parseInt($("#slide_"+c).css("right")) != -100) {
      $("#slide_"+c).animate({'right': '-100px'}, cfg.slideDuration, function(){
        //checkActivate(c);
      });
    }
  }
  // activate and deactivate tabs run
  var activate = function(c) {
    if(c == 1) { deactivateTab(2); deactivateTab(3); activateTab(1); }
    if(c == 2) { deactivateTab(1); deactivateTab(3); activateTab(2); }
    if(c == 3) { deactivateTab(1); deactivateTab(2); activateTab(3); }
  }
  // check and rapair active tabs
  var checkActivate = function(c) {
    if(parseInt($("#slide_1").css("right")) != 0 || parseInt($("#slide_2").css("right")) != 0 || parseInt($("#slide_3").css("right")) != 0) {
      activate(c);
    }
  }
  // slide to specific photo count
  var slideTo = function(c) {
    // set current photo
    vars.cPhoto = (c-1);
    // activ/deactiv tabs
    activate(c);
    // minified and extend fade effect for custom slide
    if($(vars.elm+" img").length > 2) {
      if($(vars.elm+" :first").attr("class") != 'rel'+(c-1)) {
        $(vars.elm+" :not("+vars.elm+" > :last)").remove();
      }
      $(vars.elm+" > :last").before(makeSlide((c-1)));
      /*if(!$(vars.elm+" :last:animated").length) {
        $(vars.elm+" :last").animate({'opacity': 0}, cfg.duration, function(){
          $(vars.elm+" :last").remove();
          checkActivate((vars.cPhoto+1));
        });
      }*/
    }
    else {
      $(vars.elm+" > :last").before(makeSlide((c-1)));
      $(vars.elm+" > :last").animate({'opacity': 0}, cfg.duration, function(){
        $(vars.elm+" > :last").remove();
        checkActivate((vars.cPhoto+1));
      });
    }
  }
  // slide effects
  var effect = {
    "fade" : function(f, cb) {
      if(cfg.mousePause == false && cfg.overMousePause == false) {
        if(!f) { f = fotoCount(); }
      }
      loadImage(f, function() {
        if(cfg.mousePause == false && cfg.overMousePause == false) {
          if($(vars.elm+" img").length > 2) {
            $(vars.elm+" :not("+vars.elm+" > :last)").remove();
          }
          $(vars.elm+" > :last").before(makeSlide(f));
          $(vars.elm+" > :last").animate({'opacity': 0}, cfg.duration, function(){
            $(vars.elm+" > :last").remove();
          });
          if((typeof cb) == "function") {
            cb();
          }
        }
        setTimeout(playSlide, cfg.interval);
      });
    }
  };
  // public functions
  return {
    slideTo: function(c) {
      slideTo(c);
    },
    mousePause: function(str) {
      cfg.mousePause = str;
    },
    overMousePause: function(str) {
      cfg.overMousePause = str;
    },
    check: function() {
      checkActivate((vars.cPhoto+1));
    }
  };
}
