var ikimono;
if(!ikimono) ikimono = {};

/**
 * 基本設定です
 */

ikimono.Settings = {
	//各パス
	IMAGE_PATH:'/sp/2010/ikimonosyashin/album/images/photos',
	XML_PATH:'/sp/2010/ikimonosyashin/album/xml/ikimono_data.xml',
	CONTENT_PATH:'/course/seiha/autumn.html',
	
	//待ち時間（秒）
	WAIT_TIME:2.0,
	
	//画像配置枠
	IMAGE_CONTAINER_WIDTH:170,
	IMAGE_CONTAINER_HEIGHT:110
}

/**
 * メインクラスです
 */
 
ikimono.Main = function(){
	this.loader;
	this.nextData;
	this.randomNumItr;
	this.nextImage;
	this.loadFirstTime = true;
	this.waitTimer;
};
ikimono.Main.prototype = {
	init:function(){
		this.loader = new ikimono.Loader();
		var self = this;
		this.loader.load(function(){ self.xmlLoadCompleteHD(); });
	},
	xmlLoadCompleteHD:function(){
		var _datas = ikimono.Datas.instance();
		this.randomNumItr = new ikimono.RandomNumIterator(_datas.totalCount);
		this.setRandomData();
	},
	setRandomData:function(){
		var _datas = ikimono.Datas.instance();
		this.nextData = _datas.getDataAt(this.randomNumItr.next());
		var path = ikimono.Settings.IMAGE_PATH + '/' + this.nextData.filename;
		var self = this;
		this.nextImage = this.loadImage(path, function(){ self.loadImageCompleteHD() });
	},
	loadImage:function(path, callback){
		var image = new Image();
		$(image).load(function(){
			var iw = ikimono.Settings.IMAGE_CONTAINER_WIDTH;
			var ih = ikimono.Settings.IMAGE_CONTAINER_HEIGHT;
			
			//ここの処理はサムネイル画像にさしかわったときになくす
			var ratio1 = iw / this.width;
			var ratio2 = ih / this.height;
			var setW, setH;
			if((this.width > this.height) && (this.height * ratio1 < ih)){
				setW = iw;
				setH = Math.floor(this.height * ratio1);
			}else{
				setW = this.width * ratio2;
				setH = ih;
			}
			this.width = setW;
			this.height = setH;
			//---------------------------------------------------
			$(this).css({
				position: 'absolute',
				left: Math.floor((iw - setW) / 2),
				top: Math.floor((ih - setH) / 2)
			});
			callback();
		});
		image.src = path; //load
		return image;
	},
	loadImageCompleteHD:function(){
		//初回はフェードアウト＋タイマーをカット
		if(this.loadFirstTime){
			this.loadFirstTime = false;
			$('#ikimono_banner_dynamic_space').hide();
			this.appendData();
		}else{
			clearInterval(this.waitTimer);
			var self = this;
			this.waitTimer =  setInterval(
								function(){ self.fadeOutData(); }, 
								ikimono.Settings.WAIT_TIME * 1000);
		}
	},
	fadeOutData:function(){
		clearInterval(this.waitTimer);
		var self = this;
		$('#ikimono_banner_dynamic_space')
			.fadeOut('fast', function(){ self.fadeOutCompleteHD(); });
	},
	fadeOutCompleteHD:function(){
		$('#ikimono_photo_container').remove();
		$('#ikimono_banner_name_area').remove();
		this.appendData();
	},
	appendData:function(){
		$('#ikimono_banner_dynamic_space').append('<div id="ikimono_photo_container"></div><div id="ikimono_banner_name_area"></div>');
		$('#ikimono_photo_container').append(this.nextImage);
		$('#ikimono_photo_container img').wrap('<a href="' + ikimono.Settings.CONTENT_PATH + '" />');
		var nameHTML = '<p><a href="' + ikimono.Settings.CONTENT_PATH + '">' + this.nextData.handle + '<br />' +this.nextData.area + '</a></p>';
		$('#ikimono_banner_name_area').append(nameHTML);
		$('#ikimono_banner_dynamic_space').fadeIn('slow');
		this.setRandomData();
	}
}
 
/**
 * xmlをロードします
 */

ikimono.Loader = function(){
	this.xmlData;
	this.callback;
};
ikimono.Loader.prototype = {
	load:function(callback){
		this.callback = callback;
		var path = ikimono.Settings.XML_PATH + '?' + (new Date()).getTime();
		var self = this;
		$.get(path, function(data){
			self.xmlData = data;
			self.parseXML();
		});
	},
	parseXML:function(){
		var _datas = ikimono.Datas.instance();
		var data;
		$(this.xmlData).find('data').each(function(){
			var jdata = $(this);
			data = new ikimono.Data();
			data.id = jdata.find('id').text();
			data.handle = jdata.find('handle').text();
			data.area = jdata.find('area').text();
			data.filename = jdata.find('filename').text();
			_datas.add(data);
		});
		this.callback();
	}
}

/**
 * すべての投稿データが入ります
 */

ikimono.Datas = function(){
	this.datas = [];
	this.totalCount = 0;
};
//シングルトン用
ikimono.Datas._instance;
ikimono.Datas.instance = function(){
	if(!ikimono.Datas._instance){
		ikimono.Datas._instance = new ikimono.Datas();
	}
	return ikimono.Datas._instance;
};
ikimono.Datas.prototype = {
	add:function(data){
		this.datas.push(data);
		this.totalCount++;
	},
	//@param index 0からはじまるインデックス番号
	getDataAt:function(index){
		return this.datas[index];
	}
}

/**
 * 1つ分の投稿データです
 */

ikimono.Data = function(){
	this.id;
	this.handle;
	this.area;
	this.filename;
};

/**
 * ランダムな数を次々と取り出します
 */

ikimono.RandomNumIterator = function(total){
	this.total = total;
	this.data;
	this.reset();
};
ikimono.RandomNumIterator.prototype = {
	next:function(){
		var no = Math.floor(Math.random() * this.data.length);
		var randomNo = this.data[no];
		this.data.splice(no, 1);
		if(this.data.length == 0){
			this.reset();
		}
		return randomNo;
	},
	reset:function(){
		this.data = [];
		for(var i = 0; i < this.total; i++){
			this.data.push(parseInt(i));
		}
	}
}

/**
 * 初期化します
 */ 

$(function(){
	var main = new ikimono.Main();
	main.init();
});

function trace(str){
	if(!navigator.systemLanguage){
		console.log(str);
	}
}
