
/*
画像でアニメーションを行う。GIFアニメをGIF以外でもでき、細かい制御が可能
*/

/*
inner_data=[{target_id}]{{
	base_src		ベースとなる画像パス
}

*/

(function($){
	var options={};
	var inner_data={};//内部で使うデータ
	
	$.fn.bg_slide=function(mode,arg1,arg2){

		if(mode=="config"){
			config(this,arg1);
		}else if(mode=="stop"){
			config(this,arg2);
			
			pause(this);
			this.each(function(i){
				var target_id=get_id(this);
				$(this).attr("src",inner_data[target_id]["original_src"]);
			});
		}else if(mode=="pause"){
			config(this,arg2);
			
			pause(this);
		}else if(mode=="seek"){
			config(this,arg2);
			
			seek(this,arg1);
		}else if(mode=="reset"){
			config(this,arg2);
			this.each(function(i){
				var target_id=$(this).attr('target_id');
				$(this).attr("src",inner_data[target_id]["original_src"]);
			});
		}else if(mode=="auto_start"){
			$(".bg_slide").load(function(){
				$(".bg_slide").bg_slide();
			});
			set_bgmax_img($('.bg_slide'));
		}else{
			if(mode!="play"){
				config(this,mode);
			}else{
				config(this,arg1);
			}
			return this.each(function(i){
				target_id=get_id(this);
				inner_data[target_id]={};
				
				var src=$(this).attr("src");
				var match=src.match(/\-slide([0-9]+)/);
				if(match){
					slide_num=match[1];
					var base_src=src.replace(/\-slide([0-9]+)/,"-slide[*slide_num*]");
					inner_data[target_id]["base_src"]=base_src;
				}
				img_preload(target_id);
				
				var interval=parseFloat(options[target_id]["interval"])*1000;
				var frame_count=options[target_id]["frame_count"];
				var target=$(this);
				
				inner_data[target_id]["play_num"]=1;
				var slide_play=function(){
					var animetimer=setInterval(function(){
						//$(target).attr("src",base_src.replace("[*slide_num*]",get_next_play_num(target_id)));
						var next_num=get_next_play_num(target_id);
						
						if(options[target_id]["slide_type"]=="fade"){
							var next=target.clone();
							next.attr("src",base_src.replace("[*slide_num*]",next_num));
							next.css("opacity",0);
							target.after(next);
							next.animate({"opacity": 1}, 2000);
							next.queue(function(){
								target.remove();
								next.dequeue();
								target=next;
							});
							set_bgmax_img(next);
						}
						if(options[target_id]["slide_type"]=="fade22"){
							target.fadeOut("slow");
							target.queue(function(){
								$(this).attr("src",base_src.replace("[*slide_num*]",next_num));
								target.dequeue();
							});
							target.fadeIn("slow");
						}
					},interval);
					inner_data[target_id]["timer"]=animetimer;
				};
				slide_play();
			});
			
		}
	};
	
	function get_next_play_num(target_id){
		if(options[target_id]["random"]){
			inner_data[target_id]["play_num"]=Math.floor(Math.random()*(options[target_id]["frame_count"]))+1;
		}else{
			inner_data[target_id]["play_num"]++;
		}
		return inner_data[target_id]["play_num"];
	}
	
	//frame_num のコマにシークする
	function seek(obj,frame_num){
		frame_num=parseFloat(frame_num);
		obj.each(function(i){
			target_id=get_id(this);
			var base_src=inner_data[target_id]["base_src"];
			
			$(this).attr("src",base_src.replace("[*anime_num*]",frame_num));
		});
	}
	
	//オプション値を設定
	function config(obj,config){
		var tagoption;//タグでのオプションを入れる一時的な変数。毎回上書き用
		var target_id;
		var static_option={};//HTMLタグに直接記述するオプション
		
		if(!config)
			config={};
		
		obj.each(function(i){
			target_id=get_id(this);
			static_option[target_id]={};
			
			if(tagoption=$(this).attr('loop_count')){
				static_option[target_id]["loop_count"]=tagoption;
			}
			if(tagoption=$(this).attr('frame_count')){
				static_option[target_id]["frame_count"]=tagoption;
			}
			if(tagoption=$(this).attr('interval')){
				static_option[target_id]["interval"]=tagoption;
			}
			if(tagoption=$(this).attr('slide_type')){
				static_option[target_id]["slide_type"]=tagoption;
			}
			
			//デフォルトオプションの設定
			if(!options[target_id]){
				options[target_id]={
					loop_count : -1//無制限
					,interval : 1//１秒ごとにループ
					,random : true//ランダムで画像表示
					,slide_type:"move_slide"
					//frame_count
				};
			}
			
			options[target_id]=$.extend(options[target_id], static_option[target_id]);
			options[target_id]=$.extend(options[target_id], config);
			options[target_id]["frame_count"]=options[target_id]["frame_count"]?parseFloat(options[target_id]["frame_count"]):0;
		});
	}
	
	//画像を先に読み込んでおく
	function img_preload(target_id){
		if(!inner_data[target_id]["pre_loaded"]){
			if(!$("#img_preload").length){
				$(document.body).prepend('<div id="img_preload" style="display:none;"></div>');
			}
			var i=1;
			var src;
			var frame_count=options[target_id]["frame_count"];
			var preload_base_src=inner_data[target_id]["base_src"];
			
			while(i<=frame_count){
				src=preload_base_src.replace("[*slide_num*]",i);
				$("#img_preload").append('<img src="'+src+'" class="imganime_preload"/>');
				i++;
			}
			inner_data[target_id]["pre_loaded"]=true;
		}
	}
	
	function get_id(dom_obj){
		var tagoption;//タグでのオプションを入れる一時的な変数。毎回上書き用
		var target_id;
		if(tagoption=$(dom_obj).attr('target_id')){
			target_id=tagoption;
		}else{
			target_id=$(dom_obj).set_uid();
			$(dom_obj).attr('target_id',target_id);
		}
		return target_id;
	}
	
	//オリジナル maximage（画像を１００％背景にする）
	function set_bgmax_img($obj){
		$obj.each(function(){
			if($(this).attr("main_bg_mode")){
				var parent_elm=$(window);
				var $target=$(this);
				
				function set_bgmax_img_main_bg_each(){
					var img_position="absolute";
					if($target.css("position")=="fixed"){
						img_position="fixed";
					}
					
					var tmp_width=parent_elm.width();
					var tmp_height=parent_elm.height();
					var ratio=find_ratio($target.width(),$target.height());
					
					if(tmp_height*ratio>=tmp_width){
						tmp_width=tmp_height*ratio;
					}else{
						tmp_height=tmp_width/ratio;
					}
					$target.css({
					  'overflow':   'hidden'
					  ,'position': img_position
					  ,display: "inline"
					  ,width : tmp_width
					  ,height : tmp_height
					  ,top : 0
					  ,left : 0
					  ,"z-index" : -1
					});
				}
				set_bgmax_img_main_bg_each();
				
				parent_elm.resize(function(){
					set_bgmax_img_main_bg_each();
				});
			}
		});
	}
	
	function find_ratio(width,height) {
		width = to_i(width);
		height = to_i(height);
		var ratio = width/height;
		ratio = ratio.toFixed(2);
		return ratio;
	}

	function to_i(i){
		last = parseInt(i);
		return last;
	}
	
})(jQuery);

$(document).ready(function(){
	$(".bg_slide").bg_slide("auto_start");
}); 


