/**
 * levi.jp
 * 2011.08.03 17:17
 */
if (!window.LeviScript) var LeviScript = function(){};

//Index 定義
LeviScript.Index = function(){
	this.initialize.apply(this, arguments);
};

//Prototype
LeviScript.Index.prototype = {
	////////////////////////////////////////////////// 初期設定
	settings: {
		JsonFeed: {
			MainVisual :  {URL: 'http://blog.levi.jp/bnr/mainvisual.js',    CB: 'jsonFeedMainVisual',   LOADED: false}, 
			MainBanner :  {URL: 'http://blog.levi.jp/bnr/mainbanner.js',    CB: 'jsonFeedMainBanner',   LOADED: false}, 
			SubBanner :   {URL: 'http://blog.levi.jp/bnr/subbanner.js',     CB: 'jsonFeedSubBanner',    LOADED: false}
		}, 
		
		CategoryIcon: {
			CAMPAIGN :    '<img src="/images/shared/cat_campaign.png" alt="CAMPAIGN">',
			PRODUCT :     '<img src="/images/shared/cat_product.png" alt="PRODUCT">',
			NEWS :        '<img src="/images/shared/cat_news.png" alt="NEWS">',
			EVENT :       '<img src="/images/shared/cat_event.png" alt="EVENT">',
			MOVIE :       '<img src="/images/shared/cat_movie.png" alt="MOVIE">',
			MAGAZINE :    '<img src="/images/shared/cat_magazine.png" alt="MAGAZINE">'
		}, 
		
		slctr_gFooter:              '#gFooter', 
		slctr_articleIndex:    	    '#articleIndex', 
		slctr_articleIndexInner:    '#articleIndexInner', 
		slctr_articleIndexDoor:     '#articleIndexDoor', 
		slctr_mainWrapper:          '#articleIndexInner div.mainWrapper', 
		slctr_mainVisual:           '#mainVisual', 
		slctr_flexcroll:            '.flexcroll', 
		
		Consts: {
			gHeader_H: 73, 
			gFooter_H: 53, 
			articleIndexClosed_H: 240, 
			subLi_H: 130, 
			
			newIconDay: 24 * 7, 
			newIconImg: '<img src="/images/shared/new.png" alt="NEW">', 
			
			btnOpenImg: '<img src="/images/shared/articleindex_open.png" alt="OPEN">', 
			btnCloseImg: '<img src="/images/shared/articleindex_close.png" alt="CLOSE">'
			
		}, 
		
		OpeningDelay: 1500, 
		
		DataObj: null, 
		Items: []
	}, 
	//
	Elements: {
		gFooter: null, 
		articleIndex: null, 
		articleIndexInner: null, 
		articleIndexDoor: null, 
		mainWrapper: null, 
		mainVisual: null, 
		flexcroll: null, 
		
		
		window: null, 
		body: null
	}, 
	
	IsInit: false, 
	IsLoadedMain: false, 
	IsOpenSub: false, 
	
	MyScroll: null, 
	IsAndroid: (/android/gi).test(navigator.appVersion), 
	IsIDevice: (/iphone|ipad|android/gi).test(navigator.appVersion),
	OrientationChangeDelay: 0, 
	
	Now: new Date().getTime(), 
	
	Window_H: 0,
	Window_W: 0,
	Body_H: 0,
	Body_W: 0,
	
	////////////////////////////////////////////////// 以上　初期設定
	
	
	//------------------------------------------------ 初期化時実行 [1]
	initialize: function(options) {
		var self = this;
		
		//オプション設定
		if ( options ) {
			$.extend( this.settings, options );
		}
        
		//エレメント設定
		$.extend( this.Elements, {
			gFooter: $(this.settings.slctr_gFooter), 
			articleIndex: $(this.settings.slctr_articleIndex), 
			articleIndexInner: $(this.settings.slctr_articleIndexInner), 
			articleIndexDoor: $(this.settings.slctr_articleIndexDoor), 
			mainWrapper: $(this.settings.slctr_mainWrapper), 
			mainVisual: $(this.settings.slctr_mainVisual), 
			flexcroll: $(this.settings.slctr_flexcroll), 
			
			window: $(window), 
			body: $("body")
		});
		
		//その他
		this.Window_H = this.Elements.window.height();
		this.Window_W = this.Elements.window.width();
		this.Body_H = this.Elements.body.height();
		this.Body_W = this.Elements.body.width();
		if(this.IsAndroid){
			this.OrientationChangeDelay = 400;
		}
		
		//CSS OVER RIDE
		this.Elements.gFooter.css("z-index", 50);
		this.Elements.articleIndexInner.css("padding-top", 11);
		
		//
		//this.Elements.mainVisual.hide();
		this.Elements.articleIndex.hide();
		
		//MainVisual をロード
		this.loadJson('MainVisual');
	}, 
	
	//------------------------------------------------ JSON読み込み [1]
	loadJson : function(_key) {
		var self = this;
		var my_obj = this.settings.JsonFeed[_key];
		
		var my_url = my_obj.URL + "?callback=?";
		jQuery.jsonp({
			url: my_url,
			callback: my_obj.CB,
			success: function(json) {
				self.settings.JsonFeed[_key].LOADED = true;
				if('self.parse' + _key){
					eval('self.parse' + _key + '(json)');
				}
			},
			error: function() {
			}
		});
	}, 
	
	//------------------------------------------------ 最初の設定完了時 [4]
	initComplete : function() {
		var self = this;
		
		//デバイス回転リスナー登録
		if (self.IsIDevice){
			window.addEventListener("orientationchange", function () {
				if (self.IsIDevice !== true) {
					return
				}
				self.orientationChangeCore();
			}, false);
		}
		
		//リサイズリスナー登録
		this.Elements.window.bind("resize", function(){
			if (self.IsIDevice === true) {
				return;
			}
			self.resizeHandler();
		});
		this.resizeHandler();
		
		//this.opening();
		
		if(!this.IsIDevice){
			this.Elements.articleIndex.show();
		}
		
		this.setOpenBtn();
	}, 
	opening : function() {
		var self = this;
		if (this.IsIDevice){
			this.openingIDevice();
		}else{
			this.openingPC();
		}
	}, 
	openingIDevice : function() {
		var self = this;
		
		if(this.IsLoadedMain && !this.IsInit){
			this.IsInit = true;
			this.Elements.articleIndex.css({'top':this.getFooterPosition().top}).show().animate(
				{
					'top': self.getArticleIndexPosition().top
				}, 
				{ 
					duration: 1000, 
					easing: 'easeOutExpo', 
					complete: function(){
						self.resizeHandler();
					}
				}
			);
		}
		
	}, 
	openingPC : function() {
		var self = this;
		
		if(this.IsLoadedMain && !this.IsInit){
			this.IsInit = true;
			this.Elements.articleIndex.css({'top':this.getArticleIndexPosition(true).top}).show().delay(500).animate(
				{
					'top': self.getFooterPosition().top - this.Elements.articleIndexDoor.height()
				}, 
				{ 
					duration: 500, 
					easing: 'easeOutExpo', 
					complete: function(){
						self.resizeHandler();
					}
				}
			);
		}
		
	}, 
	
	//------------------------------------------------ オープンボタン設定 [5]
	setOpenBtn : function() {
		var self = this;
		
		this.Elements.articleIndexDoor.css('cursor', 'pointer');
		this.Elements.articleIndexDoor.bind("click", function(){
			self.triggerSubBanner();
		});
	}, 
	//
	triggerSubBanner : function() {
		var self = this;
		
		//SubBanner をロード
		if(!self.settings.JsonFeed['SubBanner'].LOADED){
			this.loadJson('SubBanner');
		}else{
			this.toggleSubBanner();
		}
	}, 
	//
	toggleSubBanner : function() {
		var self = this;
		
		this.IsOpenSub =! this.IsOpenSub;
		//console.log("IsOpenSub : " + this.IsOpenSub);
		
		/*if(self.IsOpenSub){
			this.Elements.flexcroll.hide();
		}else{
			this.Elements.flexcroll.show();
		}*/
		
		this.updateSubbannerArea();
		
		this.Elements.articleIndex.animate(
			{
				'top': self.getArticleIndexPosition().top, 
				'height': self.getArticleIndexPosition().height
			}, 
			{ 
				duration: 1000, 
				easing: 'easeOutExpo', 
				complete: function(){
					if(self.IsOpenSub){
						//self.Elements.flexcroll.show();
						self.Elements.articleIndexDoor.html(self.settings.Consts.btnCloseImg);
					}else{
						//self.Elements.flexcroll.hide();
						self.Elements.articleIndexDoor.html(self.settings.Consts.btnOpenImg);
					}
					self.resizeHandler();
				}
			}
		);
	}, 
	
	//------------------------------------------------ JSON解析 [3]
	//MainVisual
	parseMainVisual : function(jsonData)
	{
		var self = this;
		var image_len = 0;
		var loaded_count = 0;
		
		$(jsonData).each(function(i){
			//var mainVisual = '<img class="visual" src="'+this.img+'" alt="">';
			//self.Elements.mainVisual.append(mainVisual);
			
			var mainVisualImage = new Image();
			mainVisualImage.onload = function(){
				var mainVisual = '<img class="visual" src="'+this.src+'" alt="">';
				self.Elements.mainVisual.append(mainVisual);
				mainVisualImage = null;
				
				loaded_count++;
				if(loaded_count >= image_len){
					self.setMainVisual();
				}
			};
			mainVisualImage.src = this.img;
			image_len++;
		})
		
		//MainBanner をロード
		this.loadJson('MainBanner');
	}, 
	setMainVisual : function()
	{
		var self = this;
		this.IsLoadedMain = true;
		
		//maximage
		$(this.settings.slctr_mainVisual + ' > img.visual').maxImage({
			//isBackground: true,
			//slideShow: true,
			//position: ('absolute'),
			//slideDelay: 8, 
			//slideShowTitle: false,
			//maxFollows: 'height'
			isBackground: true,
			slideShow: true,
			position: ('absolute'),
			verticalAlign: 'top',
			horizontalAlign:'right',
			slideDelay: 8, 
			slideShowTitle: false,
			maxFollows: 'height'
		});
		
		setTimeout(function () {
			self.opening();
		}, this.settings.OpeningDelay);
	}, 
	//MainBanner
	parseMainBanner : function(jsonData)
	{
		var self = this;
		
		$(jsonData).each(function(i){
			var mainBannerImage = '<p class="image"><a href="'+this.link_url+'" target='+this.link_target+'><img src="'+this.img+'" alt="'+this.title+'"></a></p>\n';
			var mainBannerTitle = '<h2>'+this.title+'</h2>\n';
			if(this.category != ''){
				var mainBannerCategory = self.getCategoryIcon(this.category)+'\n';
			}else{
				var mainBannerCategory = '';
			}
			var mainBannerDate = '<p class="date">_'+self.getUpdateHtml(this.date)+'</p>\n';
			$(self.settings.slctr_articleIndexInner + ' ul.main').append('<li>\n'+mainBannerImage+mainBannerTitle+mainBannerCategory+mainBannerDate+'</li>\n');
		});
		
		//最初の設定完了
		this.initComplete();
	}, 
	//SubBanner
	parseSubBanner : function(jsonData)
	{
		var self = this;
		
		$(jsonData).each(function(i){
			var subBannerImage = '<p class="image"><a href="'+this.link_url+'" target='+this.link_target+'><img src="'+this.img+'" alt="'+this.title+'"></a></p>\n';
			var subBannerTitle = '<h2>'+this.title+'</h2>\n';
			if(this.category != ''){
				var subBannerCategory = self.getCategoryIcon(this.category)+'\n';
			}else{
				var subBannerCategory = '';
			}
			var subBannerDate = '<p class="date">_'+self.getUpdateHtml(this.date)+'</p>\n';
			$(self.settings.slctr_articleIndexInner + ' ul.sub').append('<li>\n'+subBannerImage+subBannerTitle+subBannerCategory+subBannerDate+'</li>\n');
		});
		
		this.setScroll();
		this.toggleSubBanner();
	}, 
	//------------------------------------------------ カテゴリーアイコン取得
	getCategoryIcon : function(_category) {
		var self = this;
		
		var categoryIconHtml = '';
		var categoryName = _category.split(",");
		$.each(categoryName,function(i){
			var my_category = categoryName[i];
			if(self.settings.CategoryIcon[my_category]){
				categoryIconHtml += self.settings.CategoryIcon[my_category];
			}
		});
		
		if(categoryIconHtml != ''){
			categoryIconHtml = '<p class="category">' + categoryIconHtml + '</p>'
		}
		
		return categoryIconHtml;
	}, 
	//------------------------------------------------ New判別
	getUpdateHtml : function(_date) {
		var self = this;
		
		var newIconHtml = _date;
		
		var my_update_array = _date.split('-');
		var my_update_date_array = my_update_array[0].split('.');
		var my_update_time_array = my_update_array[1].split(':');
		var my_update = new Date(my_update_date_array[0], my_update_date_array[1]-1, my_update_date_array[2], my_update_time_array[0], my_update_time_array[1]);
		
		var now = (my_update.getTime() - this.Now)/(60*60*1000); 
		now = Math.ceil(now);
		if(-now <= self.settings.Consts.newIconDay){
			newIconHtml += self.settings.Consts.newIconImg;
		}
		
		//console.log("Now : " + this.Now + "\nnow = " + now + "\nConstsnewIconDay : " + self.settings.Consts.newIconDay);
		
		return newIconHtml;
	}, 
	
	
	//------------------------------------------------ ArticleIndex のポジション取得
	getArticleIndexPosition : function(_opening) {
		
		var base_height = this.Body_H;
		//var base_height = this.Window_H;
		var btn_height = this.Elements.articleIndexDoor.height();
		
		if(this.Window_H >= this.Body_H){
			base_height = this.Window_H;
		}
		
		if(this.IsOpenSub){
			return {
				//top: this.settings.Consts.gHeader_H - btn_height - 1, 
				top: this.settings.Consts.gHeader_H - btn_height, 
				height: base_height - this.settings.Consts.gHeader_H - this.settings.Consts.gFooter_H + btn_height
			};
		}else{
			
			if (this.IsIDevice || _opening || !this.IsInit){
				return {
					top: base_height - this.settings.Consts.articleIndexClosed_H - this.settings.Consts.gHeader_H + btn_height, 
					height: this.settings.Consts.articleIndexClosed_H
				};
			}else{
				return {
					top: base_height - this.settings.Consts.gHeader_H - btn_height + 20, 
					height: this.settings.Consts.articleIndexClosed_H
				};
			}
			
		}
	}, 
	
	//------------------------------------------------ Footer のポジション取得
	getFooterPosition : function() {
		
		if(this.Window_H >= this.Body_H){
			return {
				top: this.Window_H - this.settings.Consts.gFooter_H
			};
		}else{
			return {
				top: this.Body_H - this.settings.Consts.gFooter_H
			};
		}
	}, 
	
	//------------------------------------------------ スクロール設定
	setScroll: function() {
		var self = this;
		
		if(window.fleXenv){
			window.fleXenv.initByClass("flexcroll");
			if(this.settings.isIDevice){
				this.Elements.flexcroll.bind('touchmove', function(e){ e.preventDefault(); });
			}
		}else{
			//
		}
	}, 
	//------------------------------------------------ サブバナーエリア更新
	updateSubbannerArea : function() {
		
		this.Elements.flexcroll.css({
			"height": this.getFlexcrollPosition().height
		});
		
		if(window.fleXenv){
			window.fleXenv.updateScrollBars();
		}
	}, 
	//------------------------------------------------ flexcroll のポジション取得
	getFlexcrollPosition : function() {
		var base_height = this.Body_H;
		var articleIndex_height = this.getArticleIndexPosition().height;
		var btn_height = this.Elements.articleIndexDoor.height();
		var mainWrapper_height = this.Elements.mainWrapper.height();
		if(this.Window_H >= this.Body_H){
			base_height = this.Window_H;
		}
		
		//var flexcroll_height = this.settings.Consts.articleIndexClosed_H;
		//var flexcroll_height = articleIndex_height - btn_height - mainWrapper_height - this.settings.Consts.gFooter_H - 20;
		var flexcroll_height = articleIndex_height - btn_height - mainWrapper_height - this.settings.Consts.gFooter_H + 12;
		var flexcroll_max_height = this.settings.Consts.subLi_H * 3;
		//flexcroll_height = flexcroll_height > flexcroll_max_height ? flexcroll_max_height : flexcroll_height;
		
		return {
			height: flexcroll_height
		};
	}, 
	
	//------------------------------------------------ デバイス回転時
	orientationChangeCore: function() {
		var self = this;
		
		setTimeout(function () {
			self.resizeHandler();
		}, self.OrientationChangeDelay);
	}, 
	//------------------------------------------------ リサイズ
	resizeHandler: function() {
		var self = this;
		var footerPosition;
		var articleIndexPosition;
		
		this.Window_W = this.Elements.window.width();
		this.Window_H = this.Elements.window.height();
		this.Body_W = this.Elements.body.width();
		this.Body_H = this.Elements.body.height();
		
		//console.log("WINDOW : W = " + this.Window_W + " H = " + this.Window_H);
		//console.log("BODY : W = " + this.Body_W + " H = " + this.Body_H);
		
		
		this.Elements.gFooter.css("top", this.getFooterPosition().top);
		this.Elements.articleIndex.css({
			"top": self.getArticleIndexPosition().top, 
			"height": self.getArticleIndexPosition().height
		});
		
		this.updateSubbannerArea();
	}
};

var chkjsID;
function chkjsFunc(){
	if(jQuery.jsonp) {
		clearInterval(chkjsID);
		var leviscript = new LeviScript.Index();
	}else {
		return false;
	}
}
jQuery(document).ready(function(){
	chkjsID = setInterval(chkjsFunc, 100);
});

