/**
 * timetable.js | radiko.jp javascript file
 */

// 現在のカラーテーマ
var currentTheme = 'color_blue';
// 現在のエリア
var areaId = '';
// 現在の番組表表示モード
var currentMode = 'today';
// 本日の番組表リスト
var todayEpgs = {};
var todayEpgsSort = [];
// 明日の番組表リスト
var tomorrowEpgs = {};
var tomorrowEpgsSort = [];

// HTMLの読み込みが完了した時点の処理
$(document).ready(function() {
	// エリア取得
	areaId = $("#area span").attr("class");
	$("body").addClass(areaId);
	// 番組表取得
	loadEpg();
	// 明日の番組表を隠す
	$("#tt_tomorrow").hide();
	// テーマを設定
	currentTheme = getTheme();
	$("body").addClass(currentTheme);
	// カラーテーマ変更チェック用タイマー
	setInterval(checkThemeCallback,300);
	// タブ設定
	var now = $.exDate();
	// 5時より前ならば前の日扱い
	if(now.getHours()<5) now.setTime(now.getTime()-86400000);
	// 本日の番組表
	$("#today_link")
		.text(now.toChar("mm月dd日")+"("+jpDay(now.getDay())+")")
		.click(function() {
			currentMode = 'today';
			if(!$(this).hasClass("active"))
				$(this).addClass("active");
			$("#tomorrow_link").removeClass("active");
			$("#tt_tomorrow").hide();
			$("#tt_today").show();
			if(todayEpgsSort.length==0)
				loadEpg();
			else
				renderEpg();
			appendLog("timetable.gif?day=today");
			return false;
		})
		.addClass("active");
	// 明日の番組表
	now.setTime(now.getTime()+86400000);
	$("#tomorrow_link")
		.text(now.toChar("mm月dd日")+"("+jpDay(now.getDay())+")")
		.click(function() {
			currentMode = 'tomorrow';
			if(!$(this).hasClass("active"))
				$(this).addClass("active");
			$("#today_link").removeClass("active");
			$("#tt_today").hide();
			$("#tt_tomorrow").show();
			if(tomorrowEpgsSort.length==0)
				loadEpg();
			else
				renderEpg();
			appendLog("timetable.gif?day=tomorrow");
			return false;
		});
	appendLog("timetable.gif?day=today");
});

// 番組表を読み込み
var loadEpg = function() {
	$.ajax({
		dataType: 'xml',
		url: '/epg/newepg/epgapi.php?area_id='+areaId+'&mode='+currentMode,
		beforeSend: function(xhr) {
			xhr.setRequestHeader("Pragma", "no-cache");
			xhr.setRequestHeader("Cache-Control", "no-cache");
			xhr.setRequestHeader("Expires", "Thu, 01 Jan 1970 00:00:00 GMT");
		},
		complete: function(xhr, textStatus) {
			// 読み込みに失敗した場合は3秒後にリトライ
			if(textStatus=='error') {
				loadStationsTimer = setTimeout(loadStations,3000);
			}
		},
		success: function(xml) {
			if(currentMode!='tomorrow') {
				todayEpgs = {}; todayEpgsSort = [];
			} else {
				tomorrowEpgs = {}; tomorrowEpgsSort = [];
			}
			$.each($("station",$(xml)),function() {
				var station = {name:$(this).attr("id"),progs:[]};
				$.each($("prog",$(this)),function() {
					station.progs.push({
						title: $("title",$(this)).text(),
						description: $("desc",$(this)).text(),
						pfm: $("pfm",$(this)).text(),
						url: $("url",$(this)).text(),
						fromtime: $(this).attr("ft"),
						totime: $(this).attr("to"),
						fromtimeLabel: $(this).attr("ftl"),
						totimeLabel: $(this).attr("tol"),
						duration: $(this).attr("dur")
					});
				});
				if(currentMode!='tomorrow') {
					todayEpgs[station.name] = station;
					todayEpgsSort.push(station.name);
				} else {
					tomorrowEpgs[station.name] = station;
					tomorrowEpgsSort.push(station.name);
				}
			});
			renderEpg();
		}
	});
};

var renderEpg = function() {
	// canvas
	var canvas = $("#tt_"+currentMode).empty();
	// create wrapper
	var headUl = $("<ul/>").attr("id",canvas.attr("id")+"_header").addClass("epg_header").addClass("clearfix").appendTo(canvas);
	var contentUl = $("<ul/>").attr("id",canvas.attr("id")+"_content").addClass("epg_content").addClass("clearfix").appendTo(canvas);
	var footUl = $("<ul/>").attr("id",canvas.attr("id")+"_footer").addClass("epg_footer").addClass("clearfix").appendTo(canvas);
	// get data
	var epgs = (currentMode!='tomorrow'?todayEpgs:tomorrowEpgs);
	var epgsSort = (currentMode!='tomorrow'?todayEpgsSort:tomorrowEpgsSort);
	// create timetable label
	$("<li/>").addClass("label").append("<ul id=\"timetable_"+canvas.attr("id")+"_label\"></ul>").appendTo(contentUl);
	var heights = [];
	for(var i=5; i<=28; i++) {
		$("#timetable_"+canvas.attr("id")+"_label").append("<li class=\"tt_"+i+"\">"+i+"</li>");
		heights[i] = 20;
	}
	$.each(epgsSort,function(i,station) {
		if(epgs[station]) {
			// header
			var hLi = $("<li/>").addClass("station_"+i).append("<img src=\"http://radiko-dl.ssdl1.smartstream.ne.jp/radiko-dl/station/logo/"+station+"/logo_xsmall.png\" alt=\""+epgs[station].name+"\" width=\""+(areaId=='JP13'?94:108)+"\" height=\"50\" style=\"behavior:url(/static/js/iepngfix.htc);\"/>").appendTo(headUl);
			$("<a/>").addClass("on_air_now").attr("href","#").click(function(){openPlayer("#"+station);return false;}).appendTo(hLi);
			var programs = epgs[station].progs;
			// content
			$("<li/>").addClass("col").addClass("station_"+i).append("<ul id=\"timetable_"+canvas.attr("id")+"_"+station+"\"></ul>").appendTo(contentUl);
			for(var j=5; j<=28; j++)
				$("#timetable_"+canvas.attr("id")+"_"+station).append("<li class=\"tt_"+j+"\"></li>");
			$.each(programs,function(j,prog) {
				var from = prog.fromtimeLabel.split('');
				var hour = (from[0]==0?'':from[0])+from[1];
				if(hour<5) hour = 5;
				var wrap = $(".tt_"+hour,$("#timetable_"+canvas.attr("id")+"_"+station));
				var duration = '';
				if(from.length==4)
					duration = from[0] + from[1] + ':' + from[2] + from[3];
				var to = prog.totimeLabel.split('');
				if(to.length==4) {
					duration += '-' + to[0] + to[1] + ':' + to[2] + to[3];
				}
				var progP = $("<p/>").addClass("prog").appendTo(wrap);
				// current check
				if(currentMode=='today') {
					var rfrom = $.exDate(prog.fromtime+'00','yyyymmddhhmiss');
					var rto = $.exDate(prog.totime+'00','yyyymmddhhmiss');
					var now = new Date();
					if(rfrom.getTime()<=now.getTime() && rto.getTime()>=now.getTime()) {
						progP.addClass("current");
					}
				}
				progP.append("<p class=\"duration\">"+duration+"</p>");
				if(prog.url=='') {
					progP.append("<h3 class=\"title\">"+prog.title+"</h3>");
				} else {
					progP.append("<h3 class=\"title\"><a href=\""+prog.url+"\" target=\"_blank\">"+prog.title+"</a></h3>");
				}
				if(prog.pfm!='')
					progP.append("<p class=\"performer\">"+prog.pfm+"</p>");
			});
			for(var n=5; n<=28; n++) {
				var wrap = $(".tt_"+n,$("#timetable_"+canvas.attr("id")+"_"+station));
				if(heights[n]<wrap.height())
					heights[n] = wrap.height();
			}
			// footer
			var fLi = $("<li/>").addClass("station_"+i).append("<img src=\"http://radiko-dl.ssdl1.smartstream.ne.jp/radiko-dl/station/logo/"+station+"/logo_xsmall.png\" alt=\""+epgs[station].name+"\" width=\""+(areaId=='JP13'?94:108)+"\" height=\"50\" style=\"behavior:url(/static/js/iepngfix.htc);\"/>").appendTo(footUl);
			$("<a/>").addClass("on_air_now").attr("href","#").click(function(){openPlayer("#"+station);return false;}).appendTo(fLi);
		}
	});
	var ch = 0;
	var hour = (new Date()).getHours();
	if(hour<5) hour += 24;
	for(var n=5; n<=28; n++) {
		$(".tt_"+n,canvas).each(function() {
			$(this).css("height",heights[n]+"px");
		});
		if(currentMode=='today' && hour==n) {
			contentUl.scrollTo(ch,{duration:1000});
		}
		ch += heights[n];
	}
};

// プレイヤーを別ウィンドウで開く
var openPlayer = function(station_id) {
	// ステーションIDが設定されていなかった場合は処理しない
	if(station_id && station_id!='#') {
		station_id = station_id.replace("#","");
		window.open(
				"/player/player.html#"+station_id,
				"radiko_player",
				"width=248,height=679,menubar=no,toolbar=no,scrollbars=no,resizable=no"
			);
	}
};

//クッキーを取得
var getCookie = function(name) {
	var cookieArray = document.cookie.split(";");
	var value = "";
	for(var i=0; i<cookieArray.length; i++) {
		var pair = cookieArray[i].split("=");
		if(pair.length!=2)
			continue;
		if(pair[0].replace(/(^\s+)|(\s+$)/g, "")==name) {
			value = pair[1].replace(/(^\s+)|(\s+$)/g, "");
			break;
		}
	}
	return value;
};

//cookieからカラーテーマを取得
var getTheme = function() {
	var cookieArray = document.cookie.split(";");
	var aTheme = getCookie("style");
	if(aTheme=="")
		aTheme = "color_blue";
	return aTheme;
};

//テーマを取得するタイマーコールバック
var checkThemeCallback = function() {
	var aTheme = getTheme();
	if(currentTheme!=aTheme) {
		// assign new theme
		$("body").removeClass(currentTheme);
		$("body").addClass(aTheme);
		currentTheme = aTheme;
	}
};

// 曜日を日本語で取得
var jpDay = function(day) {
	var str = '';
	switch(day) {
		case 0: str = "日"; break;
		case 1: str = "月"; break;
		case 2: str = "火"; break;
		case 3: str = "水"; break;
		case 4: str = "木"; break;
		case 5: str = "金"; break;
		case 6: str = "土"; break;
	}
	return str;
}

var appendLog = function(message) {
	if($("#log").size()==0)
		$("<div/>").attr("id","log").appendTo("body");
	var logsrv = "http://log.radiko.jp";
	var rnd = (new Date()).getTime();
	if(/\?/.test(message))
		message += "&amp;rnd=" + rnd;
	else
		message += "?rnd=" + rnd;
	$("#log").append("<img src=\""+logsrv+"/"+message+"\" alt=\"\">");
};


