;(function($) {

  $.fn.pixoflow = function(options) {
    
    debug('Size -> '+this.size());
    var main_options = $.extend({}, $.fn.pixoflow.defaults, options);
    
    var actions = {
       
       init: function(e) {
         this.e = e;
         var self = this;
         self.items = e.find(self.settings.item_element);
         self._current = self.settings.item_starting;
         self._size = self.items.size();
         self.is_first = true;
         self.items._width = parseInt((self.settings.item_width+self.settings.item_spacing)*self._size)+self.settings.item_spacing;
         self.e.wrap("<div class=\"pixoflow-wrapper "+e.attr("class")+"\" "
                    +"style=\"position: relative; "
                    +"overflow: hidden; "
                    +"border-left: "+self.settings.container_sides_border_width+"px "+self.settings.container_sides_border_style+";"
                    +"border-right: "+self.settings.container_sides_border_width+"px "+self.settings.container_sides_border_style+";"
                    +"width: "+(self.settings.container_width-(self.settings.container_sides_border_width*2))+"px; "
                    +"height: "+self.settings.item_height+"px;\"></div>")
         .removeClass()
         .addClass("pixoflow-container");
         self.e.css("position", "absolute");
         self.e.css("top", "0");
         self.e.css("left", "0");
         self.e.css("width", self.items._width +"px");
         self.e.css("height", self.settings.item_height+"px");
         self.items.css("display", "block");
         self.items.css("position", "relative");
         self.items.css("float", "left");
         self.items.css("margin", "0 "+self.settings.item_spacing+"px 0 0");
         self.items.css("padding", "0");
         self.items.css("overflow", "hidden");
         self.items.css("width", self.settings.item_width+"px");
         self.items.css("height", self.settings.item_height-(self.settings.item_selected_border_width*2)+"px");
         self.items.find("a").bind('click', function(){
           self.moveToCenter($(this).parent()[0]);
           return false;
         }).simpletooltip();
    		 self.moveToCenter(self.items[self._current]);
   		},
   		
   		moveToCenter: function(item) {
   			var self = this; 
   			self._previous = self._current;
   			self._current = self.items.index(item);
   			if (self._previous == self._current && !self.is_first) {
   			  var a = $(item).find("a");
   			  window.location.href = a.attr("href");
   			  return false; 
   			}
   			var previous = self.items[self._previous];
   			$(previous).css("border-width", 0);
   			$(item).css("border", self.settings.item_selected_border_width+"px "+self.settings.item_selected_border_style);
   			var to = Math.abs(self._previous-self._current) <=1 ? 
   			         self._previous 
   			         : self._current+(self._previous < self._current ? -1 : 1);
   			self.refresh(1, to, self._current);
 				var _left = parseInt((self._current * (self.settings.item_width+self.settings.item_spacing))
 				                   +((self.settings.item_width+self.settings.item_spacing)/2)
 				                   -(self.settings.container_width/2));
   			self.e.stop().animate({left: -_left+"px"}, {duration: 600, easing: "easeOutBack"});
   			if (self.is_first) {
   			  self.e.fadeIn();
   			  self.is_first = false;
   			}
   		},
   		
   		refresh: function(state, from, to) {
   			var self = this;
   			self.items.each(function(i) {
   				var side = (i == to && from-to < 0 ) ||  i-to > 0 ? "left" : "right";
          var tg_opacity = (1 - Math.abs((side == "left" ? to-i : i-to)) / self.settings.opacity_level);
   				$(this).fadeTo("fast", tg_opacity);
   			});
   		}
   		
 		};
    
    return this.each(function() {
      $this = $(this);
      actions.settings = $.meta ? $.extend({}, main_options, $this.data()) : main_options;
      actions.init($this);
    });
    
  };

  function debug(str) {
    if (window.console && window.console.log)
      window.console.log('pixoflow : '+str);
  };

  $.fn.pixoflow.defaults = {
    container_width: 300,
    container_sides_border_width: 1,
    container_sides_border_style: 'solid #999',
    item_element: 'li',
    item_selected_border_width: 1,
    item_selected_border_style: 'solid white',
    item_width: 120,
    item_height: 80,
    item_spacing: 5,
    item_starting: 2,
    opacity_level: 3
  };

})(jQuery);
