/**
 * 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 $adTama = [];
        var $adMan = [];
	var $adTalk = [];
        
		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-300);
			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);
		};
		
		// 縦移動キャラ配置
		var allocateAVV = function(){
			// スクロール量更新
			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 allocateCarAVH = function(type){
            var s = settings.name;
			
            var imgPath = [
                settings.path,
                s.rootdir,
                'ad/obj_car',
                type,
                s.suffix
            ].join('');
            
            var bPos = ( type == 1 ) ? 13 : 0;
            var cssPos = {'left':0, 'bottom':bPos};
            
            $('<img>')
				.addClass(settings.name.cls)
				.attr('src', imgPath)
                .attr('id', 'avh'+new Date().getTime())
                .css(cssPos)
                .prependTo(settings.container)
		};
        
        
        
        
        //「くす玉」配置
        var allocateTama = function(){
            var s = settings.name;
			var pos = {'left':580, 'top':0};
            var fileName = 'ad/obj_tama';
            
            var imgPath = [
                settings.path,
                s.rootdir,
                fileName,
                //type,
                s.suffix
            ].join('');
            
            $adTama.push(
                $('<img>')
                    .addClass(settings.name.cls)
                    .attr('src', imgPath)
                    .attr('id', 'avh'+new Date().getTime())
                    .css(pos)
                    .prependTo(settings.container)
            );
            if( $adTama.length>=2){
                $adTama.shift().remove();
            }
		};
        

	var allocateTalk = function() {
	    var s = settings.name;
	    var tTop = $('#fujitvcicontainerad').position().top;
	    var posY = ( $('#bottom_banner').offset().top > 1580 ) ? 1630 : 1330;
	    var pos = {'left':250, 'top':posY+tTop, 'z-index':2};
            var fileName = 'ad/ci_fukidashi';

            
            var maxNum = 0;
            var fileNum = getRand(maxNum).toString();
            var adTag = '#fujitvcicontainerad';
            
            var imgPath = [
                settings.path,
                s.rootdir,
                fileName,
                fileNum,
                s.suffix
            ].join('');
            

	    if($adTalk.length>=1)$adTalk.shift().remove();			
           
            
            $adTalk.push(
                $('<img>')
                    .addClass(settings.name.cls)
                    .attr('src', imgPath )
                    .attr('id', 'talk'+new Date().getTime())
                    .css(pos)
                    //.prependTo(settings.container)
                    .prependTo(adTag)//settings.container)
            );
	}
        



        //広告用人配置
        var allocateAdMan = function(){
            var s = settings.name;
	    var pos = {'left':587, 'top':100, 'width':28};
            var fileName = 'ad/ci_anime';
            var longType = ( $('#bottom_banner').offset().top > 1580 ) ? '_l' : '';
            
            var maxNum = 0;
            var fileNum = getRand(maxNum).toString();
            var adTag = '#fujitvcicontainerad';
            
            var imgPath = [
                settings.path,
                s.rootdir,
                fileName,
                fileNum,
                longType,
                s.suffix
            ].join('');
            

             if($adMan.length>=1)$adMan.shift().remove();			
            
            $adMan.push(
                $('<img>')
                    .addClass(settings.name.cls)
                    .attr('src', imgPath )
                    .attr('id', 'avh'+new Date().getTime())
                    .css(pos)
                    //.prependTo(settings.container)
                    .prependTo(adTag)//settings.container)
            );
            
	    //$(adTag).css( "z-index", 10 );
	};
        
		
	
		
		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, 
				933, 934, 935, 936, 937, 938
			];
            
            
			
			// コンテンツフッタ上
			if(settings.type!='background'){
				return {'left':0, 'bottom':0};
			}
			
			// コンテンツ背景
			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);
			
            if(g=='car_avh'){
                //return 'images_ci/ad/obj_car1.gif';
                return [
                    settings.path,
                    s.rootdir,
                    'ad/obj_car',
                    getRand(2).toString(),
                    s.suffix
                ].join('');
            }
            
			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_ad.js';
			settings.path = $('script[src$='+t+']').attr('src').replace(t,'');
			
			// コンテンツ背景
			if(settings.type=='background'){
				offsetTop  = $(this).offset().top;
				
				// 背景配置
				allocateBG();
		
//var avvTimer = setInterval(allocateAVV, settings.interval);
				//setTimeout(function(){
					//var avhTimer = setInterval( allocateAVH, settings.interval*2);
				//}, settings.interval/2);

	                //＊＊広告用gifアニメ配置＊＊

			var talkOffset = 12000;
			var interval = 15000;
			if($.browser.msie) {
				talkOffset *= 1.5;
				interval *= 1.5;
			}

			setTimeout( function() {
				allocateAdMan();
			        setTimeout( function() { allocateTalk(); }, talkOffset );

				setInterval( function() {
					allocateAdMan();
					if($adTalk.length>=1)$adTalk.shift().remove();
				        setTimeout( function() { allocateTalk(); }, talkOffset );			
				}, interval );
			}, 3000 );			

		// コンテンツフッタ上
			}else{
		                //＊＊広告用gifアニメ配置＊＊ 
				

		                setTimeout(function() {
		                    allocateCarAVH(0);
		                }, getRand(3000) );
		                setTimeout(function() {
		                    allocateCarAVH(1);
		                }, 3000 + getRand(3000) );
					}
				});
	};

	// コンテンツフッタ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);

