//菜单移动
//sanda lwq

/*---------------------------------------------------------------------
	类定义
---------------------------------------------------------------------*/

function MoveMenuClass(){   

//-----------------------私有属性-----------------------
//常量
var MoveDelayTimer = 500;	//延时开始移动(ms)
var MoveTimer = 30;			//每次移动间隔时间(ms)	 若MoveTimer = 30 , 则每秒 33 帧 , 人眼看起来是连续的
var Divs = 50;				//整个动作的分割次数
var NavInDiv = null;		//导航菜单内层 #divinner
var NavUl = null;			//导航菜单列表 #nav

var MAX_offsetWidth = 550;	//导航菜单内层 #divinner 的最大（最终） offsetWidth,
							//#nav 宽度 = #divinner 宽度 - 30 调整时注意与 CSS 一致

var MIN_offsetWidth;		//导航菜单内层的最小（初始） offsetWidth,开始时由 NavInDiv.offsetWidth 赋值
var Pow_n = 2;				//次方
var MAX_t = 1.0;			//最大函数自变量
var MIN_t = 0.05;			//最小函数自变量

//常量, 性能优化用
var t_Divs = (MAX_t - MIN_t) / Divs;
var pow_MAX_t_Pow_n = Math.pow(MAX_t, Pow_n) - Math.pow(MIN_t, Pow_n);

//变量
var t = MAX_t;				//函数自变量初始化, 从 MAX_t 开始, 递减, 小于 MIN_t
var Interval_Move;			//=setInterval(MoveDiv, MoveTimer)
var n = 0;					//第几次移动, 从 0 开始,小于 Divs

//-----------------------私有方法-----------------------
//测试数组每个元素
test_array = function(n_array) {
	var s = '';
	for (i = 0; i < n_array.length; i ++)
	{
		s= s + i + ':' + n_array[i] + '<br>';
	}
	step_debug(s);
}

//计算每次移动量，减速移动
calc_move_amount = function() { 
	var n_array = new Array();
	for (i = 0; i < Divs; i ++)
	{
		t = t - t_Divs;
		//MIN_offsetWidth +  (MAX_offsetWidth - MIN_offsetWidth) * {从 0 到 1}
		n_array[i] = MIN_offsetWidth +  (MAX_offsetWidth - MIN_offsetWidth) * (1 - (Math.pow(t, Pow_n) - Math.pow(MIN_t, Pow_n)) / pow_MAX_t_Pow_n);
		//均速移动: {从 0 到 1} 中改为 (MAX_t - t)/(MAX_t - MIN_t);
		//转换为整数
		n_array[i] = parseInt(n_array[i]);
	}
	//test_array(n_array);
	return n_array;
}

//移动
MoveDiv = function(n_array) { 
	//step_debug(n,NavInDiv.style.pixelWidth);
	if (n < n_array.length) {
		NavInDiv.style.width = n_array[n] + 'px';
		//如果给 style.width 赋一个负值, 会出错, 所以要先判断 (n_array[n] - 70)>0
		if (n_array[n] > 30)
		{
			NavUl.style.width = (n_array[n] - 30) + 'px';
		}
		n ++;
	} else {
		//清除定时，停止移动
		clearInterval(Interval_Move);
	}
}

//setInterval函数不认识局部变量,出现“参数无效”错误,
//bind函数将原函数与参数,捆绑成一个无输入参数的函数.
bind = function(func, args) 
{ 
	return function() 
	{ 
		func.apply(null, args); 
	}
} 

//开始移动
StartMoveDiv = function() { 
	//step_debug(54,'StartMoveDiv');
	//导航菜单内层
	NavInDiv = $("divinner");
	//导航菜单列表
	NavUl = $("nav");
	//最小（初始）offsetWidth	在document load完后才可赋值
	MIN_offsetWidth = NavInDiv.offsetWidth;
	//step_debug(54,enum_p(NavInDiv.style));//pixelWidth 为空或不是对象
	//step_debug(NavInDiv.offsetWidth,enum_p(NavInDiv));
	//点导航栏,MIN_offsetWidth == 0，移动.
	//点侧栏,MIN_offsetWidth != 0,不移动.
	//step_debug(54,MIN_offsetWidth);
	if (MIN_offsetWidth < 100)
	{
		var n_array = calc_move_amount();
		//test_array(n_array);
		//step_debug(54,MoveTimer);
		//用bind函数捆绑
		Interval_Move = setInterval(bind(MoveDiv,[n_array]), MoveTimer);
	}
}

//-----------------------公有-----------------------
//				( 从对象外部访问 )
this.MoveDelayTimer = MoveDelayTimer;
this.StartMoveDiv = StartMoveDiv;

}