/*
	Kwicks for jQuery (version 1.5.1)
	Copyright (c) 2008 Jeremy Martin
	http://www.jeremymartin.name/projects.php?project=kwicks
	
	Licensed under the MIT license:
		http://www.opensource.org/licenses/mit-license.php

	Any and all use of this script must be accompanied by this copyright/license notice in its present form.
*/

(function($){
  $.fn.kwicks = function(options) {
    var defaults = {
      isVertical: false,
      sticky: true,
      defaultKwick: 0,
      event: 'mouseover',
      spacing: 0,
      duration: 500,
      timer_time : 5000
      
    };
    var o = $.extend(defaults, options);
    var WoH = (o.isVertical ? 'height' : 'width'); // WoH = Width or Height
    var LoT = (o.isVertical ? 'top' : 'left'); // LoT = Left or Top
    // alert("WoH:"+WoH+ " LoT:"+LoT);
    
    var now_active = o.defaultKwick;
    var all_count = 0;
    var next_active = now_active;
    var timer_stop = false;
    
    var preCalcLoTs = []; // preCalcLoTs = pre-calculated Left or Top's
    
    return this.each(function() {
      
      container = $(this);
      var kwicks = container.children('li');
      // alert(kwicks.size());
      
      var normWoH = kwicks.eq(0).css(WoH).replace(/px/,''); // normWoH = Normal Width or Height
      if(!o.max) {
        o.max = (normWoH * kwicks.size()) - (o.min * (kwicks.size() - 1));
      } else {
        o.min = ((normWoH * kwicks.size()) - o.max) / (kwicks.size() - 1);
      }
      // set width of container ul
      if(o.isVertical) {
        container.css({
          width : kwicks.eq(0).css('width'),
          height : (normWoH * kwicks.size()) + (o.spacing * (kwicks.size() - 1)) + 'px'
        });
      } else {
        container.css({
          width : (normWoH * kwicks.size()) + (o.spacing * (kwicks.size() - 1)) + 'px',
          height : kwicks.eq(0).css('height')
        });
      }
      
      
      // pre calculate left or top values for all kwicks but the first and last
      // i = index of currently hovered kwick, j = index of kwick we're calculating
      for(i = 0; i < kwicks.size(); i++) {
        preCalcLoTs[i] = [];
        // don't need to calculate values for first or last kwick
        for(j = 1; j < kwicks.size() - 1; j++) {
          if(i == j) {
            preCalcLoTs[i][j] = o.isVertical ? j * o.min + (j * o.spacing) : j * o.min + (j * o.spacing);
          } else {
            preCalcLoTs[i][j] = (j <= i ? (j * o.min) : (j-1) * o.min + o.max) + (j * o.spacing);
          }
          // $('#debug_parCal').append('i:'+i+' j:'+j+" pre:"+preCalcLoTs[i][j]);
        }
      }
      
      
      // alert(i);
      
      // loop through all kwick elements
      kwicks.each(function(i) {
        //alert("EACH;"+i);
        var kwick = $(this);
        // 各idを取得
        // alert(kwick.attr('id'));
        // alert(all_count);
        
        
        // set initial width or height and left or top values
        // set first kwick
        if(i === 0) {
          kwick.css(LoT, '0px');
          
        // set last kwick
        } else if(i == kwicks.size() - 1) {
          kwick.css(o.isVertical ? 'bottom' : 'right', '0px');
          
        // set all other kwicks
        } else {
          if(o.sticky) {
            kwick.css(LoT, preCalcLoTs[o.defaultKwick][i]);
          } else {
            kwick.css(LoT, (i * normWoH) + (i * o.spacing));
          }
        }
        // correct size in sticky mod
        if(o.sticky) {
          if(o.defaultKwick == i) {
            kwick.css(WoH, o.max + 'px');
            kwick.addClass('active');
          } else {
            kwick.css(WoH, o.min + 'px');
          }
        }
        kwick.css({
          margin: 0,
          position: 'absolute'
        });
        
        all_count = kwicks.size();
        
        
        // **** EVENTでスライド実行
        kwick.bind(o.event, function() {
          // alert("BIND:"+i);
          
          // ACTIVEを除去
          kwicks.stop().removeClass('active');
          
          // calculate previous width or heights and left or top values
          var prevWoHs = []; // prevWoHs = previous Widths or Heights
          var prevLoTs = []; // prevLoTs = previous Left or Tops
          for(j = 0; j < kwicks.size(); j++) {
            prevWoHs[j] = kwicks.eq(j).css(WoH).replace(/px/, '');
            prevLoTs[j] = kwicks.eq(j).css(LoT).replace(/px/, '');
          }
          
          var aniObj = {};
          aniObj[WoH] = o.max;
          var maxDif = o.max - prevWoHs[i];
          var prevWoHsMaxDifRatio = prevWoHs[i]/maxDif;
          
          // アニメーション処理
          kwick.addClass('active').animate(aniObj, {
            step: function(now) {
              // calculate animation completeness as percentage
              var percentage = maxDif != 0 ? now/maxDif - prevWoHsMaxDifRatio : 1;
              
              
              // adjsut other elements based on percentage
              // alert("BINDSSS:"+j);
              kwicks.each(function(j) {
                if(j != i) {
                  kwicks.eq(j).css(WoH, prevWoHs[j] - ((prevWoHs[j] - o.min) * percentage) + 'px');
                }
                if(j > 0 && j < kwicks.size() - 1) { // if not the first or last kwick
                  kwicks.eq(j).css(LoT, prevLoTs[j] - ((prevLoTs[j] - preCalcLoTs[i][j]) * percentage) + 'px');
                }
              });
            },
            duration: o.duration,
            easing: o.easing
          });
          now_active = i;
        });
        
        
      });
      // -- end kwicks.each
      
      
      // 分割表示の場合
      /*
      if(!o.sticky) {
        container.bind("mouseleave", function() {
          var prevWoHs = [];
          var prevLoTs = [];
          kwicks.removeClass('active').stop();
          for(i = 0; i < kwicks.size(); i++) {
            prevWoHs[i] = kwicks.eq(i).css(WoH).replace(/px/, '');
            prevLoTs[i] = kwicks.eq(i).css(LoT).replace(/px/, '');
          }
          var aniObj = {};
          aniObj[WoH] = normWoH;
          var normDif = normWoH - prevWoHs[0];
          kwicks.eq(0).animate(aniObj, {
            step: function(now) {
              var percentage = normDif != 0 ? (now - prevWoHs[0])/normDif : 1;
              for(i = 1; i < kwicks.size(); i++) {
                kwicks.eq(i).css(WoH, prevWoHs[i] - ((prevWoHs[i] - normWoH) * percentage) + 'px');
                if(i < kwicks.size() - 1) {
                  kwicks.eq(i).css(LoT, prevLoTs[i] - ((prevLoTs[i] - ((i * normWoH) + (i * o.spacing))) * percentage) + 'px');
                }
              }
            },
            duration: o.duration,
            easing: o.easing
          });
        });
      };
      */
      
      kwicks.mouseover(function() {
          timer_stop = true;
      });
      kwicks.mouseout(function() {
          timer_stop = false;
      });
      
      jQuery.timer(o.timer_time, function(timer) {
        if (timer_stop == false) {
          if (now_active >= (all_count-1)) {
             next_active = 0;
          } else {
             next_active = now_active + 1;
          }
          
          // $('#debug2').text("NOW:"+now_active +" NEXT:"+next_active);
          
          kwicks.each(function(i) {
            var kwick = $(this);
            
            if (i == next_active) {
              // calculate previous width or heights and left or top values
              var prevWoHs = []; // prevWoHs = previous Widths or Heights
              var prevLoTs = []; // prevLoTs = previous Left or Tops
              // ACTIVEを除去
              kwicks.stop().removeClass('active');
              for(j = 0; j < kwicks.size(); j++) {
                prevWoHs[j] = kwicks.eq(j).css(WoH).replace(/px/, '');
                prevLoTs[j] = kwicks.eq(j).css(LoT).replace(/px/, '');
              }
              
              // $('#debug3').text("CSS0:"+kwicks.eq(0).css(WoH)+" CSS1:"+kwicks.eq(1).css(WoH)+" CSS2:"+kwicks.eq(2).css(WoH));
              
              var aniObj2 = {};
              aniObj2[WoH] = o.max;
              var maxDif = o.max - prevWoHs[i];
              var prevWoHsMaxDifRatio = prevWoHs[i]/maxDif;
              
              
              // アニメーション処理
              kwick.addClass('active').animate(aniObj2, {
                step: function(now) {
                  var percentage;
                  if (maxDif != 0) {
                      percentage = now/maxDif - prevWoHsMaxDifRatio;
                  } else {
                      percentage = 1;
                  }
                  kwicks.each(function(j) {
                    if (j != i) {
                      kwicks.eq(j).css(WoH, prevWoHs[j] - ((prevWoHs[j] - o.min) * percentage) + 'px');
                    }
                    if(j > 0 && j < kwicks.size() - 1) {
                      kwicks.eq(j).css(LoT, prevLoTs[j] - ((prevLoTs[j] - preCalcLoTs[i][j]) * percentage) + 'px');
                    }
                    
                  });
                  // $('#debug4').text("obj:"+aniObj2[WoH]+" i:"+i+" maxDif:"+maxDif+" PER:"+percentage);
                },
                duration: o.duration, 
                easing:o.easing
              });
              now_active = i;
            }
          });
        }// --end if timer_stop
        
      });
      
      
    });
    /* end return */
    
  };


})(jQuery);

/*
        kwick.bind(o.event, function() {
          // alert("BIND:"+i);
          i = now_active;
          // i = 0;
          // calculate previous width or heights and left or top values
          var prevWoHs = []; // prevWoHs = previous Widths or Heights
          var prevLoTs = []; // prevLoTs = previous Left or Tops
          kwicks.stop().removeClass('active');
          for(j = 0; j < kwicks.size(); j++) {
            prevWoHs[j] = kwicks.eq(j).css(WoH).replace(/px/, '');
            prevLoTs[j] = kwicks.eq(j).css(LoT).replace(/px/, '');
          }
          var aniObj = {};
          aniObj[WoH] = o.max;
          var maxDif = o.max - prevWoHs[i];
          var prevWoHsMaxDifRatio = prevWoHs[i]/maxDif;
          
          kwick.addClass('active').animate(aniObj, {
            step: function(now) {
              // calculate animation completeness as percentage
              var percentage = maxDif != 0 ? now/maxDif - prevWoHsMaxDifRatio : 1;
              
              
              // adjsut other elements based on percentage
              // alert("BINDSSS:"+j);
              kwicks.each(function(j) {
                if(j != i) {
                  kwicks.eq(j).css(WoH, prevWoHs[j] - ((prevWoHs[j] - o.min) * percentage) + 'px');
                }
                if(j > 0 && j < kwicks.size() - 1) { // if not the first or last kwick
                  kwicks.eq(j).css(LoT, prevLoTs[j] - ((prevLoTs[j] - preCalcLoTs[i][j]) * percentage) + 'px');
                }
              });
              $("#debug").text("PERCENT:"+percentage*100+"% "+" i:"+i); 
            },
            duration: o.duration,
            easing: o.easing
          });
          now_active = i;
          // alert("bind:"+i);
        });
*/
