var BG_ANIMATION = {};
var BG_ANIMATION_QUEUE = {};
function bgAnimation() { return BG_ANIMATION; }
function bgAnimationQueue() { return BG_ANIMATION_QUEUE; }

function getTime()
{
  var d = new Date();
  return d.getTime();
}

$(document).ready(function() {
  
  // Newslist cycling...
  $("#news ul").cycle({
    fx: "fade",
    speed: 1000,
    timeout: 10000,
    pause: 1
  });
  
  $("p#prev a").click(function() {
    $("#news ul").cycle("prev");
    return false;
  });
  
  $("p#next a").click(function() {
    $("#news ul").cycle("next");
    return false;
  });
  
  $("#news ul li a, a[rel=external]").click(function() {
    window.open($(this).attr("href"));
    return false;
  });
  
  /*
   *
   * ANIMATION 
   *
   */

  // Animation duration
  bgAnimation.running = false;
  bgAnimation.DURATION = 15000;
  bgAnimationQueue.FADE_DURATION = 1000;
  
  // jQuery element of the animated image
  bgAnimation.element = function() { return $("#pictures li img:visible"); }
  bgAnimation.container = function() { return bgAnimation.element().parent(); }
  
  // Final position (in pixels)
  bgAnimation.finalPosition = function() {
    if (bgAnimation.element().hasClass("wide")) {
      return -(bgAnimation.element().width()-$("#pictures").width());
    } else {
      return -(bgAnimation.element().height()-$("#pictures").height());
    }
  }
  
  // Current position (in pixels)
  bgAnimation.currentPosition = function() {
    if (bgAnimation.element().hasClass("wide")) {
      return bgAnimation.element().css("left").slice(0,-2);
    } else {
      return bgAnimation.element().css("top").slice(0,-2);
    }
  }
  
  // Target position for the animation
  bgAnimation.targetPosition = function() {
    if (bgAnimation.element().hasClass("wide")) {
      return { left : bgAnimation.finalPosition() };
    } else {
      return { top : bgAnimation.finalPosition() };
    }
  }
  
  // Position after the animation concludes
  bgAnimation.endPosition = function() {
    if (bgAnimation.element().hasClass("wide")) {
      return { right: 0, left: "auto" };
    } else {
      return { bottom: 0, top: "auto" };
    }
  }
  
  // Remaining time in animation
  bgAnimation.remaining_time = function() {
    var time_left;
    var currentp = bgAnimation.currentPosition();
    var finalp = bgAnimation.finalPosition();
    
    if (currentp == finalp)
    {
      time_left = bgAnimationQueue.FADE_DURATION*3;
    }
    else
    {
      var fraction_done = bgAnimation.currentPosition() / bgAnimation.finalPosition();
      var fraction_left = 1 - Math.abs(fraction_done);
      time_left = fraction_left * bgAnimation.DURATION;
    }
    
    return time_left;
  }
  
  // Finalize the animation
  bgAnimation.finalize = function () {
    bgAnimation.running = false;
    bgAnimation.element().css(bgAnimation.endPosition());
    bgAnimationQueue.next();
  }
  
  // Stop (hammer time) the animation
  bgAnimation.stop = function() {
    bgAnimation.element().stop();
    bgAnimation.running = false;
  }
  
  bgAnimation.go = function() {

    bgAnimation.running = true;
    
    // Animate!
    bgAnimation.element().animate(bgAnimation.targetPosition(),{
      duration: bgAnimation.remaining_time(),
      complete: bgAnimation.finalize
    });
  }
  
  bgAnimation.reschedule = function() {
    if (bgAnimation.running)
    {
      bgAnimation.stop();
      bgAnimation.go();
    }
  }
  
  // Bind reschedule to window resize
  $(window).resize(bgAnimation.reschedule);

  /*
   *
   * ANIMATION QUEUE
   *
   */
  
  bgAnimationQueue.start = function() {
    var no_children = $("#pictures li").length;
    var random_no = Math.floor(Math.random()*no_children+1);
    var random_element = $("#pictures ul li:nth-child("+random_no+") img");
    random_element.fadeIn(bgAnimationQueue.FADE_DURATION, bgAnimation.go);    
  }
  
  bgAnimationQueue.next = function() {
    var current_element = bgAnimation.element();
    var next_container = (bgAnimation.container().next().length == 0) ? bgAnimation.container().siblings(":first-child") : bgAnimation.container().next();
    var next_element = next_container.children("img");
    
    // Fade Out the current image
    current_element.fadeOut(bgAnimationQueue.FADE_DURATION);
    // Fade In the new one
    next_element.fadeIn(bgAnimationQueue.FADE_DURATION, function() {
      // Reset the previous one position
      current_element.css({'top': 0, 'left': 0, 'bottom': 'auto', 'right': 'auto'});
      // Start the new animation
      bgAnimation.go();
    });
  }  
  
});

$(window).load(function() {
  $("#loading").fadeOut(bgAnimationQueue.FADE_DURATION, bgAnimationQueue.start);
});

