/*! @header slider.js
 *
 * @author Joshua E Cook
 * @copyright Joshua E Cook, ParticleWeb, 13 July, 2007
 *
 * @encoding utf-8
 */

/*! @function slider
 * @param container
 * @param items_per_page
 *
 * @return function
 */
function slider( container, items_per_page )
  {
  container = $(container);
  items_per_page = items_per_page || 3;
  var current_page = 1;
  var is_animating = false;
  var items, items_count, pages, pages_count, mask;
      
  var initialize = function ()
    {
    items = $('.portfolio-items',container);
    items_count = items.children().length;
    pages_count = Math.ceil(items_count / items_per_page);
    };

  var scroll_to_page = function ( index )
    {
    if ( current_page === index || is_animating )
      { return;  }
    
    var page = index;
    var position_offset = false;
    var new_left = -1 * index * mask.width();
    var duration = 666 * Math.abs(index-current_page);

    if ( 0 === index )
      {
      position_offset = -1 * mask.width() * pages_count;
      page = pages_count;
      }
    else if ( 1 + pages_count === index )
      {
      position_offset = -1 * mask.width();
      page = 1;
      }        
    
    $('a.current',pages).removeClass('current');
    
    var after = function ()
      {
      current_page = page;
      is_animating = false;
      if ( false !== position_offset )
        { items.css('left',position_offset);  }
      
      $('a:eq('+(current_page-1)+')',pages).addClass('current');
      };
    
    is_animating = true;
    items.animate({'left':new_left},duration,'',after);
    };
  
  var render = function ()
    {
    var render_items = function ()
      {
      var last_page_start = items_count - (items_count % items_per_page);
      if ( last_page_start === items_count )
        { last_page_start = items_count - items_per_page;  }
      
      var overflow_amount = items_per_page - (items_count % items_per_page);
      if ( overflow_amount === items_per_page )
        { overflow_amount = 0;  }
      
      var empty_items = function ( count )
        {
        var list = map(function () { return '<li class="empty"><div class="space">&nbsp;</div></li>';  },range(0,count));
        return list.join('');
        };

      var placeholders = function ( start, finish )
        {
        var li = items.children('li');
        
        var clone = function ( index )
          {
          var item = $(li[index]).clone(true);
          item.addClass('clone');
          item.removeAttr('id');
          $('[@id]',item).removeAttr('id');
          return item;
          };
          
        return map(clone,range(start,finish));
        };
      
      var preceeding_placeholders = placeholders(last_page_start,items_count);
      preceeding_placeholders.reverse();
      var following_placeholders = placeholders(0,items_per_page);

      items.prepend(empty_items(overflow_amount));
      foreach(bind(items.prepend,items),preceeding_placeholders);
      items.append(empty_items(overflow_amount));
      foreach(bind(items.append,items),following_placeholders);
      };
      
    var render_mask = function ()
      {
      mask = container.append('<div class="pweb-slider-mask"></div>').children(':last');
      mask.append(items);
      items.css('left',-1 * current_page * mask.width());
      };
      
    var create_arrows = function ()
      {
      var prev,next;
      if ( 1 == pages_count )
        { return;  }
        
      prev = container.append('<a class="pweb-slider-link-previous">«</a>').children(':last');
      prev.click(function () { scroll_to_page(current_page - 1);  });
      next = container.append('<a class="pweb-slider-link-next">»</a>').children(':last');
      next.click(function () { scroll_to_page(current_page + 1);  });
      };
    
    var create_dots = function ()
      {
      if ( 1 == pages_count )
        { return;  }

      pages = container.append('<ul class="pweb-slider-pages"></ul>').children(':last');
      
      var dot = function ( index )
        {
        var class_attr = index === current_page ? ' class="current"' : '';
        var link = pages.append('<li><a'+class_attr+'>'+index+'</a></li>').children(':last').children(':last');
        link.click(bind(scroll_to_page,this,index));
        };
        
      foreach(dot,range(1,1+pages_count));
      pages.css('margin-left',-1*pages.width()/2);
      };
      
    container.empty();
    
    render_items();
    render_mask();      
    create_arrows();
    create_dots();
    };
  
  initialize();
  render();
  return scroll_to_page;
  }
