(function($){
     var name_space = 'coverflow';

     $.fn[name_space] = function(options) {
	 var elements = this;
	 // Options
	 var settings = $.extend({balloon:"",interval:5000},options);
	 
         var dispNum = 7;
         var leftDispNum = Math.floor(dispNum / 2);
         var rightDispNum = Math.floor(dispNum / 2);
         var items = $('#coverflow ul').children();
         var currentItem = Math.floor(items.length / 2);
         var timer;
    
         var side_item = function(item,postfix){
         var src = $(item).children().children('img').attr('src');
        
         var fn  = src.match("(.+/.+?)\.[a-z]+$")[1];
         if(fn.match(".*_[lr]$")){
              fn = fn.match("(.+/.+)(_[lr])")[1];
         }
         var ext = src.match(".+/.+?(\.[a-z]+)$")[1];
         var sfn = fn+postfix+ext;
         var src = $(item).children().children('img').attr('src',sfn);
         return sfn;
    }

    var balloon_item = function(item){
        var src = $(item).children().children('img').attr('src');
        
        var fn  = src.match("(.+/.+?)\.[a-z]+$")[1];
        if(fn.match(".*_[lr]$")){
            fn = fn.match("(.+/.+)(_[lr])")[1];
        }
        var ext = src.match(".+/.+?(\.[a-z]+)$")[1];
        var sfn = fn+"_balloon.png";
        var src = $(settings.balloon).attr('src',sfn);
        return sfn;
    }
    
    var select_item = function(item){
        var li = $(item).parent().get(0);
        clearTimeout(timer);
        var index = $.inArray(li,items);
    	if(currentItem === index){
    		return true;
    	}
        currentItem = index;
        disp();
        timer = setTimeout("interval_timer()",settings.interval);
        return false;
    }

      interval_timer = function(){
        if(currentItem < items.length-1){
	  currentItem++;
	}else{
	  currentItem = 0;
	}
	disp();
        timer = setTimeout("interval_timer()",settings.interval);
      }
    
      var disp = function(){
        var leftItem = currentItem - leftDispNum;
        $(settings.balloon).hide();
        $.each(items,function(i,val){
          if(i < leftItem){
            var left =  "-128px";
            side_item(val,"_l");
            $(val).animate({left:left},{duration:"slow",complete:function(){
              $(val).css("z-index",-1);      
              $(val).hide();
	    }});
	  }else if( i > (currentItem+rightDispNum)){
            var left =  $("#coverflow").css("width");
            side_item(val,"_r");
            $(val).animate({left:left},{duration:"slow",complete:function(){
              $(val).css("z-index",-1);      
              $(val).hide();
	    }});
	  }else if(i < currentItem){
	     // left
            var left = ((i - leftItem) * 120) +2 + "px";
  	    $(val).show();
            $(val).children().children('img').animate({width:"128px",height:"268px"},{duration:"slow"});
            side_item(val,"_l");
	    $(val).animate({left:left},{duration:"slow",complete:function(){
	    }});
            $(val).css("z-index",(i - leftItem));      
          }else if(i > currentItem){
            // right
            $(val).show();
            $(val).css("left",left);
            var left = ((i - leftItem) * 120) + 64 + "px";
            $(val).children().children('img').animate({width:"128px",height:"268px"},{duration:"slow"});
              side_item(val,"_r");
            $(val).animate({left:left},{duration:"slow",complete:function(){
	    }});
            $(val).css("z-index",leftDispNum - (i - currentItem));      
          }else if(i == currentItem){
            $(val).show();
            var left = ((i - leftItem) * 120) +2 + "px";
            $(val).children().children('img').animate({width:"190px",height:"268px"},{duration:"slow"});
            $(val).animate({left:left},{duration:"slow",complete:function(){
              side_item(val,"");
	      balloon_item(val);
              $(settings.balloon).show();
	      }});
	      
          $(val).css("z-index",dispNum);
        }else{
		  alert("Image Index Error.");
	    }
      });
    }
    
    $.each(items,function(i,val){
	  var anchor = $(val).children('a');
	  $(anchor).unbind();
	  $(anchor).click(function(evt){
	    if( ! select_item(this) ){
	      evt.preventDefault();
	      return false;
	    }
	    return true;
	  });
    });
    disp();
    timer = setTimeout("interval_timer()",settings.interval);
    return this;
  };
})(jQuery);
