// JavaScript Document

/*==============================================*/
//特集自動作成.js
//2006/12/08	ver.0.1	作成開始（関東）
//2007/08/13	ver.0.1-ngo.0	関東のPGを元に作成開始（中部oshima）
//2007/08/13	ver.0.1-ngo.1	変更点	・料金はボトムのみ表示、料金と設定日を別々に出力
//										・直接記入のjsを別ファイルにjs/cheapest と common（中部oshima）
//2007/09/08	ver.0.1-ngo.2	top用に出力の表記と参照先を変更（oshima）
/*==============================================*/

/*---------------------------------*/
/* 設定 */
/*---------------------------------*/

//配列から重複を削除
Array.prototype.only = function(){
	var len=this.length;
	var cnt=0;
	var list={};
	var end=[];
	for(var i = 0; i < len; i++){
		if(!list[this[i]]){
			end[cnt++] = this[i];
			list[this[i]] = true;
		}
	}
	return end;
}

/*=====================================*/
/* Sp class : Spページ作成クラス */
/*=====================================*/
var Sp = Class.create();
Sp.prototype = {
	initialize : function(){
	},
	getPriceRank : function(name){
		var json = new Json(name);
		json.getRank();
	},
	getMonthBottom : function(name){
	}
}

/*=====================================*/
/* Json class : jsonファイル取得クラス */
/*=====================================*/
var Json = Class.create();
Json.prototype = {
	initialize : function(name){
		this.name = name;
		var dateMs = new Date().getTime();
		//jsonデータの相対的な位置を間違えないよう注意
		this.path = 'json/' + name + '.txt?' + dateMs;
	},
	getRank : function(){
		new Ajax.Request(
		this.path,
			{
				method : 'get',
				asynchronous : true,
				onSuccess : this.rank,
				onFailure : this.noReplay
			}
		)
	},
	rank : function(req){
		var fare = new FareList();
		var rowData = eval(req.responseText);
		for(var i = 0; i < rowData.length; i++){
			 fare.add(new AirFare(rowData[i]));
		}
		
		var tmpId = fare.list[0].page;
		var responceHtml = '';
		var responceHtml2 = '';
		var course = new Course(tmpId, fare.list[0].page, fare);
		//iをfor文でxまでまわせば、ボトムからx番目までの料金＆設定日が表示できる
		var i = 0;
		var res = course.getRank(i);
		
		if(res != ','){
			var fare = ((res[0] * 10) * 100).toString().replace(/([0-9]+?)(?=(?:[0-9]{3})+$)/g,'$1,');
			//日付作成
			var date = ''
			var tmpDate = '';
			for(var j = 0; j < res[1].length; j++){
				tmpDate += res[1][j];
				date += res[1][j];
				//30バイトで etc. と表記し終了
				if(tmpDate.length > 4){
					date += 'etc.';
					tmpDate = '';
					j = res[1].length - 1;
				}
				if(j != (res[1].length -1)){
					tmpDate += ',';
					date += ',';
				}
			}
			responceHtml += '<font color="red">' + fare + '</font>';
			responceHtml2 = '<span class="recommen-date">' + date + '</span>';
 		}
		//iをfor文でまわす場合、xxxにx-1の数字を入れる
		//if(i < xxx){
		//	responceHtml += '&nbsp;';
		//}
		//}
		var res = new Display(course.id, responceHtml);
		res.show();
		var res2 = new Display(course.id2, responceHtml2);
		res2.show();
	},
	noReplay : function(req){
		ResponceHtml = 'no data';
		var res = new Display(TargetId, ResponceHtml);
		res.show();
	},
	setRank : function(){
		TargetName = this.name;
		TargetId = this.id;
		TargetRank = this.target;
	},
	setMonth : function(){
		TargetName = this.name;
		TargetId = this.id;
		TargetMonth = this.target;
	}
}

/*=====================================*/
/* Cource class : 商品クラス */
/*=====================================*/
var Course = Class.create();
Course.prototype = {
	initialize : function(id, name, fare){
		this.id = id;
		this.id2 = id + '_d';
		this.name = name;
		this.fare = fare;
	},
	getRank : function(rank){
		var res = [];
		var ex = new Extraction(this.fare);
		res = ex.getRankFare(rank);
		return res;
	}
}

/*=====================================*/
/* Extraction class : 料金抽出クラス
/*=====================================*/
var Extraction = Class.create();
Extraction.prototype = {
	initialize : function(fare){
		this.fare = fare;
		this.minFare = fare.createMinFares();
		this.dayList = this.getDayList();
		this.fareElement = this.getFareElement()
	},
	getDayList : function(){
		var dayList = [];
		var start = [];
		start['y'] = Number(this.fare.list[0].startYear);
		start['m'] = Number(this.fare.list[0].startMonth);
		start['d'] = 1;
		var c = new Calendar(start['y'], start['m']);
		
		for(var i = 0; i < this.minFare.length; i++){
			var lastDay = c.getDays(start['y'], start['m']);
			if(start['d'] > lastDay){
				start['m'] += 1;
				start['d'] = 1;
				flg = 1;
				if(start['m'] > 12){
					start['y'] += 1;
					start['m'] -= 12;
				}
			}
			if(!this.minFare[i]){
				this.minFare[i] = 0;
			}
			dayList[i] = start['m'] + '/' + start['d'];
			start['d'] += 1;
		}
		return dayList;
	},
	getFareElement : function(){
		var fare = this.minFare.only();
		fare = fare.collect(function(value, index){
			if(value){
				return value;
			}
		});
		fare = fare.sort(function(x, y){return x - y});
		return fare;
	},
	getRankFare : function(rank){
		var res = [];
		var rankDays = [];
		var targetFare = this.fareElement[rank];
		for(var i = 0; i < this.minFare.length; i++){
			if(this.minFare[i] == targetFare){
				rankDays.push(this.dayList[i]);
			}
		}
		
		res = [targetFare, this.ajustDays(rankDays)];
		return res;
	},
	ajustDays : function(days){
		//日付が続いているなら連結する。
		var daysList = [];
		var tmpValue = '';
		var keep = 0;
		for(var i = 0; i < days.length; i++){
			//処理中の日付
			var tmp = days[i].split("/");
			var tM = tmp[0];
			var tD = tmp[1];
			
			//リストの最後でなければ、次の値を取得
			if(i != (days.length -1)){
				var next = days[i + 1].split("/");
				var nM = next[0];
				var nD = next[1];
			}
			
			//リストが空
			if(i == 0){
				if(this.checkKeep(tM, tD, nM, nD)){
					tmpValue = days[i] + '-';
					keep = 1;
				}else{
					tmpValue = days[i];
					daysList.push(tmpValue);
					tmpValue = '';
				}
			//keepされている
			}else if(keep){
				if(this.checkKeep(tM, tD, nM, nD)){
					continue;
				}else{
					tmpValue += tD;
					daysList.push(tmpValue);
					keep = 0;
					tmpValue = '';
				}
			}else{
				if(this.checkKeep(tM, tD, nM, nD)){
					tmpValue = days[i] + '-';
					keep = 1;
				}else{
					tmpValue = days[i];
					daysList.push(tmpValue);
					keep = 0;
					tmpValue = '';
				}
			}
		}
		return daysList;
	},
	checkKeep : function(tM, tD, nM, nD){
		if(tM == nM && Number(nD) == (Number(tD) + 1)){
			return 1;
		}else{
			return 0;
		}
	}
}
