function pretty_number(num, opts)
{
  var defaultOpts = {
    short: true,
    lowerCase: false,
    addCommas: true,
    round: 2
  };

  if (typeof num != "number")
  {
    return "";
  }

  function round(num, dec)
  {
    num = num * Math.pow(10, dec);
    num = Math.round(num);
    num /= Math.pow(10, dec);
    return num;
  }

  if (typeof opts == 'undefined')
  {
    opts = {};
  }

  for (var i in defaultOpts)
  {
    opts[i] = (typeof opts[i] != 'undefined')? opts[i] : defaultOpts[i];
  }

  if (opts.short)
  {
    var decimal_places = Math.floor(Math.log(num) / Math.log(10));

    var dec = [{
      'suffix': 'T',
      'divisor': 12
    },{
      'suffix': 'B',
      'divisor': 9
    },{
      'suffix': 'M',
      'divisor': 6
    },{
      'suffix': 'K',
      'divisor': 3
    },{
      'suffix': '',
      'divisor': 0
    }];

    for (var i in dec)
    {
      if (decimal_places > dec[i].divisor)
      {
        num = round((num / Math.pow(10, dec[i].divisor)), 2 - (decimal_places - dec[i].divisor));

        if (num >= 1000 && i > 0)
        {
          decimal_places -= 3;
          num = round(num / 1000, 2 - (decimal_places - dec[i - 1].divisor));
          num += dec[i - 1].suffix;
        }
        else
        {
          num += dec[i].suffix;
        }

        break;
      }
    }

    num = '' + num;

    if (opts.lowerCase)
    {
      num = num.toLowerCase();
    }
  }
  else if (opts.addCommas)
  {
    var decnum = ('' + (round(num, opts.round) - Math.floor(num))).substr(2);

    var tempnum = '' + Math.floor(num);
    num = '';
    for (i = tempnum.length - 1, j = 0; i >= 0; i--, j++)
    {
      if (j > 0 && j % 3 == 0)
      {
        num = '&nbsp;' + num;
      }
      num = tempnum[i] + num;
    }

    if (decnum > 0)
    {
      num = num + '.' + decnum;
    }
  }

  return num;
}

function spacify(num)
{
  return pretty_number(num, {
    'short': false
  });
}


$(function(){
  $("ul.carousel").each(function(){
    var carousel = $(this),
    items = $("li", carousel),
    len = items.length;

    items.eq(0).addClass("active");
    
    var animating = false;
    
    carousel.css({
      height:  "520px",
      position: "relative",
      width: carousel.width() * len
    })
    
    items.each(function(index){
      $(this).attr("id", "carousel_item_"+(index+1))
    })
    
    items.css({
      "float": "left",
      "margin-right": "30px",
      "cursor": "pointer",
      "position": "relative"
    }).not(".active").find("img").css({
      "width": "530px"
    })
    
    var shift = 576
    
    carousel.prepend(items.last().remove()).css("left", "-576px");
    
    var carousel_holder = $('<div class="carousel-holder"/>');
    var fader_holder = $('<div class="fader-holder"/>');
    
    var left_fader = $('<div class="left fader"/>');
    var right_fader = $('<div class="right fader"/>');

    var left_button = $('<div class="left carousel-button"/>');
    var right_button = $('<div class="right carousel-button"/>');
    
    carousel.wrap(fader_holder).wrap(carousel_holder);
    
    var dots = $('<div class="carousel-dots"></div>');
    
    
    fader_holder = carousel.closest(".fader-holder");
    carousel_holder = carousel.closest(".carousel-holder");
    
    carousel_holder.append(left_button).append(right_button).append(dots);
    
    fader_holder.append(left_fader).append(right_fader);
    dots = $(".carousel-dots", fader_holder).css({
      height: 20,
      width: 0
    });
    
    var carousel_holder_width = carousel_holder.width();
    
    items.each(function(index){
      dots.append('<div class="dot'+ ((index == 0) ? " active" : "") +'" id="carousel_dot_'+(index+1)+'" />');
      dots.css({
        width: "+=20px",
        left: carousel_holder_width/2 - dots.width()/2
      });
    });
    
    var carousel_timer;
    var carousel_time = 3000;
    var current_id = 1;
    function nextItemTimer()
    {
      carousel_timer = setTimeout(function(){
        var next = current_id + 1;
        var items = $("li", carousel);
        var len = items.length;

        next = next>len?1:next;
        $("#carousel_item_" + next).click();
      }, carousel_time);
    }
    nextItemTimer();
    items.live("mouseenter",function(){
      var li = $(this);
      itemid = parseInt(li.attr("id").replace("carousel_item_", ""));
      if(itemid == current_id && !animating)
      {
        li.addClass("hover");
        clearTimeout(carousel_timer);
      }
    });
    items.live("mouseleave",function(){
      var li = $(this);
      itemid = parseInt(li.attr("id").replace("carousel_item_", ""));
      if(itemid == current_id && !animating)
      {
        li.removeClass("hover");
        nextItemTimer();
      }
    });
    items.live("click", function(){
      
      if(!animating){
        var item = $(this);
        var direction = "left",
        items = $("li", carousel),
        dots = $(".dot", carousel_holder);
        
        if(!item.hasClass("active")){
          clearTimeout(carousel_timer);
        
          var currentOffset = parseInt(carousel.css("left"));
          var newOffset = item.get(0).offsetLeft;
          current_id = parseInt(item.attr("id").replace("carousel_item_", ""));
        
          if(-currentOffset >= newOffset){
            direction = "right";
          }else{
            direction = "left";
          }
          
          animating = true;
          if(direction == "right"){
            carousel.prepend(items.last().remove()).css("left", "-="+ shift +"px");
            animating = true;
            carousel.animate({
              left: -newOffset - shift
            }, 500, 'swing', function(){
              animating = false;
            });
          }else{
            carousel.animate({
              left: -newOffset + 260
            }, 500, 'swing', function(){
              animating = false;
              carousel.append(items.first().remove()).css("left", "+="+ shift +"px");
            });
          }
      
      
          items.not(item).find("img").animate({
            width: 530
          });
        
          items.removeClass("active");
          item.addClass("active").find("img").animate({
            width: 790
          });
          dots.removeClass("active").filter("#carousel_dot_"+current_id).addClass("active");
          nextItemTimer();
        }
      }

    });
    
    $(".fader, .carousel-button").bind("click", function(){
      var fader = $(this),
      direction = (fader.hasClass("left") ? "left" : "right"),
      items = $("li", carousel),
      len = items.length,
      current_id = parseInt($(items).filter(".active").attr("id").replace("carousel_item_", ""));
      
      
      var prev = current_id - 1,
      next = current_id + 1;
      
      
      if(prev == 0){
        prev = len;
      }
      if(next == len+1){
        next = 1;
      }

      $("#carousel_item_"+((direction == "left") ? prev : next)).trigger("click");
      
    })
    
    $(".dot", carousel_holder).bind("click", function(){
      var dot = $(this),
      current_id = parseInt(dot.attr("id").replace("carousel_dot_", ""));
      $("#carousel_item_"+current_id).trigger("click");
    });
    
  })
});
