/**
 * FujiTv CI Plugin.
 *
 * @author	katsuma@team-lab.com
 * @require	jquery 1.3
 */
(function($){
	// コンテンツ背景GIFアニメ
	$.fn.fujitvci = function(options){
		var settings = $.extend({
			type     :'background',
			category : '',
			path     : '',
			container:null,
			// タイマー間隔
			interval : 10000,
			// アニメーション再生時間
			duration : 5000,
			// 画像数定義
			count:{
				bgc  :1,
				bgl  :1,
				bgr  :1,
				avv  :0,
				avl  :0,
				avr  :0,
				avs  :0,
				_avv :{
					common   :19,
					animation:10,
					drama    :10,
					sports   :10,
					variety  :10,
					news     :10,
					mini     :10,
					movie    :5
				},
				_avl :{
					common   :19,
					animation:10,
					drama    :10,
					sports   :10,
					variety  :10,
					news     :10,
					mini     :10,
					movie    :5
				},
				_avr :{
					common   :19,
					animation:10,
					drama    :10,
					sports   :10,
					variety  :10,
					news     :10,
					mini     :10,
					movie    :5
				},
				_avs :{
					common   :1,
					animation:1,
					drama    :1,
					sports   :1,
					variety  :1,
					news     :1,
					mini     :1,
					movie    :1
				}
			},
			// 画像名定義
			name:{
				rootdir:'images_ci/',
				dir    :'',
				bgdir  :'background/',
				avdir :[
					'animation',
					'drama',
					'variety',
					'news',
					'mini',
					'common'
				],
				suffix :'.gif',
				bgc    :'bgc',
				bgl    :'bgl',
				bgr    :'bgr',
				avv    :'avv',
				avs    :'avs',
				avl    :'avl',
				avr    :'avr',
				avh    :['avl','avr'],
				cls    :'ci_bg_img'
			},
			// 背景サイズと座標
			pos:{
				cont   :{w:  0, h:  0, b:400},
				avv    :{w: 60, h:200},
				avh    :{w:200, h: 60},
				avs    :{w: 60, h: 60},
				bgc    :{w:360, h:200, x:0, y:0},
				bgl    :{w:211, h:200, x:0, y:0},
				bgr    :{w:211, h:200, x:0, y:0}
			}
		}, options);
		
		var $avv  = [];
		var $avh  = [];
		var $avs  = [];
		var scrollTop = 0;
		var offsetTop = 0;

		// 背景画像配置
		var allocateBG = function(){
			var c = settings.pos.cont;
			var p = settings.pos;
			//高さ700px未満の場合は背景雲を配置しない
			if(c.h<700){
				p.bgc.w=0;
				p.bgc.h=0;
				p.bgl.w=0;
				p.bgl.h=0;
				p.bgr.w=0;
				p.bgr.h=0;
				return;
			}
			
			//left
			p.bgl.x = 0;
			p.bgl.y = getRand(100, c.h);
			createImg('bgl')
				.css({'left':p.bgl.x, 'top':p.bgl.y})
				.prependTo(settings.container);
			
			//right
			p.bgr.x = c.w - p.bgr.w;
			p.bgr.y = getRand(100, c.h);
			createImg('bgr')
				.css({'left':p.bgr.x, 'top':p.bgr.y})
				.prependTo(settings.container);
			
			//高さ800px未満の場合は背景中央雲を配置しない
			if(c.h<800){
				p.bgc.w=0;
				p.bgc.h=0;
				return;
			}
			//center
			p.bgc.x = getRand(p.bgl.w, c.w-p.bgr.w-p.bgc.w);
			p.bgc.y = getRand(200, c.h);
			createImg('bgc')
				.css({'left':p.bgc.x, 'top':p.bgc.y})
				.prependTo(settings.container);
		};
		
		// 縦移動キャラ配置
		var allocateAVV = function(){
//console.log(getImgName('avv'));
			// スクロール量更新
			scrollTop = $(window).scrollTop();
			$avv.push(
				createImg('avv')
					.attr('id', 'avv'+new Date().getTime())
					.css(getPos('avv'))
					.prependTo(settings.container)
			);
			if($avv.length>=3){
				$avv.shift().remove();
			}
		};
		
		// 横移動キャラ配置
		var allocateAVH = function(){
//console.log(getImgName('avh'));
			$avh.push(
				createImg('avh')
					.attr('id', 'avh'+new Date().getTime())
					.css(getPos('avh'))
					.prependTo(settings.container)
			);
			if($avh.length>=3){
				$avh.shift().remove();
			}
		};
		
		// 移動しないキャラ配置
		var allocateAVS = function(){
//console.log(getImgName('avs'));
			$avs.push(
				createImg('avs')
					.attr('id', 'avs'+new Date().getTime())
					.css(getPos('avv'))
					.prependTo(settings.container)
			);
			if($avs.length>=3){
				$avs.shift().remove();
			}
		};
		
		var getDir = function(g){
			// 背景雲
			if(g.slice(0,2)=='bg'){
				return settings.name.bgdir;
			}
			var ca = settings.category;
			var co = settings.count;
			
			// 単一カテゴリ固定
			if(ca!=''){
				ca = [settings.category, settings.category, 'common'][getRand(3)];
			// すべてのカテゴリからランダム
			}else{
				ca = settings.name.avdir[getRand(settings.name.avdir.length)];
			}
			co.avv = co._avv[ca];
			co.avl = co._avl[ca];
			co.avr = co._avr[ca];
			co.avs = co._avs[ca];
			return ca+'/';
		};
		
		
		// 配置座標計算
		var getPos = function(g){
			var p = {x:0, y:0};
			var b = settings.pos;
			var t = settings.pos[g];
			var x = settings.pos.cont.w - settings.pos[g].w;
			var y = settings.pos.cont.h - settings.pos[g].h;
			var r = function(a1, a2, b1, b2){
				var a = [a1, a1+a2];
				var b = [b1, b1+b2];
				if(a[0]<=b[0] && b[0]<=a[1]) return false;
				if(a[0]<=b[1] && b[1]<=a[1]) return false;
				return true;
			};
			var tp= function(){
				return ((scrollTop-offsetTop)<0)? 0: scrollTop-offsetTop;
			};
			
			// 縦移動キャラX座標
			var vx = [
				-3, -2, -1, 0, 1, 2, 
				570, 571, 572, 573, 574, 575, 
				933, 934, 935, 936, 937, 938
			];
			
			// コンテンツフッタ上
			if(settings.type!='background'){
				return {'left':getRand(x), 'bottom':-6};
			}
			
			// コンテンツ背景
			var i=0;
			while(true){
				i++;
				if(i>=10){
					return {'display':'none'};
				}
				if(g=='avv' || g=='avs'){
					p.x = vx[getRand(vx.length-1)];
				}else{
					p.x = getRand(x);
				}
				p.y = getRand(tp(), y);
			
				//left
				if(!r(b.bgl.x, b.bgl.w, p.x, t.w)){
					if(!r(b.bgl.y, b.bgl.h, p.y, t.h)){
						continue;
					}
				}
				
				//right
				if(!r(b.bgr.x, b.bgr.w, p.x, t.w)){
					if(!r(b.bgr.y, b.bgr.h, p.y, t.h)){
						continue;
					}
				}
				
				//center
				if(!r(b.bgc.x, b.bgc.w, p.x, t.w)){
					if(!r(b.bgc.y, b.bgc.h, p.y, t.h)){
						continue;
					}
				}
				break;
			}
			return {'left':p.x, 'top':p.y};
		};
		
		// 画像jqueryオブジェクト生成
		var createImg = function(g){
			return $('<img>')
				.addClass(settings.name.cls)
				.attr('src', getImgName(g));
		};
		
		// 画像名取得
		var getImgName = function(g){
			var s = settings.name;
			// 左右移動をランダムで選ぶ
			if(g=='avh'){
				g = s[g][getRand(2)];
			}
			// ディレクトリ設定
			s.dir = getDir(g);
			
			return [
				settings.path,
				s.rootdir,
				s.dir,
				s[g],
				('000' + getRand(settings.count[g]).toString()).slice(-3),
				s.suffix
			].join('');
		};
		
		// ランダムな整数取得
		var getRand = function(){
			var min = (arguments.length!=2)? 0: arguments[0];
			var max = (arguments.length!=2)? arguments[0]: arguments[1];
			return Math.floor( Math.random() * (max-min) ) + min;
		};
		
		// 初期化
		return this.each(function(){
			if($.browser.msie) settings.interval = settings.interval*1.5;
			
			// コンテナサイズ取得
			settings.container  = $(this);
			settings.pos.cont.w = $(this).attr('offsetWidth');
			settings.pos.cont.h = $(this).attr('offsetHeight') - settings.pos.cont.b;
			
			// 画像パス取得
			var t = 'javascripts/jquery.fujitvci.js';
			settings.path = $('script[src$='+t+']').attr('src').replace(t,'');
			
			// コンテンツ背景
			if(settings.type=='background'){
				offsetTop  = $(this).offset().top;
				
				// 背景配置
				allocateBG();
				
				// gifアニメ配置
				var avvTimer = setInterval(allocateAVV, settings.interval);
				setTimeout(function(){
					var avhTimer = setInterval( allocateAVH, settings.interval*2);
				}, settings.interval/2);
				
			// コンテンツフッタ上
			}else{
				// gifアニメ配置
				var gavhTimer = setInterval(allocateAVH, settings.interval*1.25);
				setTimeout(function(){
					var gavsTimer = setInterval( allocateAVS, settings.interval*10);
				}, settings.interval/2);
			}
		});
	};

	// コンテンツフッタFlash遅延ロード
	$.fn.lazyEmbed = function(options){
		if($(this).length!=1) return this;
		
		var settings = $.extend({
			callback :null
		}, options);
		
		// 表示領域の高さを更新
		var onResize = function(){
			wh = document.documentElement.clientHeight;
			observe();
		};
		
		// ウィンドウスクロール位置を更新
		var onScroll = function(){
			ws = $(window).scrollTop();
			observe();
		};
		
		// 表示位置に達していたらコールバック実行
		var observe = function(){
			if(ct<=(ws + wh + sp)){
				settings.callback.apply();
				$(window)
					.unbind('resize', onResize)
					.unbind('scroll', onScroll);
				return true;
			}
			return false;
		};
		
		// 初期化
		return this.each(function(){
			ct = $(this).offset().top;
			wh = document.documentElement.clientHeight;
			ws = $(window).scrollTop();
			sp = 100;
			if(observe()) return;
			// リサイズとスクロール監視用にイベントバインド
			$(window)
				.bind('resize', onResize)
				.bind('scroll', onScroll);
		});
	};
})(jQuery);

