/*
  jquery.inscroll.js
*/
$.fn.inscroll = function(param) {

  var m_t = 0; //mouse_top
  var param = $.extend({height:40, color:"#222"}, param); //default value.
  var fg_mouse = false;//mouse down flag.
	
	$('#information').css({
												'width':'280px',
												'overflow':'hidden'
												});
	
	
	
	return this.each(function(i){

	  var i_w = $(this).width() || 0; //outer div's width
	  var i_h = $(this).height() || 0; //outer div's height
	
//		console.log(this +":"+ i_h +">"+ param.height);
	  
	  if(i_h > param.height){//only when box is larger than config.
	    
	    var click_d = 100;
			i_h += 50;

      var e_t = 0; //element's top
      var s_t = 0; //slide bar's top
      
      var $o_e$ = $(this);//outer element
      var $i_e$ = $(this).children(":not(.out_scroll)");// inner element
//	  $e_e$ = "";
	  var $e_e$ = $(this).children(".out_scroll");// exclude element

	  // exclude elementがある時は、それぞれ30px足したり減らしたり

	  if(typeof($e_e$[0])=="object"){
		param.height -= 30;
		var p_t_e = 30;
		var s_h_e = -30;
		var b_h_e = -30;
	  }
	  else{
		var p_t_e = 0;
	    var s_h_e = 0;
	    var b_h_e = 0;
	  }

      var p_l = $(this).css('padding-right').replace('px', '')-0 || 0;//get dafault padding.
      var p_t = $(this).css('padding-top').replace('px', '')-0+p_t_e || 0;
      var p_b = $(this).css('padding-bottom').replace('px', '')-0 || 0;
	  var s_h = param.height * (param.height+p_t+p_b-16) / i_h; //slide_bar's height.
      var scale = (i_h - param.height)/(param.height+p_t+p_b-16 - s_h);
      var b_h = param.height+p_t+p_b-16+b_h_e; //bar's height


      $o_e$
        .height(param.height+p_t_e)
        .css({
          width:(i_w - 20)+'px',
          'padding-right':(p_l+20)+'px'
        })
        .bind('selectstart', function(){return false;})
        .bind('mousedown', function(){return false;})
        .append('<div class="box"><div class="is_bar"></div><div class="is_slide"></div><div class="is_slide_u"></div><div class="is_slide_d"></div></div>');

      var $is_box$ = $(this).children('.box');
      var $is_slide$ = $is_box$.children('.is_slide');
      var $is_bar$ = $is_box$.children('.is_bar');
      var $is_slide_u$ = $is_box$.children('.is_slide_u');
      var $is_slide_d$ = $is_box$.children('.is_slide_d');

      $i_e$.css({
        overflow:'hidden',
				position:"relative", // for IE7 overflow:hidden bug
///        height:param.height
        height:param.height -10
      });
      
      $i_e$.children().css({
        'position':'relative'
      });
      
      $is_box$.css({
        width:'10px',
        height:(b_h+16)+'px',
//        background:'green',
        position:'absolute',
        'z-index':20,
//        top:0,
        top:-5+p_t_e+'px',
        right:'4px'//bar right padding
      }); 
      $is_bar$.css({
        width:'2px',
        height:b_h+'px',
        background:param.color,
        position:'absolute',
        top:'8px',
        right:'3px',
        cursor:'pointer'
      }); 
      $is_slide$.css({
///        width:'4px',
        width:'6px',
        height:s_h,
        background:param.color,
        position:'absolute',
        top:'8px',
        right:'1px',
///        border:'1px #111 solid',
///        border:'1px #000 solid',
		cursor:'pointer'
      });
      $is_slide_u$.css({
        width:'20px',
        height:0,
        background:'none',
        position:'absolute',
        top:'8px',
        right:'0',
        cursor:'pointer'
//        ,background:'yellow'
      }).click(function(e){
          fg_mouse = false;
          s_t = val_window(s_t-click_d,p_t_e);
          slideClick(s_t);
      });
      $is_slide_d$.css({
        width:'20px',
        height:b_h-s_h,
        background:'none',
        position:'absolute',
        top:8+s_h+'px',
        right:'0',
        cursor:'pointer'
//        ,background:'yellow'
      }).click(function(e){
          fg_mouse = false;
          s_t = val_window(s_t+click_d,p_t_e);
          slideClick(s_t);
          
//          $('#box').css({background:"#FFF"}).text("slide_bar's top:"+$is_slide$.css('top'));
      });
       
      $is_slide$.mousedown(function(e){
        m_t = e.pageY-0;
        s_t = $(this).css('top').replace('px', '')-0;
        e_t = $i_e$.css('top').replace('px', '')-0;
        fg_mouse = true;
      });

      $(document).mousemove(function(e){
        if(fg_mouse == true){
          var _s_t = val_window(s_t + e.pageY - m_t,p_t_e);
          slideMove(e, _s_t);
        }
      });
      $(document).mouseup(function(){
        fg_mouse = false;
        s_t = $is_slide$.css('top');
          s_t = s_t.replace('px', '')-0;
      });
      
      $o_e$.mousewheel(function(e, d){//param:event,delta
        d *= 3;
        s_t = val_window(s_t-d,p_t_e);
        slideMove(e, s_t);
        return false;
      });

      function slideMove(e, _s_t){
        $is_slide$.css({top:_s_t+'px'});
        $is_slide_u$.css({height:_s_t-8+'px'});
        $is_slide_d$.css({height:Math.round(b_h-(_s_t-8)-s_h)+'px',top:(_s_t+s_h)+'px'});
        $i_e$.children().css({top:(8-_s_t)*scale});
      }
      function slideClick(_s_t){
        $is_slide$.animate({top:_s_t+'px'},200);
        $is_slide_u$.animate({height:_s_t-8+'px'},200);
        $is_slide_d$.animate({height:Math.round(b_h-(_s_t-8)-s_h)+'px',top:(_s_t+s_h)+'px'},200);
        $i_e$.children().animate({top:(8-_s_t)*scale},200);
      }
      
      function val_window(val,offset){//limit of value
        return Math.min(Math.max(val,8),8+param.height+p_t+p_b-16-s_h-p_t_e);
      }

    }
	});
};


