var default_duration = 0.5;

//#####################################################################
// AnimationLockクラス定義
//#####################################################################
var AnimationLock = Class.create();

AnimationLock.prototype = {
	locker: null,
	que: null,
  initialize : function(name) {
  	locker = new Object();
  	que = new Object();
  },
  lock : function(target) {
    locker[target] = true;
  },
  unlock : function(target) {
    locker[target] = false;
  },
  is_locked : function(target){
  	return locker[target];
  },
  add_que : function(target, option){
  	que[target] = option;
  },
  del_que : function(target){
  	delete que[target];
  },
  que_exe : function(){
  	for(i in que){
  		exe_animation(i, que[i]);
	  }
  }
};

var locker = new AnimationLock();
var queAleter = new PeriodicalExecuter(locker.que_exe, 0.1);

//=====================================================================
// アニメーションの実行
//=====================================================================
function exe_animation(target, option){

	//ロックチェック
	if(locker.is_locked(target)){
		locker.add_que(target, option);
		return;
	}
	//ロックをかける
	locker.lock(target);
	//キューから削除
	locker.del_que(target);
	
	if(typeof(option) != "object")option = new Object;

	switch(option.type){
		case "fade":
			fade_window(target, option);
			break;
		case "appear":
			appear_window(target, option);
			break;
		case "slide_up":
			slide_up(target, option);
			break;
		case "slide_down":
			slide_down(target, option);
			break;
		default:
			locker.unlock(target);
			break;
	}

}


//=====================================================================
// Windowアニメーション(じんわり出現)
//=====================================================================
function appear_window(target, option) {

	//初期化
	if(typeof(option) != "object"){
		var option = new Object;
	}

  if(option.duration == null)option.duration = 1.0;
  if(option.delay == null)option.delay = 0;
  if(option.from == null)option.from = 0;
  if(option.to == null)option.to = 1.0;

	$(target).style.dispaly = "block";

  new Effect.Appear(target, {
    delay:option.delay, // 開始までの秒数
    from:option.from,
    to:option.to,
    fps:60, // フレームレート
    duration:option.duration, // アニメーションする時間(秒)
    beforeStartInternal: function(effect) {
    },
    afterFinishInternal: function(effect) {
    	try{
				locker.unlock(target);
	      if(option.func != null)eval(option.func);
    	}catch(e){}
    }
  });
  
}

//=====================================================================
// Windowアニメーション(じんわり消滅)
//=====================================================================
function fade_window(target, option) {

	if(typeof(option) != "object"){
		var option = new Object;
	}

  if(option.duration == undefined)option.duration = 1.0;
  if(option.delay == undefined)option.delay = 0;
  if(option.from == undefined)option.from = 0.9;
  if(option.to == undefined)option.to = 0;
  if(option.disabled == undefined)option.disabled = true;

  new Effect.Fade(target, {
    delay:option.delay, // 開始までの秒数
    from:option.from,
    to:option.to,
    fps:60, // フレームレート
    duration:option.duration, // アニメーションする時間(秒)
    beforeStartInternal: function(effect) {
    },
    afterFinishInternal: function(effect) {
			try{
				locker.unlock(target);
				if(option.disabled)$(target).style.display = "none";
	      if(option.func != null)eval(option.func);
	    }catch(e){}
    }
  });
  
}

//=====================================================================
// Windowアニメーション(上げる)
//=====================================================================
function slide_up(target, option) {

	if(typeof(option) != "object"){
		var option = new Object;
	}

  if(option.duration == undefined)option.duration = 1.0;
  if(option.delay == undefined)option.delay = 0;
  if(option.from == undefined)option.from = 0;
  if(option.to == undefined)option.to = 1.0;
  if(option.disabled == undefined)option.disabled = true;

  new Effect.BlindUp(target, {
    delay:option.delay, // 開始までの秒数
    from:option.from,
    to:option.to,
    fps:60, // フレームレート
    duration:option.duration, // アニメーションする時間(秒)
    beforeStartInternal: function(effect) {
    },
    afterFinishInternal: function(effect) {
			try{
				locker.unlock(target);
				if(option.disabled)$(target).style.display = "none";
	      if(option.func != null)eval(option.func);
	    }catch(e){}
    }
  });
}

//=====================================================================
// Windowアニメーション(下げる)
//=====================================================================
function slide_down(target, option) {

  if(option.duration == undefined)option.duration = 1.0;
  if(option.delay == undefined)option.delay = 0;
  if(option.from == undefined)option.from = 0;
  if(option.to == undefined)option.to = 1.0;
  if(option.disabled == undefined)option.disabled = false;

  new Effect.BlindDown(target, {
    delay:option.delay, // 開始までの秒数
    from:option.from,
    to:option.to,
    fps:60, // フレームレート
    duration:option.duration, // アニメーションする時間(秒)
    beforeStartInternal: function(effect) {
    },
    afterFinishInternal: function(effect) {
			try{
				locker.unlock(target);
				if(option.disabled)$(target).style.display = "none";
	      if(option.func != null)eval(option.func);
	    }catch(e){}
    }
  });
  
}

//=============================================
// 指定アンカーへのスクロール
//=============================================
function anchor_scroll(obj_id){
	new Effect.ScrollTo(obj_id, {duration:1});
	return void(0);
}

